[
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\nlfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry\ncustom: ['https://nilaoda.github.io/N_m3u8DL-CLI/source/images/alipay.png','https://www.buymeacoffee.com/nilaoda']\n"
  },
  {
    "path": ".github/workflows/build_latest.yml",
    "content": "name: Build_Latest\n \non: [push]\n \njobs:\n  build:\n \n    runs-on: windows-latest\n \n    steps:\n    - uses: actions/checkout@v1\n      name: Checkout Code\n     \n    - name: Setup MSBuild Path\n      uses: warrenbuckley/Setup-MSBuild@v1\n      env:\n        ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'\n       \n    - name: Setup NuGet\n      uses: NuGet/setup-nuget@v1.0.2\n      env:\n        ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'\n     \n    - name: Restore NuGet Packages\n      run: nuget restore N_m3u8DL-CLI.sln\n \n    - name: Build \n      run: msbuild N_m3u8DL-CLI.sln /p:Configuration=Release /p:DebugSymbols=false /p:DebugType=None\n \n    - name: Upload Artifact\n      uses: actions/upload-artifact@v1.0.0\n      with:\n        name: N_m3u8DL-CLI_latest\n        path: N_m3u8DL-CLI\\bin\\Release\\N_m3u8DL-CLI.exe\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# DNX\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n#*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 nilaoda\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "N_m3u8DL-CLI/App.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <startup> \n        \n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\"/></startup>\n</configuration>\n"
  },
  {
    "path": "N_m3u8DL-CLI/CSChaCha20.cs",
    "content": "﻿/*\n * Copyright (c) 2015, 2018 Scott Bennett\n *           (c) 2018-2021 Kaarlo Räihä\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\nusing System;\nusing System.IO;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Runtime.CompilerServices; // For MethodImplOptions.AggressiveInlining\n\nnamespace CSChaCha20\n{\n    /// <summary>\n    /// Class that can be used for ChaCha20 encryption / decryption\n    /// </summary>\n    public sealed class ChaCha20 : IDisposable\n    {\n        /// <summary>\n        /// Only allowed key lenght in bytes\n        /// </summary>\n        public const int allowedKeyLength = 32;\n\n        /// <summary>\n        /// Only allowed nonce lenght in bytes\n        /// </summary>\n        public const int allowedNonceLength = 12;\n\n        /// <summary>\n        /// How many bytes are processed per loop\n        /// </summary>\n        public const int processBytesAtTime = 64;\n\n        private const int stateLength = 16;\n\n        /// <summary>\n        /// The ChaCha20 state (aka \"context\")\n        /// </summary>\n        private readonly uint[] state = new uint[stateLength];\n\n        /// <summary>\n        /// Determines if the objects in this class have been disposed of. Set to true by the Dispose() method.\n        /// </summary>\n        private bool isDisposed = false;\n\n        /// <summary>\n        /// Set up a new ChaCha20 state. The lengths of the given parameters are checked before encryption happens.\n        /// </summary>\n        /// <remarks>\n        /// See <a href=\"https://tools.ietf.org/html/rfc7539#page-10\">ChaCha20 Spec Section 2.4</a> for a detailed description of the inputs.\n        /// </remarks>\n        /// <param name=\"key\">\n        /// A 32-byte (256-bit) key, treated as a concatenation of eight 32-bit little-endian integers\n        /// </param>\n        /// <param name=\"nonce\">\n        /// A 12-byte (96-bit) nonce, treated as a concatenation of three 32-bit little-endian integers\n        /// </param>\n        /// <param name=\"counter\">\n        /// A 4-byte (32-bit) block counter, treated as a 32-bit little-endian integer\n        /// </param>\n        public ChaCha20(byte[] key, byte[] nonce, uint counter)\n        {\n            this.KeySetup(key);\n            this.IvSetup(nonce, counter);\n        }\n\n#if NET6_0_OR_GREATER\n\n\t\t/// <summary>\n\t\t/// Set up a new ChaCha20 state. The lengths of the given parameters are checked before encryption happens.\n\t\t/// </summary>\n\t\t/// <remarks>\n\t\t/// See <a href=\"https://tools.ietf.org/html/rfc7539#page-10\">ChaCha20 Spec Section 2.4</a> for a detailed description of the inputs.\n\t\t/// </remarks>\n\t\t/// <param name=\"key\">A 32-byte (256-bit) key, treated as a concatenation of eight 32-bit little-endian integers</param>\n\t\t/// <param name=\"nonce\">A 12-byte (96-bit) nonce, treated as a concatenation of three 32-bit little-endian integers</param>\n\t\t/// <param name=\"counter\">A 4-byte (32-bit) block counter, treated as a 32-bit little-endian integer</param>\n\t\tpublic ChaCha20(ReadOnlySpan<byte> key, ReadOnlySpan<byte> nonce, uint counter) \n\t\t{\n\t\t\tthis.KeySetup(key.ToArray());\n\t\t\tthis.IvSetup(nonce.ToArray(), counter);\n\t\t}\n\n#endif // NET6_0_OR_GREATER\n\n        /// <summary>\n        /// The ChaCha20 state (aka \"context\"). Read-Only.\n        /// </summary>\n        public uint[] State\n        {\n            get\n            {\n                return this.state;\n            }\n        }\n\n\n        // These are the same constants defined in the reference implementation.\n        // http://cr.yp.to/streamciphers/timings/estreambench/submissions/salsa20/chacha8/ref/chacha.c\n        private static readonly byte[] sigma = Encoding.ASCII.GetBytes(\"expand 32-byte k\");\n        private static readonly byte[] tau = Encoding.ASCII.GetBytes(\"expand 16-byte k\");\n\n        /// <summary>\n        /// Set up the ChaCha state with the given key. A 32-byte key is required and enforced.\n        /// </summary>\n        /// <param name=\"key\">\n        /// A 32-byte (256-bit) key, treated as a concatenation of eight 32-bit little-endian integers\n        /// </param>\n        private void KeySetup(byte[] key)\n        {\n            if (key == null)\n            {\n                throw new ArgumentNullException(\"Key is null\");\n            }\n\n            if (key.Length != allowedKeyLength)\n            {\n                throw new ArgumentException($\"Key length must be {allowedKeyLength}. Actual: {key.Length}\");\n            }\n\n            state[4] = Util.U8To32Little(key, 0);\n            state[5] = Util.U8To32Little(key, 4);\n            state[6] = Util.U8To32Little(key, 8);\n            state[7] = Util.U8To32Little(key, 12);\n\n            byte[] constants = (key.Length == allowedKeyLength) ? sigma : tau;\n            int keyIndex = key.Length - 16;\n\n            state[8] = Util.U8To32Little(key, keyIndex + 0);\n            state[9] = Util.U8To32Little(key, keyIndex + 4);\n            state[10] = Util.U8To32Little(key, keyIndex + 8);\n            state[11] = Util.U8To32Little(key, keyIndex + 12);\n\n            state[0] = Util.U8To32Little(constants, 0);\n            state[1] = Util.U8To32Little(constants, 4);\n            state[2] = Util.U8To32Little(constants, 8);\n            state[3] = Util.U8To32Little(constants, 12);\n        }\n\n        /// <summary>\n        /// Set up the ChaCha state with the given nonce (aka Initialization Vector or IV) and block counter. A 12-byte nonce and a 4-byte counter are required.\n        /// </summary>\n        /// <param name=\"nonce\">\n        /// A 12-byte (96-bit) nonce, treated as a concatenation of three 32-bit little-endian integers\n        /// </param>\n        /// <param name=\"counter\">\n        /// A 4-byte (32-bit) block counter, treated as a 32-bit little-endian integer\n        /// </param>\n        private void IvSetup(byte[] nonce, uint counter)\n        {\n            if (nonce == null)\n            {\n                // There has already been some state set up. Clear it before exiting.\n                Dispose();\n                throw new ArgumentNullException(\"Nonce is null\");\n            }\n\n            if (nonce.Length != allowedNonceLength)\n            {\n                // There has already been some state set up. Clear it before exiting.\n                Dispose();\n                throw new ArgumentException($\"Nonce length must be {allowedNonceLength}. Actual: {nonce.Length}\");\n            }\n\n            state[12] = counter;\n            state[13] = Util.U8To32Little(nonce, 0);\n            state[14] = Util.U8To32Little(nonce, 4);\n            state[15] = Util.U8To32Little(nonce, 8);\n        }\n\n\n        #region Encryption methods\n\n        /// <summary>\n        /// Encrypt arbitrary-length byte array (input), writing the resulting byte array to preallocated output buffer.\n        /// </summary>\n        /// <remarks>Since this is symmetric operation, it doesn't really matter if you use Encrypt or Decrypt method</remarks>\n        /// <param name=\"output\">Output byte array, must have enough bytes</param>\n        /// <param name=\"input\">Input byte array</param>\n        /// <param name=\"numBytes\">Number of bytes to encrypt</param>\n        public void EncryptBytes(byte[] output, byte[] input, int numBytes)\n        {\n            this.WorkBytes(output, input, numBytes);\n        }\n\n        /// <summary>\n        /// Encrypt arbitrary-length byte stream (input), writing the resulting bytes to another stream (output)\n        /// </summary>\n        /// <param name=\"output\">Output stream</param>\n        /// <param name=\"input\">Input stream</param>\n        /// <param name=\"howManyBytesToProcessAtTime\">How many bytes to read and write at time, default is 1024</param>\n        public void EncryptStream(Stream output, Stream input, int howManyBytesToProcessAtTime = 1024)\n        {\n            this.WorkStreams(output, input, howManyBytesToProcessAtTime);\n        }\n\n        /// <summary>\n        /// Async encrypt arbitrary-length byte stream (input), writing the resulting bytes to another stream (output)\n        /// </summary>\n        /// <param name=\"output\">Output stream</param>\n        /// <param name=\"input\">Input stream</param>\n        /// <param name=\"howManyBytesToProcessAtTime\">How many bytes to read and write at time, default is 1024</param>\n        public async Task EncryptStreamAsync(Stream output, Stream input, int howManyBytesToProcessAtTime = 1024)\n        {\n            await this.WorkStreamsAsync(output, input, howManyBytesToProcessAtTime);\n        }\n\n        /// <summary>\n        /// Encrypt arbitrary-length byte array (input), writing the resulting byte array to preallocated output buffer.\n        /// </summary>\n        /// <remarks>Since this is symmetric operation, it doesn't really matter if you use Encrypt or Decrypt method</remarks>\n        /// <param name=\"output\">Output byte array, must have enough bytes</param>\n        /// <param name=\"input\">Input byte array</param>\n        public void EncryptBytes(byte[] output, byte[] input)\n        {\n            this.WorkBytes(output, input, input.Length);\n        }\n\n        /// <summary>\n        /// Encrypt arbitrary-length byte array (input), writing the resulting byte array that is allocated by method.\n        /// </summary>\n        /// <remarks>Since this is symmetric operation, it doesn't really matter if you use Encrypt or Decrypt method</remarks>\n        /// <param name=\"input\">Input byte array</param>\n        /// <param name=\"numBytes\">Number of bytes to encrypt</param>\n        /// <returns>Byte array that contains encrypted bytes</returns>\n        public byte[] EncryptBytes(byte[] input, int numBytes)\n        {\n            byte[] returnArray = new byte[numBytes];\n            this.WorkBytes(returnArray, input, numBytes);\n            return returnArray;\n        }\n\n        /// <summary>\n        /// Encrypt arbitrary-length byte array (input), writing the resulting byte array that is allocated by method.\n        /// </summary>\n        /// <remarks>Since this is symmetric operation, it doesn't really matter if you use Encrypt or Decrypt method</remarks>\n        /// <param name=\"input\">Input byte array</param>\n        /// <returns>Byte array that contains encrypted bytes</returns>\n        public byte[] EncryptBytes(byte[] input)\n        {\n            byte[] returnArray = new byte[input.Length];\n            this.WorkBytes(returnArray, input, input.Length);\n            return returnArray;\n        }\n\n        /// <summary>\n        /// Encrypt string as UTF8 byte array, returns byte array that is allocated by method.\n        /// </summary>\n        /// <remarks>Here you can NOT swap encrypt and decrypt methods, because of bytes-string transform</remarks>\n        /// <param name=\"input\">Input string</param>\n        /// <returns>Byte array that contains encrypted bytes</returns>\n        public byte[] EncryptString(string input)\n        {\n            byte[] utf8Bytes = System.Text.Encoding.UTF8.GetBytes(input);\n            byte[] returnArray = new byte[utf8Bytes.Length];\n\n            this.WorkBytes(returnArray, utf8Bytes, utf8Bytes.Length);\n            return returnArray;\n        }\n\n        #endregion // Encryption methods\n\n\n        #region // Decryption methods\n\n        /// <summary>\n        /// Decrypt arbitrary-length byte array (input), writing the resulting byte array to the output buffer.\n        /// </summary>\n        /// <remarks>Since this is symmetric operation, it doesn't really matter if you use Encrypt or Decrypt method</remarks>\n        /// <param name=\"output\">Output byte array</param>\n        /// <param name=\"input\">Input byte array</param>\n        /// <param name=\"numBytes\">Number of bytes to decrypt</param>\n        public void DecryptBytes(byte[] output, byte[] input, int numBytes)\n        {\n            this.WorkBytes(output, input, numBytes);\n        }\n\n        /// <summary>\n        /// Decrypt arbitrary-length byte stream (input), writing the resulting bytes to another stream (output)\n        /// </summary>\n        /// <param name=\"output\">Output stream</param>\n        /// <param name=\"input\">Input stream</param>\n        /// <param name=\"howManyBytesToProcessAtTime\">How many bytes to read and write at time, default is 1024</param>\n        public void DecryptStream(Stream output, Stream input, int howManyBytesToProcessAtTime = 1024)\n        {\n            this.WorkStreams(output, input, howManyBytesToProcessAtTime);\n        }\n\n        /// <summary>\n        /// Async decrypt arbitrary-length byte stream (input), writing the resulting bytes to another stream (output)\n        /// </summary>\n        /// <param name=\"output\">Output stream</param>\n        /// <param name=\"input\">Input stream</param>\n        /// <param name=\"howManyBytesToProcessAtTime\">How many bytes to read and write at time, default is 1024</param>\n        public async Task DecryptStreamAsync(Stream output, Stream input, int howManyBytesToProcessAtTime = 1024)\n        {\n            await this.WorkStreamsAsync(output, input, howManyBytesToProcessAtTime);\n        }\n\n        /// <summary>\n        /// Decrypt arbitrary-length byte array (input), writing the resulting byte array to preallocated output buffer.\n        /// </summary>\n        /// <remarks>Since this is symmetric operation, it doesn't really matter if you use Encrypt or Decrypt method</remarks>\n        /// <param name=\"output\">Output byte array, must have enough bytes</param>\n        /// <param name=\"input\">Input byte array</param>\n        public void DecryptBytes(byte[] output, byte[] input)\n        {\n            WorkBytes(output, input, input.Length);\n        }\n\n        /// <summary>\n        /// Decrypt arbitrary-length byte array (input), writing the resulting byte array that is allocated by method.\n        /// </summary>\n        /// <remarks>Since this is symmetric operation, it doesn't really matter if you use Encrypt or Decrypt method</remarks>\n        /// <param name=\"input\">Input byte array</param>\n        /// <param name=\"numBytes\">Number of bytes to encrypt</param>\n        /// <returns>Byte array that contains decrypted bytes</returns>\n        public byte[] DecryptBytes(byte[] input, int numBytes)\n        {\n            byte[] returnArray = new byte[numBytes];\n            WorkBytes(returnArray, input, numBytes);\n            return returnArray;\n        }\n\n        /// <summary>\n        /// Decrypt arbitrary-length byte array (input), writing the resulting byte array that is allocated by method.\n        /// </summary>\n        /// <remarks>Since this is symmetric operation, it doesn't really matter if you use Encrypt or Decrypt method</remarks>\n        /// <param name=\"input\">Input byte array</param>\n        /// <returns>Byte array that contains decrypted bytes</returns>\n        public byte[] DecryptBytes(byte[] input)\n        {\n            byte[] returnArray = new byte[input.Length];\n            WorkBytes(returnArray, input, input.Length);\n            return returnArray;\n        }\n\n        /// <summary>\n        /// Decrypt UTF8 byte array to string.\n        /// </summary>\n        /// <remarks>Here you can NOT swap encrypt and decrypt methods, because of bytes-string transform</remarks>\n        /// <param name=\"input\">Byte array</param>\n        /// <returns>Byte array that contains encrypted bytes</returns>\n        public string DecryptUTF8ByteArray(byte[] input)\n        {\n            byte[] tempArray = new byte[input.Length];\n\n            WorkBytes(tempArray, input, input.Length);\n            return System.Text.Encoding.UTF8.GetString(tempArray);\n        }\n\n        #endregion // Decryption methods\n\n        private void WorkStreams(Stream output, Stream input, int howManyBytesToProcessAtTime = 1024)\n        {\n            int readBytes;\n\n            byte[] inputBuffer = new byte[howManyBytesToProcessAtTime];\n            byte[] outputBuffer = new byte[howManyBytesToProcessAtTime];\n\n            while ((readBytes = input.Read(inputBuffer, 0, howManyBytesToProcessAtTime)) > 0)\n            {\n                // Encrypt or decrypt\n                WorkBytes(output: outputBuffer, input: inputBuffer, numBytes: readBytes);\n\n                // Write buffer\n                output.Write(outputBuffer, 0, readBytes);\n            }\n        }\n\n        private async Task WorkStreamsAsync(Stream output, Stream input, int howManyBytesToProcessAtTime = 1024)\n        {\n            byte[] readBytesBuffer = new byte[howManyBytesToProcessAtTime];\n            byte[] writeBytesBuffer = new byte[howManyBytesToProcessAtTime];\n            int howManyBytesWereRead = await input.ReadAsync(readBytesBuffer, 0, howManyBytesToProcessAtTime);\n\n            while (howManyBytesWereRead > 0)\n            {\n                // Encrypt or decrypt\n                WorkBytes(output: writeBytesBuffer, input: readBytesBuffer, numBytes: howManyBytesWereRead);\n\n                // Write\n                await output.WriteAsync(writeBytesBuffer, 0, howManyBytesWereRead);\n\n                // Read more\n                howManyBytesWereRead = await input.ReadAsync(readBytesBuffer, 0, howManyBytesToProcessAtTime);\n            }\n        }\n\n        /// <summary>\n        /// Encrypt or decrypt an arbitrary-length byte array (input), writing the resulting byte array to the output buffer. The number of bytes to read from the input buffer is determined by numBytes.\n        /// </summary>\n        /// <param name=\"output\">Output byte array</param>\n        /// <param name=\"input\">Input byte array</param>\n        /// <param name=\"numBytes\">How many bytes to process</param>\n        private void WorkBytes(byte[] output, byte[] input, int numBytes)\n        {\n            if (isDisposed)\n            {\n                throw new ObjectDisposedException(\"state\", \"The ChaCha state has been disposed\");\n            }\n\n            if (input == null)\n            {\n                throw new ArgumentNullException(\"input\", \"Input cannot be null\");\n            }\n\n            if (output == null)\n            {\n                throw new ArgumentNullException(\"output\", \"Output cannot be null\");\n            }\n\n            if (numBytes < 0 || numBytes > input.Length)\n            {\n                throw new ArgumentOutOfRangeException(\"numBytes\", \"The number of bytes to read must be between [0..input.Length]\");\n            }\n\n            if (output.Length < numBytes)\n            {\n                throw new ArgumentOutOfRangeException(\"output\", $\"Output byte array should be able to take at least {numBytes}\");\n            }\n\n            uint[] x = new uint[stateLength];    // Working buffer\n            byte[] tmp = new byte[processBytesAtTime];  // Temporary buffer\n            int offset = 0;\n\n            while (numBytes > 0)\n            {\n                // Copy state to working buffer\n                Buffer.BlockCopy(this.state, 0, x, 0, stateLength * sizeof(uint));\n\n                for (int i = 0; i < 10; i++)\n                {\n                    QuarterRound(x, 0, 4, 8, 12);\n                    QuarterRound(x, 1, 5, 9, 13);\n                    QuarterRound(x, 2, 6, 10, 14);\n                    QuarterRound(x, 3, 7, 11, 15);\n\n                    QuarterRound(x, 0, 5, 10, 15);\n                    QuarterRound(x, 1, 6, 11, 12);\n                    QuarterRound(x, 2, 7, 8, 13);\n                    QuarterRound(x, 3, 4, 9, 14);\n                }\n\n                for (int i = 0; i < stateLength; i++)\n                {\n                    Util.ToBytes(tmp, Util.Add(x[i], this.state[i]), 4 * i);\n                }\n\n                this.state[12] = Util.AddOne(state[12]);\n                if (this.state[12] <= 0)\n                {\n                    /* Stopping at 2^70 bytes per nonce is the user's responsibility */\n                    this.state[13] = Util.AddOne(state[13]);\n                }\n\n                // In case these are last bytes\n                if (numBytes <= processBytesAtTime)\n                {\n                    for (int i = 0; i < numBytes; i++)\n                    {\n                        output[i + offset] = (byte)(input[i + offset] ^ tmp[i]);\n                    }\n\n                    return;\n                }\n\n                for (int i = 0; i < processBytesAtTime; i++)\n                {\n                    output[i + offset] = (byte)(input[i + offset] ^ tmp[i]);\n                }\n\n                numBytes -= processBytesAtTime;\n                offset += processBytesAtTime;\n            }\n        }\n\n        /// <summary>\n        /// The ChaCha Quarter Round operation. It operates on four 32-bit unsigned integers within the given buffer at indices a, b, c, and d.\n        /// </summary>\n        /// <remarks>\n        /// The ChaCha state does not have four integer numbers: it has 16. So the quarter-round operation works on only four of them -- hence the name. Each quarter round operates on four predetermined numbers in the ChaCha state.\n        /// See <a href=\"https://tools.ietf.org/html/rfc7539#page-4\">ChaCha20 Spec Sections 2.1 - 2.2</a>.\n        /// </remarks>\n        /// <param name=\"x\">A ChaCha state (vector). Must contain 16 elements.</param>\n        /// <param name=\"a\">Index of the first number</param>\n        /// <param name=\"b\">Index of the second number</param>\n        /// <param name=\"c\">Index of the third number</param>\n        /// <param name=\"d\">Index of the fourth number</param>\n        private static void QuarterRound(uint[] x, uint a, uint b, uint c, uint d)\n        {\n            x[a] = Util.Add(x[a], x[b]);\n            x[d] = Util.Rotate(Util.XOr(x[d], x[a]), 16);\n\n            x[c] = Util.Add(x[c], x[d]);\n            x[b] = Util.Rotate(Util.XOr(x[b], x[c]), 12);\n\n            x[a] = Util.Add(x[a], x[b]);\n            x[d] = Util.Rotate(Util.XOr(x[d], x[a]), 8);\n\n            x[c] = Util.Add(x[c], x[d]);\n            x[b] = Util.Rotate(Util.XOr(x[b], x[c]), 7);\n        }\n\n        #region Destructor and Disposer\n\n        /// <summary>\n        /// Clear and dispose of the internal state. The finalizer is only called if Dispose() was never called on this cipher.\n        /// </summary>\n        ~ChaCha20()\n        {\n            Dispose(false);\n        }\n\n        /// <summary>\n        /// Clear and dispose of the internal state. Also request the GC not to call the finalizer, because all cleanup has been taken care of.\n        /// </summary>\n        public void Dispose()\n        {\n            Dispose(true);\n            /*\n\t\t\t * The Garbage Collector does not need to invoke the finalizer because Dispose(bool) has already done all the cleanup needed.\n\t\t\t */\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// This method should only be invoked from Dispose() or the finalizer. This handles the actual cleanup of the resources.\n        /// </summary>\n        /// <param name=\"disposing\">\n        /// Should be true if called by Dispose(); false if called by the finalizer\n        /// </param>\n        private void Dispose(bool disposing)\n        {\n            if (!isDisposed)\n            {\n                if (disposing)\n                {\n                    /* Cleanup managed objects by calling their Dispose() methods */\n                }\n\n                /* Cleanup any unmanaged objects here */\n                Array.Clear(state, 0, stateLength);\n            }\n\n            isDisposed = true;\n        }\n\n        #endregion // Destructor and Disposer\n    }\n\n    /// <summary>\n    /// Utilities that are used during compression\n    /// </summary>\n    public static class Util\n    {\n        /// <summary>\n        /// n-bit left rotation operation (towards the high bits) for 32-bit integers.\n        /// </summary>\n        /// <param name=\"v\"></param>\n        /// <param name=\"c\"></param>\n        /// <returns>The result of (v LEFTSHIFT c)</returns>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static uint Rotate(uint v, int c)\n        {\n            unchecked\n            {\n                return (v << c) | (v >> (32 - c));\n            }\n        }\n\n        /// <summary>\n        /// Unchecked integer exclusive or (XOR) operation.\n        /// </summary>\n        /// <param name=\"v\"></param>\n        /// <param name=\"w\"></param>\n        /// <returns>The result of (v XOR w)</returns>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static uint XOr(uint v, uint w)\n        {\n            return unchecked(v ^ w);\n        }\n\n        /// <summary>\n        /// Unchecked integer addition. The ChaCha spec defines certain operations to use 32-bit unsigned integer addition modulo 2^32.\n        /// </summary>\n        /// <remarks>\n        /// See <a href=\"https://tools.ietf.org/html/rfc7539#page-4\">ChaCha20 Spec Section 2.1</a>.\n        /// </remarks>\n        /// <param name=\"v\"></param>\n        /// <param name=\"w\"></param>\n        /// <returns>The result of (v + w) modulo 2^32</returns>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static uint Add(uint v, uint w)\n        {\n            return unchecked(v + w);\n        }\n\n        /// <summary>\n        /// Add 1 to the input parameter using unchecked integer addition. The ChaCha spec defines certain operations to use 32-bit unsigned integer addition modulo 2^32.\n        /// </summary>\n        /// <remarks>\n        /// See <a href=\"https://tools.ietf.org/html/rfc7539#page-4\">ChaCha20 Spec Section 2.1</a>.\n        /// </remarks>\n        /// <param name=\"v\"></param>\n        /// <returns>The result of (v + 1) modulo 2^32</returns>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static uint AddOne(uint v)\n        {\n            return unchecked(v + 1);\n        }\n\n        /// <summary>\n        /// Convert four bytes of the input buffer into an unsigned 32-bit integer, beginning at the inputOffset.\n        /// </summary>\n        /// <param name=\"p\"></param>\n        /// <param name=\"inputOffset\"></param>\n        /// <returns>An unsigned 32-bit integer</returns>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static uint U8To32Little(byte[] p, int inputOffset)\n        {\n            unchecked\n            {\n                return ((uint)p[inputOffset]\n                    | ((uint)p[inputOffset + 1] << 8)\n                    | ((uint)p[inputOffset + 2] << 16)\n                    | ((uint)p[inputOffset + 3] << 24));\n            }\n        }\n\n        /// <summary>\n        /// Serialize the input integer into the output buffer. The input integer will be split into 4 bytes and put into four sequential places in the output buffer, starting at the outputOffset.\n        /// </summary>\n        /// <param name=\"output\"></param>\n        /// <param name=\"input\"></param>\n        /// <param name=\"outputOffset\"></param>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void ToBytes(byte[] output, uint input, int outputOffset)\n        {\n            unchecked\n            {\n                output[outputOffset] = (byte)input;\n                output[outputOffset + 1] = (byte)(input >> 8);\n                output[outputOffset + 2] = (byte)(input >> 16);\n                output[outputOffset + 3] = (byte)(input >> 24);\n            }\n        }\n    }\n}"
  },
  {
    "path": "N_m3u8DL-CLI/Decode51CtoKey.cs",
    "content": "﻿using NiL.JS.BaseLibrary;\nusing NiL.JS.Core;\nusing NiL.JS.Extensions;\nusing System.Security.Cryptography;\nusing System.Text;\n\nnamespace N_m3u8DL_CLI\n{\n    /*\n     * js代码来自：https://static1.51ctocdn.cn/edu/player/h5/h5player.js line:9421\n     * \n     */\n    class Decode51CtoKey\n    {\n        private static string JS = @\"\nvar Base64={_keyStr:'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',encode:function(e){var t='';var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t='';var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\\+\\/\\=]/g,'');while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\\r\\n/g,'\\n');var t='';for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t='';var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}\n\nvar btoa = function(str) {\n    return Base64.encode(str);\n}\n\nvar bu = function (e, t) {\n    for (var r = t - (e += '').length; 0 < r; r--)\n        e = '0' + e;\n    return e\n}\n    ,\n    MD5 = function (e) {\n        var t, a = 0, n = 8;\n        function o(e, t, r, i, a, n) {\n            return g((s = g(g(t, e), g(i, n))) << a | s >>> 32 - a, r);\n            var s\n        }\n        function c(e, t, r, i, a, n, s) {\n            return o(t & r | ~t & i, e, t, a, n, s)\n        }\n        function h(e, t, r, i, a, n, s) {\n            return o(t & i | r & ~i, e, t, a, n, s)\n        }\n        function f(e, t, r, i, a, n, s) {\n            return o(t ^ r ^ i, e, t, a, n, s)\n        }\n        function p(e, t, r, i, a, n, s) {\n            return o(r ^ (t | ~i), e, t, a, n, s)\n        }\n        function g(e, t) {\n            var r = (65535 & e) + (65535 & t);\n            return (e >> 16) + (t >> 16) + (r >> 16) << 16 | 65535 & r\n        }\n        return function (e) {\n            for (var t = a ? '0123456789ABCDEF' : '0123456789abcdef', r = '', i = 0; i < 4 * e.length; i++)\n                r += t.charAt(e[i >> 2] >> i % 4 * 8 + 4 & 15) + t.charAt(e[i >> 2] >> i % 4 * 8 & 15);\n            return r\n        }(function (e, t) {\n            e[t >> 5] = e[t >> 5] | (128 << t % 32),\n                e[14 + (t + 64 >>> 9 << 4)] = t;\n            for (var r = 1732584193, i = -271733879, a = -1732584194, n = 271733878, s = 0; s < e.length; s += 16) {\n                var o = r\n                    , l = i\n                    , u = a\n                    , d = n;\n                i = p(i = p(i = p(i = p(i = f(i = f(i = f(i = f(i = h(i = h(i = h(i = h(i = c(i = c(i = c(i = c(i, a = c(a, n = c(n, r = c(r, i, a, n, e[s + 0], 7, -680876936), i, a, e[s + 1], 12, -389564586), r, i, e[s + 2], 17, 606105819), n, r, e[s + 3], 22, -1044525330), a = c(a, n = c(n, r = c(r, i, a, n, e[s + 4], 7, -176418897), i, a, e[s + 5], 12, 1200080426), r, i, e[s + 6], 17, -1473231341), n, r, e[s + 7], 22, -45705983), a = c(a, n = c(n, r = c(r, i, a, n, e[s + 8], 7, 1770035416), i, a, e[s + 9], 12, -1958414417), r, i, e[s + 10], 17, -42063), n, r, e[s + 11], 22, -1990404162), a = c(a, n = c(n, r = c(r, i, a, n, e[s + 12], 7, 1804603682), i, a, e[s + 13], 12, -40341101), r, i, e[s + 14], 17, -1502002290), n, r, e[s + 15], 22, 1236535329), a = h(a, n = h(n, r = h(r, i, a, n, e[s + 1], 5, -165796510), i, a, e[s + 6], 9, -1069501632), r, i, e[s + 11], 14, 643717713), n, r, e[s + 0], 20, -373897302), a = h(a, n = h(n, r = h(r, i, a, n, e[s + 5], 5, -701558691), i, a, e[s + 10], 9, 38016083), r, i, e[s + 15], 14, -660478335), n, r, e[s + 4], 20, -405537848), a = h(a, n = h(n, r = h(r, i, a, n, e[s + 9], 5, 568446438), i, a, e[s + 14], 9, -1019803690), r, i, e[s + 3], 14, -187363961), n, r, e[s + 8], 20, 1163531501), a = h(a, n = h(n, r = h(r, i, a, n, e[s + 13], 5, -1444681467), i, a, e[s + 2], 9, -51403784), r, i, e[s + 7], 14, 1735328473), n, r, e[s + 12], 20, -1926607734), a = f(a, n = f(n, r = f(r, i, a, n, e[s + 5], 4, -378558), i, a, e[s + 8], 11, -2022574463), r, i, e[s + 11], 16, 1839030562), n, r, e[s + 14], 23, -35309556), a = f(a, n = f(n, r = f(r, i, a, n, e[s + 1], 4, -1530992060), i, a, e[s + 4], 11, 1272893353), r, i, e[s + 7], 16, -155497632), n, r, e[s + 10], 23, -1094730640), a = f(a, n = f(n, r = f(r, i, a, n, e[s + 13], 4, 681279174), i, a, e[s + 0], 11, -358537222), r, i, e[s + 3], 16, -722521979), n, r, e[s + 6], 23, 76029189), a = f(a, n = f(n, r = f(r, i, a, n, e[s + 9], 4, -640364487), i, a, e[s + 12], 11, -421815835), r, i, e[s + 15], 16, 530742520), n, r, e[s + 2], 23, -995338651), a = p(a, n = p(n, r = p(r, i, a, n, e[s + 0], 6, -198630844), i, a, e[s + 7], 10, 1126891415), r, i, e[s + 14], 15, -1416354905), n, r, e[s + 5], 21, -57434055), a = p(a, n = p(n, r = p(r, i, a, n, e[s + 12], 6, 1700485571), i, a, e[s + 3], 10, -1894986606), r, i, e[s + 10], 15, -1051523), n, r, e[s + 1], 21, -2054922799), a = p(a, n = p(n, r = p(r, i, a, n, e[s + 8], 6, 1873313359), i, a, e[s + 15], 10, -30611744), r, i, e[s + 6], 15, -1560198380), n, r, e[s + 13], 21, 1309151649), a = p(a, n = p(n, r = p(r, i, a, n, e[s + 4], 6, -145523070), i, a, e[s + 11], 10, -1120210379), r, i, e[s + 2], 15, 718787259), n, r, e[s + 9], 21, -343485551),\n                    r = g(r, o),\n                    i = g(i, l),\n                    a = g(a, u),\n                    n = g(n, d)\n            }\n            return Array(r, i, a, n)\n        }(function (e) {\n            for (var t = Array(), r = (1 << n) - 1, i = 0; i < e.length * n; i += n)\n                t[i >> 5] = t[i >> 5] | ((e.charCodeAt(i / n) & r) << i % 32);\n            return t\n        }(t = e), t.length * n))\n    }\n    ,\n    eeb64 = function (e) {\n        for (var t = '', r = '', i = 0; i < e.length; i++)\n            t += bu('BqrCwxVefD9457mnoHINOPQRSUXLMabFcdghijyzkl6GApstuJKvW0YZ23ET81=_'.indexOf(e[i]).toString(2), 6);\n        for (t = t.substring(t.length % 8),\n            i = 0; i < Math.ceil(t.length / 8); i++)\n            r += String.fromCharCode(parseInt(t.substr(8 * i, 8), 2));\n        return base64decode(r)\n    }\n    ,\n    dec = function (e, t) {\n        function r(e) {\n            for (var t = 0; t < s.length; t++)\n                if (s[t] == e)\n                    return t\n        }\n        e[1];\n        var i = [o[r(e[13])], o[r(e[8])], o[r(e[4])]]\n            , a = e.substr(0, 1) + e.substr(2, 2) + e.substr(5, 3) + e.substr(9, 4) + e.substr(14);\n        debugger;var x = [r(e[13]),r(e[8]),r(e[4])]\n        for (var n in i)\n            a = i[n](a, t);\n        return a\n    }\n    ,\n    base64decode = function (e) {\n        var t, r, i, a, n, s, o, l = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);\n        for (s = e.length,\n            n = 0,\n            o = ''; n < s;) {\n            for (; t = l[255 & e.charCodeAt(n++)],\n                n < s && -1 == t;)\n                ;\n            if (-1 == t)\n                break;\n            for (; r = l[255 & e.charCodeAt(n++)],\n                n < s && -1 == r;)\n                ;\n            if (-1 == r)\n                break;\n            o += String.fromCharCode(t << 2 | (48 & r) >> 4);\n            do {\n                if (61 == (i = 255 & e.charCodeAt(n++)))\n                    return o;\n                i = l[i]\n            } while (n < s && -1 == i); if (-1 == i)\n                break;\n            o += String.fromCharCode((15 & r) << 4 | (60 & i) >> 2);\n            do {\n                if (61 == (a = 255 & e.charCodeAt(n++)))\n                    return o;\n                a = l[a]\n            } while (n < s && -1 == a); if (-1 == a)\n                break;\n            o += String.fromCharCode((3 & i) << 6 | a)\n        }\n        return o\n    }\n    ,\n    base64ToArrayBuffer = function (e) {\n        for (var t = atob(e), r = t.length, i = new Uint8Array(r), a = 0; a < r; a++)\n            i[a] = t.charCodeAt(a);\n        return i.buffer\n    }\n    ,\n    arrayBufferToBase64 = function (e) {\n        for (var t = '', r = new Uint8Array(e), i = r.byteLength, a = 0; a < i; a++)\n            t += String.fromCharCode(r[a]);\n        return btoa(t)\n    };\n\nvar s = ['s', 'i', 'y', 'u', 'a', 'n', 't', 'l', 'w', 'x']\n    , o = [function (e) {\n        return e\n    }\n        , function (e, t, r) {\n            r = r || 'eDu_51Cto_siyuanTlw';\n            for (var i = base64decode(e).split(''), a = MD5(t + r).toString(), n = a.length - 1; 0 <= n; n--) {\n                var s = a[n].charCodeAt() % (i.length - 1);\n                i.splice(s, 1)\n            }\n            return i.join('')\n        }\n        , function (e, t, r) {\n            for (var i = t % 7, a = e.length, n = '', s = 0; s < a / 2; s++) {\n                var o = 2 * s;\n                n += 0 == i || s % i == 0 ? e[o] + e[o + 1] : e[o + 1] ? e[o + 1] + e[o] : e[o]\n            }\n            var l = base64decode(n)\n                , u = (l.length - 1) / 2\n                , d = '';\n            for (s = 0; s < u; s++)\n                o = 2 * s,\n                    i < s && o++ ,\n                    d += s % 3 == 0 ? l[o] : l[o + 1];\n            return d\n        }\n        , function (e) {\n            return e\n        }\n        , function (e) {\n            return e\n        }\n        , function (e, t, r) {\n            var i, a, n, s, o, l, u, d = e.slice(0, 7) + e.slice(10, 12) + e.slice(15, -3), c = '', h = 0, f = 0, p = '';\n            d = d.split('').reverse().join(''),\n                i = eeb64(d),\n                a = parseInt(i.substr(0, 1)),\n                s = (n = i.slice(6, -3)).match(/^\\d*/),\n                o = n.match(/\\d*$/),\n                l = s[0],\n                u = o[0],\n                n = n.replace(/^\\d*/, '').replace(/\\d*$/, '');\n            for (var g = 0; g < u.length; g++)\n                c += bu(parseInt(u[g]).toString(2), 3);\n            for (c = c.substr(a),\n                g = 0; g < c.length; g++)\n                1 == c[g] ? (p += l[f],\n                    f++) : (p += n[h],\n                        h++);\n            return p\n        }\n        , function (e, t, r) {\n            for (var i, a = {\n                B: '0',\n                q: '1',\n                r: '2',\n                C: '3',\n                w: '4',\n                x: '5',\n                V: '6',\n                e: '7',\n                f: '8',\n                D: '9',\n                9: 'a',\n                4: 'b',\n                5: 'c',\n                7: 'd',\n                m: 'e',\n                n: 'f',\n                o: 'g',\n                H: 'h',\n                I: 'i',\n                N: 'j',\n                O: 'k',\n                P: 'l',\n                Q: 'm',\n                R: 'n',\n                S: 'o',\n                U: 'p',\n                X: 'q',\n                L: 'r',\n                M: 's',\n                a: 't',\n                b: 'u',\n                F: 'v',\n                c: 'w',\n                d: 'x',\n                g: 'y',\n                h: 'z',\n                i: 'A',\n                j: 'B',\n                y: 'C',\n                z: 'D',\n                k: 'E',\n                l: 'F',\n                6: 'G',\n                G: 'H',\n                A: 'I',\n                p: 'J',\n                s: 'K',\n                t: 'L',\n                u: 'M',\n                J: 'N',\n                K: 'O',\n                v: 'P',\n                W: 'Q',\n                0: 'R',\n                Y: 'S',\n                Z: 'T',\n                2: 'U',\n                3: 'V',\n                E: 'W',\n                T: 'X',\n                8: 'Y',\n                1: 'Z'\n            }, n = 5, s = '', o = 0, l = '', u = 0, d = 0; d < e.length; d++) {\n                var c = e[d];\n                s += a[c] ? a[c] : c\n            }\n            for (d = 0; d < 8; d++)\n                i = 7 == d ? 32 - u : Math.abs(8 - n++),\n                    l += s.substr(o++, 1),\n                    o += i,\n                    u += i;\n            return l += s.substr(40),\n                eeb64(l.split('').reverse().join(''))\n        }\n        , function (e, t, r) {\n            r = r || 'eDu_51Cto_siyuanTlw';\n            var i = eeb64(e)\n                , a = MD5(r + t).toString().slice(0, 16)\n                , n = i.indexOf(a)\n                , s = parseInt(i.slice(0, n), 16);\n            if (!n)\n                return !1;\n            var o = i.substr(16 + n);\n            return o.length == s && o\n        }\n    ];\n\nfunction getKey(text, lid) {\n    return btoa(dec(text, lid));\n}\";\n\n        private static string MD5Encoding(string rawPass)\n        {\n            MD5 md5 = MD5.Create();\n            byte[] bs = Encoding.UTF8.GetBytes(rawPass);\n            byte[] hs = md5.ComputeHash(bs);\n            StringBuilder sb = new StringBuilder();\n            foreach (byte b in hs)\n            {\n                sb.Append(b.ToString(\"x2\"));\n            }\n            return sb.ToString();\n        }\n\n        public static string GetDecodeKey(string encodeKey, string lid)\n        {\n            var context = new Context();\n            context.Eval(JS);\n            var concatFunction = context.GetVariable(\"getKey\").As<Function>();\n            string key = concatFunction.Call(new Arguments { encodeKey, lid }).ToString();\n            return key;\n        }\n\n        public static string GetSign(string lid)\n        {\n            var data = lid + \"eDu_51Cto_siyuanTlw\";\n            return MD5Encoding(data);\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/DecodeCdeledu.cs",
    "content": "﻿using NiL.JS.BaseLibrary;\nusing NiL.JS.Core;\nusing NiL.JS.Extensions;\nusing System;\nusing Array = System.Array;\n\nnamespace N_m3u8DL_CLI\n{\n    internal class DecodeCdeledu\n    {\n        private static string JS = @\"\nvar _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\nvar removePaddingChars = function(input) {\n    var lkey = _keyStr.indexOf(input.charAt(input.length - 1));\n    if (lkey == 64) {\n        return input.substring(0, input.length - 1);\n    }\n    return input;\n}\n\nvar base64Decode = function(input, arrayBuffer) {\n    input = removePaddingChars(input);\n    input = removePaddingChars(input);\n    var bytes = parseInt((input.length / 4) * 3, 10);\n    var uarray;\n    var chr1, chr2, chr3;\n    var enc1, enc2, enc3, enc4;\n    var i = 0;\n    var j = 0;\n    if (arrayBuffer) {\n        uarray = new Uint8Array(arrayBuffer);\n    } else {\n        uarray = new Uint8Array(bytes);\n    }\n    input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, '');\n    for (i = 0; i < bytes; i += 3) {\n        enc1 = _keyStr.indexOf(input.charAt(j++));\n        enc2 = _keyStr.indexOf(input.charAt(j++));\n        enc3 = _keyStr.indexOf(input.charAt(j++));\n        enc4 = _keyStr.indexOf(input.charAt(j++));\n        chr1 = (enc1 << 2) | (enc2 >> 4);\n        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n        chr3 = ((enc3 & 3) << 6) | enc4;\n        uarray[i] = chr1;\n        if (enc3 != 64)\n            uarray[i + 1] = chr2;\n        if (enc4 != 64)\n            uarray[i + 2] = chr3;\n    }\n    return uarray;\n}\n\nvar uint8ArrayToString = function(uDataArr) {\n    var arrStr = '';\n    for (var i = 0; i < uDataArr.length; i++) {\n        arrStr += String.fromCharCode(uDataArr[i]);\n    }\n    return arrStr;\n}\n\nvar decodeKey = function(dataKeyString) {\n    var decodeArr = base64Decode(dataKeyString);\n    var decodeArrString = uint8ArrayToString(decodeArr);\n    return decodeArrString;\n    if (decodeArrString.indexOf('|&|') > 0) {\n        return decodeArrString;\n    }\n    return '';\n}\n\";\n        //https://video.cdeledu.com/js/lib/cdel.hls.min-1.0.js?v=1.3\n        public static string DecodeKey(string txt)\n        {\n            var context = new Context();\n            context.Eval(JS);\n            var concatFunction = context.GetVariable(\"decodeKey\").As<Function>();\n            string key = concatFunction.Call(new Arguments { txt }).ToString();\n            string realKey = key.Split(new string[] { \"|&|\" }, StringSplitOptions.None)[1];\n            return realKey;\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/DecodeDdyun.cs",
    "content": "﻿using System.Security.Cryptography;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace N_m3u8DL_CLI\n{\n    class DecodeDdyun\n    {\n        public static string DecryptM3u8(byte[] byteArray)\n        {\n            string tmp = DecodeNfmovies.DecryptM3u8(byteArray);\n            if (tmp.StartsWith(\"duoduo.key\"))\n            {\n                tmp = Regex.Replace(tmp, @\"#EXT-X-BYTERANGE:.*\\s\", \"\");\n                tmp = tmp.Replace(\"https:\", \"jump/https:\")\n                    .Replace(\"inews.gtimg.com\", \"puui.qpic.cn\");\n            }\n            return tmp;\n        }\n\n        //https://player.ddyunp.com/jQuery.min.js?v1.5\n        public static string GetVaildM3u8Url(string url)\n        {\n            //url: https://hls.ddyunp.com/ddyun/id/1/key/playlist.m3u8\n            string id = Regex.Match(url, @\"\\w{20,}\").Value;\n            string tm = Global.GetTimeStamp(false);\n            string t = ((long.Parse(tm) / 0x186a0) * 0x64).ToString();\n            string tmp = id + \"duoduo\" + \"1\" + t;\n            MD5 md5 = MD5.Create();\n            byte[] bs = Encoding.UTF8.GetBytes(tmp);\n            byte[] hs = md5.ComputeHash(bs);\n            StringBuilder sb = new StringBuilder();\n            foreach (byte b in hs)\n            {\n                sb.Append(b.ToString(\"x2\"));\n            }\n            string key = sb.ToString();\n            return Regex.Replace(url, @\"1/\\w{20,}\", \"1/\" + key);\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/DecodeHuke88Key.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace N_m3u8DL_CLI\n{\n    //https://js.huke88.com/assets/revision/js/plugins/tcplayer/tcplayer.v4.1.min.js?v=930\n    //https://js.huke88.com/assets/revision/js/plugins/tcplayer/libs/hls.min.0.13.2m.js?v=930\n    class DecodeHuke88Key\n    {\n        private static string[] GetOverlayInfo(string url)\n        {\n            var enc = new Regex(\"eyJ\\\\w{100,}\").Match(url).Value;\n            var json = Encoding.UTF8.GetString(Convert.FromBase64String(enc));\n            JObject jObject = JObject.Parse(json);\n            var key = jObject[\"overlayKey\"].ToString();\n            var iv = jObject[\"overlayIv\"].ToString();\n            return new string[] { key, iv };\n        }\n\n        public static string DecodeKey(string url, byte[] data)\n        {\n            var info = GetOverlayInfo(url);\n            var overlayKey = info[0];\n            var overlayIv = info[1];\n            var l = new List<byte>();\n            var c = new List<byte>();\n            for (int h = 0; h < 16; h++)\n            {\n                var f = overlayKey.Substring(2 * h, 2);\n                var g = overlayIv.Substring(2 * h, 2);\n                l.Add(Convert.ToByte(f, 16));\n                c.Add(Convert.ToByte(g, 16));\n            }\n\n            var _lastCipherblock = c.ToArray();\n\n            var t = new byte[data.Length];\n            var r = data;\n            r = Decrypter.AES128Decrypt(data, l.ToArray(), Decrypter.HexStringToBytes(\"00000000000000000000000000000000\"), CipherMode.CBC, PaddingMode.Zeros);\n\n            for (var o = 0; o < 16; o++)\n                t[o] = (byte)(r[o] ^ _lastCipherblock[o]);\n\n            var key = Convert.ToBase64String(t);\n\n            return key;\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/DecodeImooc.cs",
    "content": "﻿using NiL.JS.BaseLibrary;\nusing NiL.JS.Core;\nusing NiL.JS.Extensions;\nusing System;\nusing Array = System.Array;\n\nnamespace N_m3u8DL_CLI\n{\n    /*\n     * js代码来自：https://www.imooc.com/static/moco/player/3.0.6.3/mocoplayer.js?v=202006122046\n     * \n     */\n    class DecodeImooc\n    {\n        private static string JS = @\"\nfunction n(t, e) {\n                function r(t, e) {\n                    var r = '';\n                    if ('object' == typeof t)\n                        for (var n = 0; n < t.length; n++)\n                            r += String.fromCharCode(t[n]);\n                    t = r || t;\n                    for (var i, o, a = new Uint8Array(t.length), s = e.length, n = 0; n < t.length; n++)\n                        o = n % s,\n                        i = t[n],\n                        i = i.toString().charCodeAt(0),\n                        a[n] = i ^ e.charCodeAt(o);\n                    return a\n                }\n                function n(t) {\n                    var e = '';\n                    if ('object' == typeof t)\n                        for (var r = 0; r < t.length; r++)\n                            e += String.fromCharCode(t[r]);\n                    t = e || t;\n                    var n = new Uint8Array(t.length);\n                    for (r = 0; r < t.length; r++)\n                        n[r] = t[r].toString().charCodeAt(0);\n                    var i, o, r = 0;\n                    for (r = 0; r < n.length; r++)\n                        0 != (i = n[r] % 3) && r + i < n.length && (o = n[r + 1],\n                        n[r + 1] = n[r + i],\n                        n[r + i] = o,\n                        r = r + i + 1);\n                    return n\n                }\n                function i(t) {\n                    var e = '';\n                    if ('object' == typeof t)\n                        for (var r = 0; r < t.length; r++)\n                            e += String.fromCharCode(t[r]);\n                    t = e || t;\n                    var n = new Uint8Array(t.length);\n                    for (r = 0; r < t.length; r++)\n                        n[r] = t[r].toString().charCodeAt(0);\n                    var r = 0\n                      , i = 0\n                      , o = 0\n                      , a = 0;\n                    for (r = 0; r < n.length; r++)\n                        o = n[r] % 2,\n                        o && r++,\n                        a++;\n                    var s = new Uint8Array(a);\n                    for (r = 0; r < n.length; r++)\n                        o = n[r] % 2,\n                        s[i++] = o ? n[r++] : n[r];\n                    return s\n                }\n                function o(t, e) {\n                    var r = 0\n                      , n = 0\n                      , i = 0\n                      , o = 0\n                      , a = '';\n                    if ('object' == typeof t)\n                        for (var r = 0; r < t.length; r++)\n                            a += String.fromCharCode(t[r]);\n                    t = a || t;\n                    var s = new Uint8Array(t.length);\n                    for (r = 0; r < t.length; r++)\n                        s[r] = t[r].toString().charCodeAt(0);\n                    for (r = 0; r < t.length; r++)\n                        if (0 != (o = s[r] % 5) && 1 != o && r + o < s.length && (i = s[r + 1],\n                        n = r + 2,\n                        s[r + 1] = s[r + o],\n                        s[o + r] = i,\n                        (r = r + o + 1) - 2 > n))\n                            for (; n < r - 2; n++)\n                                s[n] = s[n] ^ e.charCodeAt(n % e.length);\n                    for (r = 0; r < t.length; r++)\n                        s[r] = s[r] ^ e.charCodeAt(r % e.length);\n                    return s\n                }\n                for (var a = {\n                    data: {\n                        info: t\n                    }\n                }, s = {\n                    q: r,\n                    h: n,\n                    m: i,\n                    k: o\n                }, l = a.data.info, u = l.substring(l.length - 4).split(''), c = 0; c < u.length; c++)\n                    u[c] = u[c].toString().charCodeAt(0) % 4;\n                u.reverse();\n                for (var d = [], c = 0; c < u.length; c++)\n                    d.push(l.substring(u[c] + 1, u[c] + 2)),\n                    l = l.substring(0, u[c] + 1) + l.substring(u[c] + 2);\n                a.data.encrypt_table = d,\n                a.data.key_table = [];\n                for (var c in a.data.encrypt_table)\n                    'q' != a.data.encrypt_table[c] && 'k' != a.data.encrypt_table[c] || (a.data.key_table.push(l.substring(l.length - 12)),\n                    l = l.substring(0, l.length - 12));\n                a.data.key_table.reverse(),\n                a.data.info = l;\n                var f = new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);\n                a.data.info = function(t) {\n                    var e, r, n, i, o, a, s;\n                    for (a = t.length,\n                    o = 0,\n                    s = ''; o < a; ) {\n                        do {\n                            e = f[255 & t.charCodeAt(o++)]\n                        } while (o < a && -1 == e);if (-1 == e)\n                            break;\n                        do {\n                            r = f[255 & t.charCodeAt(o++)]\n                        } while (o < a && -1 == r);if (-1 == r)\n                            break;\n                        s += String.fromCharCode(e << 2 | (48 & r) >> 4);\n                        do {\n                            if (61 == (n = 255 & t.charCodeAt(o++)))\n                                return s;\n                            n = f[n]\n                        } while (o < a && -1 == n);if (-1 == n)\n                            break;\n                        s += String.fromCharCode((15 & r) << 4 | (60 & n) >> 2);\n                        do {\n                            if (61 == (i = 255 & t.charCodeAt(o++)))\n                                return s;\n                            i = f[i]\n                        } while (o < a && -1 == i);if (-1 == i)\n                            break;\n                        s += String.fromCharCode((3 & n) << 6 | i)\n                    }\n                    return s\n                }(a.data.info);\n                for (var c in a.data.encrypt_table) {\n                    var h = a.data.encrypt_table[c];\n                    if ('q' == h || 'k' == h) {\n                        var p = a.data.key_table.pop();\n                        a.data.info = s[a.data.encrypt_table[c]](a.data.info, p)\n                    } else\n                        a.data.info = s[a.data.encrypt_table[c]](a.data.info)\n                }\n                if (e)\n                    return a.data.info;\n                var g = '';\n                for (c = 0; c < a.data.info.length; c++)\n                    g += String.fromCharCode(a.data.info[c]);\n                return g\n            }\n            function Uint8ArrayToString(fileData){\n              var dataString = '';\n              for (var i = 0; i < fileData.length; i++) {\n                dataString += Number(fileData[i]) + ',';\n              }\n              return dataString;\n            }\n            function decodeKey(resp){\n                var string = eval('('+resp+')');\n                //return btoa(String.fromCharCode.apply(null, new Uint8Array(n(string.data.info, 1))));\n                return Uint8ArrayToString(new Uint8Array(n(string.data.info, 1)));\n            }\n            function decodeM3u8(resp){\n                var string = eval('('+resp+')');\n                return n(string.data.info);\n            }\n            \";\n\n\n        public static string DecodeM3u8(string resp)\n        {\n            var context = new Context();\n            context.Eval(JS);\n            var concatFunction = context.GetVariable(\"decodeM3u8\").As<Function>();\n            string m3u8 = concatFunction.Call(new Arguments { resp }).ToString();\n            return m3u8;\n        }\n\n        public static string DecodeKey(string resp)\n        {\n            var context = new Context();\n            context.Eval(JS);\n            var concatFunction = context.GetVariable(\"decodeKey\").As<Function>();\n            string key = concatFunction.Call(new Arguments { resp }).ToString();\n            byte[] v = Array.ConvertAll(key.Trim(',').Split(','), s => (byte)int.Parse(s));\n            string realKey = Convert.ToBase64String(v);\n            return realKey;\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/DecodeNfmovies.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\n\nnamespace N_m3u8DL_CLI\n{\n    class DecodeNfmovies\n    {\n        //https://jx.nfmovies.com/hls.min.js\n        public static string DecryptM3u8(byte[] byteArray)\n        {\n            var t = byteArray;\n            var decrypt = \"\";\n            if (137 == t[0] && 80 == t[1] && 130 == t[354] && 96 == t[353]) t = t.Skip(355).ToArray();\n            else\n            {\n                if (137 != t[0] || 80 != t[1] || 130 != t[394] || 96 != t[393])\n                {\n                    for (var i = 0; i < t.Length; i++) decrypt += Convert.ToChar(t[i]);\n                    return decrypt;\n                }\n                t = t.Skip(395).ToArray();\n            }\n            using (var zipStream =\n                new System.IO.Compression.GZipStream(new MemoryStream(t), System.IO.Compression.CompressionMode.Decompress))\n            {\n                using (StreamReader sr = new StreamReader(zipStream, Encoding.UTF8))\n                {\n                    decrypt = sr.ReadToEnd();\n                }\n            }\n            return decrypt;\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/Decrypter.cs",
    "content": "﻿using CSChaCha20;\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Security.Cryptography;\n\nnamespace N_m3u8DL_CLI\n{\n    class Decrypter\n    {\n        public static byte[] AES128Decrypt(string filePath, byte[] keyByte, byte[] ivByte, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)\n        {\n            FileStream fs = new FileStream(filePath, FileMode.Open);\n            //获取文件大小\n            long size = fs.Length;\n            byte[] inBuff = new byte[size];\n            fs.Read(inBuff, 0, inBuff.Length);\n            fs.Close();\n\n            Aes dcpt = Aes.Create();\n            dcpt.BlockSize = 128;\n            dcpt.KeySize = 128;\n            dcpt.Key = keyByte;\n            dcpt.IV = ivByte;\n            dcpt.Mode = mode;\n            dcpt.Padding = padding;\n\n            ICryptoTransform cTransform = dcpt.CreateDecryptor();\n            Byte[] resultArray = cTransform.TransformFinalBlock(inBuff, 0, inBuff.Length);\n            return resultArray;\n        }\n\n        public static byte[] AES128Decrypt(byte[] encryptedBuff, byte[] keyByte, byte[] ivByte, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)\n        {\n            byte[] inBuff = encryptedBuff;\n\n            Aes dcpt = Aes.Create();\n            dcpt.BlockSize = 128;\n            dcpt.KeySize = 128;\n            dcpt.Key = keyByte;\n            dcpt.IV = ivByte;\n            dcpt.Mode = mode;\n            dcpt.Padding = padding;\n\n            ICryptoTransform cTransform = dcpt.CreateDecryptor();\n            Byte[] resultArray = cTransform.TransformFinalBlock(inBuff, 0, inBuff.Length);\n            return resultArray;\n        }\n\n        public static byte[] CHACHA20Decrypt(byte[] encryptedBuff, byte[] keyBytes, byte[] nonceBytes)\n        {\n            if (keyBytes.Length != 32)\n                throw new Exception(\"Key must be 32 bytes!\");\n            if (nonceBytes.Length != 12 && nonceBytes.Length != 8)\n                throw new Exception(\"Key must be 12 or 8 bytes!\");\n            if (nonceBytes.Length == 8)\n                nonceBytes = (new byte[4] { 0, 0, 0, 0 }).Concat(nonceBytes).ToArray();\n\n            var decStream = new MemoryStream();\n            using (BinaryReader reader = new BinaryReader(new MemoryStream(encryptedBuff)))\n            {\n                using (BinaryWriter writer = new BinaryWriter(decStream))\n                {\n                    while (true)\n                    {\n                        var buffer = reader.ReadBytes(1024);\n                        byte[] dec = new byte[buffer.Length];\n                        if (buffer.Length > 0)\n                        {\n                            ChaCha20 forDecrypting = new ChaCha20(keyBytes, nonceBytes, 0);\n                            forDecrypting.DecryptBytes(dec, buffer);\n                            writer.Write(dec, 0, dec.Length);\n                        }\n                        else\n                        {\n                            break;\n                        }\n                    }\n                }\n            }\n            return decStream.ToArray();\n        }\n\n        public static byte[] HexStringToBytes(string hexStr)\n        {\n            if (string.IsNullOrEmpty(hexStr))\n            {\n                return new byte[0];\n            }\n\n            if (hexStr.StartsWith(\"0x\") || hexStr.StartsWith(\"0X\"))\n            {\n                hexStr = hexStr.Remove(0, 2);\n            }\n\n            int count = hexStr.Length;\n\n            if (count % 2 == 1)\n            {\n                throw new ArgumentException(\"Invalid length of bytes:\" + count);\n            }\n\n            int byteCount = count / 2;\n            byte[] result = new byte[byteCount];\n            for (int ii = 0; ii < byteCount; ++ii)\n            {\n                var tempBytes = Byte.Parse(hexStr.Substring(2 * ii, 2), System.Globalization.NumberStyles.HexNumber);\n                result[ii] = tempBytes;\n            }\n\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/DownloadManager.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace N_m3u8DL_CLI\n{\n    class DownloadManager\n    {\n        private int stopCount = 0;           //速度为零的停止\n\n        private string jsonFile = string.Empty;\n        private int total = 0;\n        public static string partsPadZero = string.Empty;\n        string segsPadZero = string.Empty;\n        private bool isVTT = false;\n        bool externalAudio = false;  //额外的音轨\n        string externalAudioUrl = \"\";\n        bool externalSub = false;  //额外的字幕\n        string externalSubUrl = \"\";\n        string fflogName = \"_ffreport.log\";\n        public static bool BinaryMerge = false;\n\n        public int Threads { get; set; } = 1;\n        public int RetryCount { get; set; } = 5;\n        public string Headers { get; set; } = string.Empty;\n        public string DownDir { get; set; } = string.Empty;\n        public string DownName { get; set; } = string.Empty;\n        public bool DelAfterDone { get; set; } = false;\n        public string MuxFormat { get; set; } = \"mp4\";\n        public bool MuxFastStart { get; set; } = true;\n        public string MuxSetJson { get; set; } = string.Empty;\n        public int TimeOut { get; set; } = 10000;         //超时设置\n        public static double DownloadedSize { get; set; } = 0;   //已下载大小\n        public static double ToDoSize { get; set; } = 0;   //待下载大小\n        public static bool HasSetDir { get; set; } = false;\n        public bool NoMerge { get; set; } = false;\n        public static int CalcTime { get; set; } = 1;            //计算速度的间隔\n        public static int Count { get; set; } = 0;\n        public static int PartsCount { get; set; } = 0;\n        public static bool DisableIntegrityCheck { get; set; } = false; //关闭完整性检查\n        public static bool HasExtMap { get; set; } = false; //是否有MAP\n\n        static CancellationTokenSource cts = new CancellationTokenSource();\n        //计算下载速度\n        static System.Timers.Timer timer = new System.Timers.Timer(1000 * CalcTime);   //实例化Timer类\n\n        public DownloadManager()\n        {\n            timer.AutoReset = true;\n            timer.Elapsed += delegate\n            {\n                var eta = \"\";\n                if (ToDoSize != 0)\n                {\n                    eta = \" @ \" + Global.FormatTime(Convert.ToInt32(ToDoSize / (Global.BYTEDOWN / CalcTime)));\n                }\n                var print = Global.FormatFileSize((Global.BYTEDOWN) / CalcTime) + \"/s\" + eta;\n                ProgressReporter.Report(\"\", \"(\" + print + \")\");\n\n                if (Global.HadReadInfo && Global.BYTEDOWN <= Global.STOP_SPEED * 1024 * CalcTime)\n                {\n                    stopCount++;\n                    eta = \"\";\n                    if (ToDoSize != 0)\n                    {\n                        eta = \" @ \" + Global.FormatTime(Convert.ToInt32(ToDoSize / (Global.BYTEDOWN / CalcTime)));\n                    }\n                    print = Global.FormatFileSize((Global.BYTEDOWN) / CalcTime) + \"/s [\" + stopCount + \"]\" + eta;\n                    ProgressReporter.Report(\"\", \"(\" + print + \")\");\n\n                    if (stopCount >= 12)\n                    {\n                        Global.ShouldStop = true;\n                        cts.Cancel();\n                        timer.Enabled = false;\n                    }\n                }\n                else\n                {\n                    stopCount = 0;\n                    Global.BYTEDOWN = 0;\n                    Global.ShouldStop = false;\n                }\n            };\n        }\n\n        public void DoDownload()\n        {\n            jsonFile = Path.Combine(DownDir, \"meta.json\");\n            if (!File.Exists(jsonFile))\n                return;\n\n            string jsonContent = File.ReadAllText(jsonFile);\n            JObject initJson = JObject.Parse(jsonContent);\n            JArray parts = JArray.Parse(initJson[\"m3u8Info\"][\"segments\"].ToString()); //大分组\n            string segCount = initJson[\"m3u8Info\"][\"count\"].ToString();\n            string oriCount = initJson[\"m3u8Info\"][\"originalCount\"].ToString(); //原始分片数量\n            string isVOD = initJson[\"m3u8Info\"][\"vod\"].ToString();\n            try\n            {\n                if (initJson[\"m3u8Info\"][\"audio\"].ToString() != \"\")\n                    externalAudio = true;\n                externalAudioUrl = initJson[\"m3u8Info\"][\"audio\"].ToString();\n                LOGGER.WriteLine(strings.hasExternalAudioTrack);\n                LOGGER.PrintLine(strings.hasExternalAudioTrack, LOGGER.Warning);\n            }\n            catch (Exception) {}\n            try\n            {\n                if (initJson[\"m3u8Info\"][\"sub\"].ToString() != \"\")\n                    externalSub = true;\n                externalSubUrl = initJson[\"m3u8Info\"][\"sub\"].ToString();\n                LOGGER.WriteLine(strings.hasExternalSubtitleTrack);\n                LOGGER.PrintLine(strings.hasExternalSubtitleTrack, LOGGER.Warning);\n            }\n            catch (Exception) { }\n            total = Convert.ToInt32(segCount);\n            PartsCount = parts.Count;\n            segsPadZero = string.Empty.PadRight(oriCount.Length, '0');\n            partsPadZero = string.Empty.PadRight(Convert.ToString(parts.Count).Length, '0');\n\n            //是直播视频\n            if (isVOD == \"False\")\n            {\n                return;\n            }\n\n            Global.ShouldStop = false; //是否该停止下载\n\n            if (!Directory.Exists(DownDir))\n                Directory.CreateDirectory(DownDir); //新建文件夹  \n            Watcher watcher = new Watcher(DownDir);\n            watcher.Total = total;\n            watcher.PartsCount = PartsCount;\n            watcher.WatcherStrat();\n\n            //开始计算速度\n            timer.Enabled = true;\n            cts = new CancellationTokenSource();\n\n            //开始调用下载\n            LOGGER.WriteLine(strings.startDownloading);\n            LOGGER.PrintLine(strings.startDownloading, LOGGER.Warning);\n\n            //下载MAP文件（若有）\n            downloadMap:\n            if (HasExtMap)\n            {\n                LOGGER.PrintLine(strings.downloadingMapFile);\n                Downloader sd = new Downloader();\n                sd.TimeOut = TimeOut;\n                sd.FileUrl = initJson[\"m3u8Info\"][\"extMAP\"].Value<string>();\n                sd.Headers = Headers;\n                sd.Method = \"NONE\";\n                if (sd.FileUrl.Contains(\"|\"))  //有range\n                {\n                    string[] tmp = sd.FileUrl.Split('|');\n                    sd.FileUrl = tmp[0];\n                    sd.StartByte = Convert.ToUInt32(tmp[1].Split('@')[1]);\n                    sd.ExpectByte = Convert.ToUInt32(tmp[1].Split('@')[0]);\n                }\n                sd.SavePath = DownDir + \"\\\\!MAP.tsdownloading\";\n                if (File.Exists(sd.SavePath))\n                    File.Delete(sd.SavePath);\n                if (File.Exists(DownDir + \"\\\\Part_0\\\\!MAP.ts\"))\n                    File.Delete(DownDir + \"\\\\Part_0\\\\!MAP.ts\");\n                sd.Down();  //开始下载\n                if (!File.Exists(DownDir + \"\\\\!MAP.ts\")) //检测是否成功下载\n                {\n                    Thread.Sleep(1000);\n                    goto downloadMap;\n                }\n            }\n\n            //首先下载第一个分片\n            JToken firstSeg = JArray.Parse(parts[0].ToString())[0];\n            if (!File.Exists(DownDir + \"\\\\Part_\" + 0.ToString(partsPadZero) + \"\\\\\" + firstSeg[\"index\"].Value<int>().ToString(segsPadZero) + \".ts\"))\n            {\n                try\n                {\n                    Downloader sd = new Downloader();\n                    sd.TimeOut = TimeOut;\n                    sd.SegDur = firstSeg[\"duration\"].Value<double>();\n                    if (sd.SegDur < 0) sd.SegDur = 0; //防止负数\n                    sd.FileUrl = firstSeg[\"segUri\"].Value<string>();\n                    //VTT字幕\n                    if (isVTT == false && (sd.FileUrl.Trim('\\\"').EndsWith(\".vtt\") || sd.FileUrl.Trim('\\\"').EndsWith(\".webvtt\")))\n                        isVTT = true;\n                    sd.Method = firstSeg[\"method\"].Value<string>();\n                    if (sd.Method != \"NONE\")\n                    {\n                        sd.Key = firstSeg[\"key\"].Value<string>();\n                        sd.Iv = firstSeg[\"iv\"].Value<string>();\n                    }\n                    if (firstSeg[\"expectByte\"] != null)\n                        sd.ExpectByte = firstSeg[\"expectByte\"].Value<long>();\n                    if (firstSeg[\"startByte\"] != null)\n                        sd.StartByte = firstSeg[\"startByte\"].Value<long>();\n                    sd.Headers = Headers;\n                    sd.SavePath = DownDir + \"\\\\Part_\" + 0.ToString(partsPadZero) + \"\\\\\" + firstSeg[\"index\"].Value<int>().ToString(segsPadZero) + \".tsdownloading\";\n                    if (File.Exists(sd.SavePath))\n                        File.Delete(sd.SavePath);\n                    LOGGER.PrintLine(strings.downloadingFirstSegement);\n                    if (!Global.ShouldStop)\n                        sd.Down();  //开始下载\n                }\n                catch (Exception e)\n                {\n                    //LOG.WriteLineError(e.ToString());\n                }\n            }\n\n            if (Global.HadReadInfo == false)\n            {\n                string href = DownDir + \"\\\\Part_\" + 0.ToString(partsPadZero) + \"\\\\\" + firstSeg[\"index\"].Value<int>().ToString(segsPadZero) + \".ts\";\n                if (File.Exists(DownDir + \"\\\\!MAP.ts\"))\n                    href = DownDir + \"\\\\!MAP.ts\";\n                Global.GzipHandler(href);\n                bool flag = false;\n                foreach (string ss in (string[])Global.GetVideoInfo(href).ToArray(typeof(string)))\n                {\n                    LOGGER.WriteLine(ss.Trim());\n                    LOGGER.PrintLine(ss.Trim(), 0);\n                    if (ss.Trim().Contains(\"Error in reading file\"))\n                        flag = true;\n                }\n                LOGGER.PrintLine(strings.waitForCompletion, LOGGER.Warning);\n                if (!flag)\n                    Global.HadReadInfo = true;\n            }\n\n            //多线程设置\n            ParallelOptions parallelOptions = new ParallelOptions\n            {\n                MaxDegreeOfParallelism = Threads,\n                CancellationToken = cts.Token\n            };\n\n            //构造包含所有分片的新的segments\n            JArray segments = new JArray();\n            for (int i = 0; i < parts.Count; i++)\n            {\n                var tmp = JArray.Parse(parts[i].ToString());\n                for (int j = 0; j < tmp.Count; j++)\n                {\n                    JObject t = (JObject)tmp[j];\n                    t.Add(\"part\", i);\n                    segments.Add(t);\n                }\n            }\n\n            //剔除第一个分片（已下载过）\n            segments.RemoveAt(0);\n\n            try\n            {\n                ParallelLoopResult result = Parallel.ForEach(segments,\n                    parallelOptions,\n                    () => new Downloader(),\n                    (info, loopstate, index, sd) =>\n                    {\n                        if (Global.ShouldStop)\n                            loopstate.Stop();\n                        else\n                        {\n                            sd.TimeOut = TimeOut;\n                            sd.SegDur = info[\"duration\"].Value<double>();\n                            if (sd.SegDur < 0) sd.SegDur = 0; //防止负数\n                                sd.FileUrl = info[\"segUri\"].Value<string>();\n                            //VTT字幕\n                            if (isVTT == false && (sd.FileUrl.Trim('\\\"').EndsWith(\".vtt\") || sd.FileUrl.Trim('\\\"').EndsWith(\".webvtt\")))\n                                isVTT = true;\n                            sd.Method = info[\"method\"].Value<string>();\n                            if (sd.Method != \"NONE\")\n                            {\n                                sd.Key = info[\"key\"].Value<string>();\n                                sd.Iv = info[\"iv\"].Value<string>();\n                            }\n                            if (firstSeg[\"expectByte\"] != null)\n                                sd.ExpectByte = info[\"expectByte\"].Value<long>();\n                            if (firstSeg[\"startByte\"] != null)\n                                sd.StartByte = info[\"startByte\"].Value<long>();\n                            sd.Headers = Headers;\n                            sd.SavePath = DownDir + \"\\\\Part_\" + info[\"part\"].Value<int>().ToString(partsPadZero) + \"\\\\\" + info[\"index\"].Value<int>().ToString(segsPadZero) + \".tsdownloading\";\n                            if (File.Exists(sd.SavePath))\n                                File.Delete(sd.SavePath);\n                            if (!Global.ShouldStop)\n                                sd.Down();  //开始下载\n                            }\n                        return sd;\n                    },\n                    (sd) => { });\n\n                if (result.IsCompleted)\n                {\n                    //LOGGER.WriteLine(\"Part \" + (info[\"part\"].Value<int>() + 1).ToString(partsPadZero) + \" of \" + parts.Count + \" Completed\");\n                }\n            }\n            catch (Exception)\n            {\n                ;//捕获取消循环产生的异常\n            }\n            finally\n            {\n                cts.Dispose();\n            }\n\n            watcher.WatcherStop();\n\n            //停止速度监测\n            timer.Enabled = false;\n\n            //检测是否下完\n            IsComplete(Convert.ToInt32(segCount));\n        }\n        \n        public void IsComplete(int segCount)\n        {\n            int tsCount = 0;\n\n            if (DisableIntegrityCheck)\n            {\n                tsCount = segCount;\n                goto ll;\n            }\n\n            for (int i = 0; i < PartsCount; i++) \n            {\n                tsCount += Global.GetFileCount(DownDir + \"\\\\Part_\" + i.ToString(partsPadZero), \".ts\");\n            }\n\n        ll:\n            if (tsCount != segCount)\n            {\n                LOGGER.PrintLine(strings.downloadedCount + tsCount + \" / \" + segCount);\n                LOGGER.WriteLine(strings.downloadedCount + tsCount + \" of \" + segCount);\n                if (Count <= RetryCount)\n                {\n                    Count++;\n                    LOGGER.WriteLine(strings.retryCount + Count + \" / \" + RetryCount);\n                    LOGGER.PrintLine(strings.retryCount + Count + \" / \" + RetryCount, LOGGER.Warning);\n                    Thread.Sleep(3000);\n                    DoDownload();\n                }\n            }\n            else  //开始合并\n            {\n                LOGGER.PrintLine(strings.downloadComplete + (DisableIntegrityCheck ? \"(\" + strings.disableIntegrityCheck + \")\" : \"\"));\n                if (NoMerge == false)\n                {\n                    string exePath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);\n                    string driverName = exePath.Remove(exePath.IndexOf(':'));\n                    Console.Title = \"Done.\";\n                    LOGGER.WriteLine(strings.startMerging);\n                    LOGGER.PrintLine(strings.startMerging, LOGGER.Warning);\n                    //VTT字幕\n                    if (isVTT == true)\n                    {\n                        MuxFormat = \"vtt\";\n                        Global.ReAdjustVtt(Global.GetFiles(DownDir + \"\\\\Part_0\", \".ts\"));\n                    }\n                    //只有一个Part直接用ffmpeg合并\n                    if (PartsCount == 1)\n                    {\n                        /*\n                         * FFREPORT=file=C\\:/Users/nilao/Desktop/新建文件夹/3.log:level=32\n                         * Test with Powershell, its C:/Users/nilao/Desktop/新建文件夹/3.log\n                         */\n                        FFmpeg.OutPutPath = Path.Combine(Directory.GetParent(DownDir).FullName, DownName);\n                        FFmpeg.ReportFile = driverName + \"\\\\:\" + exePath.Remove(0, exePath.IndexOf(':') + 1).Replace(\"\\\\\", \"/\") + \"/Logs/\" + Path.GetFileNameWithoutExtension(LOGGER.LOGFILE) + fflogName;\n                        if (File.Exists(DownDir + \"\\\\!MAP.ts\"))\n                            File.Move(DownDir + \"\\\\!MAP.ts\", DownDir + \"\\\\Part_0\\\\!MAP.ts\");\n\n                        if (BinaryMerge)\n                        {\n                            LOGGER.PrintLine(strings.binaryMergingPleaseWait);\n                            MuxFormat = \"ts\";\n                            //有MAP文件，一般为mp4，采取默认动作\n                            if(File.Exists(DownDir + \"\\\\Part_0\\\\!MAP.ts\"))\n                                MuxFormat = \"mp4\";\n                            if (isVTT)\n                                MuxFormat = \"vtt\";\n\n                            if (Global.AUDIO_TYPE != \"\")\n                                MuxFormat = Global.AUDIO_TYPE;\n                            Global.CombineMultipleFilesIntoSingleFile(Global.GetFiles(DownDir + \"\\\\Part_0\", \".ts\"), FFmpeg.OutPutPath + $\".{MuxFormat}\");\n                        }\n                        else\n                        {\n                            if (Global.VIDEO_TYPE != \"DV\") //不是杜比视界\n                            {\n                                //检测是否为MPEG-TS封装，不是的话就转换为TS封装\n                                foreach (string s in Global.GetFiles(DownDir + \"\\\\Part_0\", \".ts\"))\n                                {\n                                    //跳过有MAP的情况\n                                    if (!isVTT && !File.Exists(DownDir + \"\\\\Part_0\\\\!MAP.ts\") && !FFmpeg.CheckMPEGTS(s))\n                                    {\n                                        //转换\n                                        LOGGER.PrintLine(strings.remuxToMPEGTS + Path.GetFileName(s));\n                                        LOGGER.WriteLine(strings.remuxToMPEGTS + Path.GetFileName(s));\n                                        FFmpeg.ConvertToMPEGTS(s);\n                                    }\n                                }\n\n                                //分片过多的情况\n                                if (tsCount >= 1800)\n                                {\n                                    LOGGER.WriteLine(strings.partialMergingPleaseWait);\n                                    LOGGER.PrintLine(strings.partialMergingPleaseWait, LOGGER.Warning);\n                                    Global.PartialCombineMultipleFiles(Global.GetFiles(DownDir + \"\\\\Part_0\", \".ts\"));\n                                }\n\n                                if (Global.AUDIO_TYPE != \"\")\n                                    MuxFormat = Global.AUDIO_TYPE;\n\n                                LOGGER.PrintLine(strings.ffmpegMergingPleaseWait);\n                                if (!File.Exists(MuxSetJson))\n                                    FFmpeg.Merge(Global.GetFiles(DownDir + \"\\\\Part_0\", \".ts\"), MuxFormat, MuxFastStart);\n                                else\n                                {\n                                    JObject json = JObject.Parse(File.ReadAllText(MuxSetJson, Encoding.UTF8));\n                                    string muxFormat = json[\"muxFormat\"].Value<string>();\n                                    bool fastStart = Convert.ToBoolean(json[\"fastStart\"].Value<string>());\n                                    string poster = json[\"poster\"].Value<string>();\n                                    string audioName = json[\"audioName\"].Value<string>();\n                                    string title = json[\"title\"].Value<string>();\n                                    string copyright = json[\"copyright\"].Value<string>();\n                                    string comment = json[\"comment\"].Value<string>();\n                                    string encodingTool = \"\";\n                                    try { encodingTool = json[\"encodingTool\"].Value<string>(); } catch (Exception) {; }\n                                    FFmpeg.Merge(Global.GetFiles(DownDir + \"\\\\Part_0\", \".ts\"), muxFormat, fastStart, poster, audioName, title, copyright, comment, encodingTool);\n                                }\n                                //Global.CombineMultipleFilesIntoSingleFile(Global.GetFiles(DownDir + \"\\\\Part_0\", \".ts\"), FFmpeg.OutPutPath + \".ts\");\n\n                                //Global.ExplorerFile(FFmpeg.OutPutPath + \".mp4\");\n                            }\n                            else\n                            {\n                                LOGGER.PrintLine(strings.dolbyVisionContentMerging);\n                                Global.CombineMultipleFilesIntoSingleFile(Global.GetFiles(DownDir + \"\\\\Part_0\", \".ts\"), FFmpeg.OutPutPath + \".mp4\");\n                            }\n                        }\n\n                        LOGGER.WriteLine(strings.taskDone\n                                + \"\\r\\n\\r\\nTask End: \" + DateTime.Now.ToString(\"yyyy/MM/dd HH:mm:ss\")\n                                + \"\\r\\nFile: \" + FFmpeg.OutPutPath + \".\" + (MuxFormat == \"aac\" ? \"m4a\" : MuxFormat) + \"\\r\\n\\r\\n\");\n\n                        //删除文件夹\n                        if (DelAfterDone)\n                        {\n                            try\n                            {\n                                DirectoryInfo directoryInfo = new DirectoryInfo(DownDir);\n                                directoryInfo.Delete(true);\n                            }\n                            catch (Exception) { }\n                        }\n                        if (externalAudio)  //下载独立音轨\n                        {\n                            externalAudio = false;\n                            DownloadedSize = 0;\n                            Global.WriteInit();\n                            LOGGER.PrintLine(strings.downloadingExternalAudioTrack, LOGGER.Warning);\n                            Parser parser = new Parser();\n                            parser.Headers = Headers; //继承Header\n                            parser.BaseUrl = \"\";\n                            parser.M3u8Url = externalAudioUrl;\n                            parser.DownName = DownName + \"(Audio)\";\n                            parser.DownDir = Path.Combine(Path.GetDirectoryName(DownDir), parser.DownName);\n                            LOGGER.WriteLine(strings.startParsing + externalAudioUrl);\n                            LOGGER.WriteLine(strings.downloadingExternalAudioTrack);\n                            DownName = DownName + \"(Audio)\";\n                            fflogName = \"_ffreport(Audio).log\";\n                            DownDir = parser.DownDir;\n                            parser.Parse();  //开始解析\n                            Thread.Sleep(1000);\n                            Global.HadReadInfo = false;\n                            Global.VIDEO_TYPE = \"\";\n                            Global.AUDIO_TYPE = \"\";\n                            DoDownload();\n                        }\n                        if (externalSub)  //下载独立字幕\n                        {\n                            externalSub = false;\n                            DownloadedSize = 0;\n                            Global.WriteInit();\n                            LOGGER.PrintLine(strings.downloadingExternalSubtitleTrack, LOGGER.Warning);\n                            Parser parser = new Parser();\n                            parser.Headers = Headers; //继承Header\n                            parser.BaseUrl = \"\";\n                            parser.M3u8Url = externalSubUrl;\n                            parser.DownName = DownName.Replace(\"(Audio)\", \"\") + \"(Subtitle)\";\n                            parser.DownDir = Path.Combine(Path.GetDirectoryName(DownDir), parser.DownName);\n                            LOGGER.WriteLine(strings.startParsing + externalSubUrl);\n                            LOGGER.WriteLine(strings.downloadingExternalSubtitleTrack);\n                            DownName = parser.DownName;\n                            fflogName = \"_ffreport(Subtitle).log\";\n                            DownDir = parser.DownDir;\n                            parser.Parse();  //开始解析\n                            Thread.Sleep(1000);\n                            Global.HadReadInfo = false;\n                            Global.VIDEO_TYPE = \"\";\n                            Global.AUDIO_TYPE = \"\";\n                            DoDownload();\n                        }\n                        LOGGER.PrintLine(strings.taskDone, LOGGER.Warning);\n                        Environment.Exit(0);  //正常退出程序\n                        return;\n                    }\n\n                    FFmpeg.OutPutPath = Path.Combine(Directory.GetParent(DownDir).FullName, DownName);\n                    FFmpeg.ReportFile = driverName + \"\\\\:\" + exePath.Remove(0, exePath.IndexOf(':') + 1).Replace(\"\\\\\", \"/\") + \"/Logs/\" + Path.GetFileNameWithoutExtension(LOGGER.LOGFILE) + fflogName;\n\n                    //合并分段\n                    LOGGER.PrintLine(strings.startMerging);\n                    for (int i = 0; i < PartsCount; i++)\n                    {\n                        string outputFilePath = DownDir + \"\\\\Part_\" + i.ToString(partsPadZero) + \".ts\";\n                        Global.CombineMultipleFilesIntoSingleFile(\n                           Global.GetFiles(DownDir + \"\\\\Part_\" + i.ToString(partsPadZero), \".ts\"),\n                           outputFilePath);\n                        try\n                        {\n                            DirectoryInfo directoryInfo = new DirectoryInfo(DownDir + \"\\\\Part_\" + i.ToString(partsPadZero));\n                            directoryInfo.Delete(true);\n                        }\n                        catch (Exception) { }\n                    }\n                    \n\n                    if (BinaryMerge)\n                    {\n                        LOGGER.PrintLine(strings.binaryMergingPleaseWait);\n                        MuxFormat = \"ts\";\n                        //有MAP文件，一般为mp4，采取默认动作\n                        if (File.Exists(DownDir + \"\\\\!MAP.ts\")) \n                            MuxFormat = \"mp4\";\n                        if (isVTT)\n                            MuxFormat = \"vtt\";\n                        Global.CombineMultipleFilesIntoSingleFile(Global.GetFiles(DownDir, \".ts\"), FFmpeg.OutPutPath + $\".{MuxFormat}\");\n                    }\n                    else\n                    {\n                        if (Global.VIDEO_TYPE != \"DV\")  //不是爱奇艺杜比视界\n                        {\n                            //检测是否为MPEG-TS封装，不是的话就转换为TS封装\n                            foreach (string s in Global.GetFiles(DownDir, \".ts\"))\n                            {\n                                //跳过有MAP的情况\n                                if (!isVTT && !File.Exists(DownDir + \"\\\\!MAP.ts\") && !FFmpeg.CheckMPEGTS(s))\n                                {\n                                    //转换\n                                    LOGGER.PrintLine(strings.remuxToMPEGTS + Path.GetFileName(s));\n                                    LOGGER.WriteLine(strings.remuxToMPEGTS + Path.GetFileName(s));\n                                    FFmpeg.ConvertToMPEGTS(s);\n                                }\n                            }\n\n                            if (Global.AUDIO_TYPE != \"\")\n                                MuxFormat = Global.AUDIO_TYPE;\n\n                            LOGGER.PrintLine(strings.ffmpegMergingPleaseWait);\n                            if (!File.Exists(MuxSetJson))\n                                FFmpeg.Merge(Global.GetFiles(DownDir, \".ts\"), MuxFormat, MuxFastStart);\n                            else\n                            {\n                                JObject json = JObject.Parse(File.ReadAllText(MuxSetJson, Encoding.UTF8));\n                                string muxFormat = json[\"muxFormat\"].Value<string>();\n                                bool fastStart = Convert.ToBoolean(json[\"fastStart\"].Value<string>());\n                                string poster = json[\"poster\"].Value<string>();\n                                string audioName = json[\"audioName\"].Value<string>();\n                                string title = json[\"title\"].Value<string>();\n                                string copyright = json[\"copyright\"].Value<string>();\n                                string comment = json[\"comment\"].Value<string>();\n                                string encodingTool = \"\";\n                                try { encodingTool = json[\"encodingTool\"].Value<string>(); } catch (Exception) {; }\n                                FFmpeg.Merge(Global.GetFiles(DownDir, \".ts\"), muxFormat, fastStart, poster, audioName, title, copyright, comment, encodingTool);\n                            }\n                        }\n                        else\n                        {\n                            LOGGER.PrintLine(strings.dolbyVisionContentMerging);\n                            Global.CombineMultipleFilesIntoSingleFile(Global.GetFiles(DownDir, \".ts\"), FFmpeg.OutPutPath + \".mp4\");\n                        }\n                    }\n\n                    LOGGER.WriteLine(strings.taskDone\n                        + \"\\r\\n\\r\\nTask End: \" + DateTime.Now.ToString(\"yyyy/MM/dd HH:mm:ss\")\n                        + \"\\r\\nFile: \" + FFmpeg.OutPutPath + \".\" + (MuxFormat == \"aac\" ? \"m4a\" : MuxFormat) + \"\\r\\n\\r\\n\");\n                    //Global.ExplorerFile(FFmpeg.OutPutPath + \".mp4\");\n                    //删除文件夹\n                    if (DelAfterDone)\n                    {\n                        try\n                        {\n                            DirectoryInfo directoryInfo = new DirectoryInfo(DownDir);\n                            directoryInfo.Delete(true);\n                        }\n                        catch (Exception) { }\n                    }\n                    if (externalAudio)  //下载独立音轨\n                    {\n                        externalAudio = false;\n                        DownloadedSize = 0;\n                        Global.WriteInit();\n                        LOGGER.PrintLine(strings.downloadingExternalAudioTrack, LOGGER.Warning);\n                        Parser parser = new Parser();\n                        parser.Headers = Headers; //继承Header\n                        parser.BaseUrl = \"\";\n                        parser.M3u8Url = externalAudioUrl;\n                        parser.DownName = DownName + \"(Audio)\";\n                        parser.DownDir = Path.Combine(Path.GetDirectoryName(DownDir), parser.DownName);\n                        LOGGER.WriteLine(strings.startParsing + externalAudioUrl);\n                        LOGGER.WriteLine(strings.downloadingExternalAudioTrack);\n                        DownName = parser.DownName;\n                        fflogName = \"_ffreport(Audio).log\";\n                        DownDir = parser.DownDir;\n                        parser.Parse();  //开始解析\n                        Thread.Sleep(1000);\n                        Global.HadReadInfo = false;\n                        Global.VIDEO_TYPE = \"\";\n                        Global.AUDIO_TYPE = \"\";\n                        DoDownload();\n                    }\n                    if (externalSub)  //下载独立字幕\n                    {\n                        externalSub = false;\n                        DownloadedSize = 0;\n                        Global.WriteInit();\n                        LOGGER.PrintLine(strings.downloadingExternalSubtitleTrack, LOGGER.Warning);\n                        Parser parser = new Parser();\n                        parser.Headers = Headers; //继承Header\n                        parser.BaseUrl = \"\";\n                        parser.M3u8Url = externalSubUrl;\n                        parser.DownName = DownName.Replace(\"(Audio)\", \"\") + \"(Subtitle)\";\n                        parser.DownDir = Path.Combine(Path.GetDirectoryName(DownDir), parser.DownName);\n                        LOGGER.WriteLine(strings.startParsing + externalSubUrl);\n                        LOGGER.WriteLine(strings.downloadingExternalSubtitleTrack);\n                        DownName = parser.DownName;\n                        fflogName = \"_ffreport(Subtitle).log\";\n                        DownDir = parser.DownDir;\n                        parser.Parse();  //开始解析\n                        Thread.Sleep(1000);\n                        Global.HadReadInfo = false;\n                        Global.VIDEO_TYPE = \"\";\n                        Global.AUDIO_TYPE = \"\";\n                        DoDownload();\n                    }\n                    LOGGER.PrintLine(strings.taskDone, LOGGER.Warning);\n                    Environment.Exit(0);  //正常退出程序\n                }\n                else\n                {\n                    Console.Title = \"Done.\";\n                    LOGGER.PrintLine(strings.taskDone, LOGGER.Warning);\n                    LOGGER.WriteLine(strings.taskDone\n                        + \"\\r\\n\\r\\nTask End: \" + DateTime.Now.ToString(\"yyyy/MM/dd HH:mm:ss\"));\n                    Environment.Exit(0);  //正常退出程序\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/Downloader.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace N_m3u8DL_CLI\n{\n    class Downloader\n    {\n        private int timeOut = 0;\n        private int retry = 5;\n        private int count = 0;\n        private int segIndex = 0;\n        private double segDur = 0;\n        private string fileUrl = string.Empty;\n        private string savePath = string.Empty;\n        private string headers = string.Empty;\n        private string method = string.Empty;\n        private string key = string.Empty;\n        private string iv = string.Empty;\n        private string liveFile = string.Empty;\n        private long expectByte = -1;\n        private long startByte = 0;\n        private bool isLive = false;\n        private bool isDone = false;\n        private bool firstSeg = true;\n        private FileStream liveStream = null;\n\n        public string FileUrl { get => fileUrl; set => fileUrl = value; }\n        public string SavePath { get => savePath; set => savePath = value; }\n        public string Headers { get => headers; set => headers = value; }\n        public string Method { get => method; set => method = value; }\n        public string Key { get => key; set => key = value; }\n        public string Iv { get => iv; set => iv = value; }\n        public bool IsLive { get => isLive; set => isLive = value; }\n        public int Retry { get => retry; set => retry = value; }\n        public bool IsDone { get => isDone; set => isDone = value; }\n        public int SegIndex { get => segIndex; set => segIndex = value; }\n        public int TimeOut { get => timeOut; set => timeOut = value; }\n        public FileStream LiveStream { get => liveStream; set => liveStream = value; }\n        public string LiveFile { get => liveFile; set => liveFile = value; }\n        public long ExpectByte { get => expectByte; set => expectByte = value; }\n        public long StartByte { get => startByte; set => startByte = value; }\n        public double SegDur { get => segDur; set => segDur = value; }\n        \n        public static bool EnableChaCha20 { get; set; } = false;\n        public static string ChaCha20KeyBase64 { get; set; }\n        public static string ChaCha20NonceBase64 { get; set; }\n\n        //重写WebClinet\n        //private class WebClient : System.Net.WebClient\n        //{\n        //    protected override WebRequest GetWebRequest(Uri uri)\n        //    {\n        //        WebRequest lWebRequest = base.GetWebRequest(uri);\n        //        lWebRequest.Timeout = TimeOut;\n        //        ((HttpWebRequest)lWebRequest).ReadWriteTimeout = TimeOut;\n        //        return lWebRequest;\n        //    }\n        //}\n\n        //WebClient client = new WebClient();\n\n\n        public void Down()\n        {\n            try\n            {\n                //直播下载\n                if (IsLive)\n                {\n                    IsDone = false;  //设置为未完成下载\n\n                    if (Method == \"NONE\" || method.Contains(\"NOTSUPPORTED\")) \n                    {\n                        LOGGER.PrintLine(\"<\" + SegIndex + \" Downloading>\");\n                        LOGGER.WriteLine(\"<\" + SegIndex + \" Downloading>\");\n                        byte[] segBuff = Global.HttpDownloadFileToBytes(fileUrl, Headers, TimeOut);\n                        //byte[] segBuff = Global.WebClientDownloadToBytes(fileUrl, Headers);\n                        Global.AppendBytesToFileStreamAndDoNotClose(LiveStream, segBuff);\n                        LOGGER.PrintLine(\"<\" + SegIndex + \" Complete>\\r\\n\");\n                        LOGGER.WriteLine(\"<\" + SegIndex + \" Complete>\");\n                        IsDone = true;\n                    }\n                    else if (Method == \"AES-128\")\n                    {\n                        LOGGER.PrintLine(\"<\" + SegIndex + \" Downloading>\");\n                        LOGGER.WriteLine(\"<\" + SegIndex + \" Downloading>\");\n                        byte[] encryptedBuff = Global.HttpDownloadFileToBytes(fileUrl, Headers, TimeOut);\n                        //byte[] encryptedBuff = Global.WebClientDownloadToBytes(fileUrl, Headers);\n                        byte[] decryptBuff = null;\n                        decryptBuff = Decrypter.AES128Decrypt(\n                            encryptedBuff,\n                            Convert.FromBase64String(Key),\n                            Decrypter.HexStringToBytes(Iv)\n                            );\n                        Global.AppendBytesToFileStreamAndDoNotClose(LiveStream, decryptBuff);\n                        LOGGER.PrintLine(\"<\" + SegIndex + \" Complete>\\r\\n\");\n                        LOGGER.WriteLine(\"<\" + SegIndex + \" Complete>\");\n                        IsDone = true;\n                    }\n                    else\n                    {\n                        //LOGGER.PrintLine(\"不支持这种加密方式!\", LOGGER.Error);\n                        IsDone = true;\n                    }\n                    if (firstSeg && Global.FileSize(LiveFile) != 0)\n                    {\n                        //LOGGER.STOPLOG = false;  //记录日志\n                        foreach (string ss in (string[])Global.GetVideoInfo(LiveFile).ToArray(typeof(string)))\n                        {\n                            LOGGER.WriteLine(ss.Trim());\n                        }\n                        firstSeg = false;\n                        //LOGGER.STOPLOG = true;  //停止记录日志\n                    }\n                    HLSLiveDownloader.REC_DUR += SegDur;\n                    if (HLSLiveDownloader.REC_DUR_LIMIT != -1 && HLSLiveDownloader.REC_DUR >= HLSLiveDownloader.REC_DUR_LIMIT) \n                    {\n                        LOGGER.PrintLine(strings.recordLimitReached, LOGGER.Warning);\n                        LOGGER.WriteLine(strings.recordLimitReached);\n                        Environment.Exit(0); //正常退出\n                    }\n                    return;\n                }\n                //点播下载\n                else\n                {\n                    if (!Directory.Exists(Path.GetDirectoryName(SavePath)))\n                        Directory.CreateDirectory(Path.GetDirectoryName(SavePath)); //新建文件夹  \n                    //是否存在文件，存在则不下载\n                    if (File.Exists(Path.GetDirectoryName(savePath) + \"\\\\\" + Path.GetFileNameWithoutExtension(savePath) + \".ts\"))\n                    {\n                        Global.BYTEDOWN++; //防止被速度监控程序杀死\n                        //Console.WriteLine(\"Exists \" + Path.GetFileNameWithoutExtension(savePath) + \".ts\");\n                        return;\n                    }\n                    //Console.WriteLine(\"开始下载 \" + fileUrl);\n                    //本地文件\n                    if (fileUrl.StartsWith(\"file:\"))\n                    {\n                        Uri t = new Uri(fileUrl);\n                        fileUrl = t.LocalPath;\n                        if (File.Exists(fileUrl))\n                        {\n                            if (ExpectByte == -1)  //没有RANGE\n                            {\n                                FileInfo fi = new FileInfo(fileUrl);\n                                fi.CopyTo(savePath);\n                                Global.BYTEDOWN += fi.Length;\n                            }\n                            else\n                            {\n                                FileStream stream = new FileInfo(fileUrl).OpenRead();\n                                //seek文件\n                                stream.Seek(StartByte, SeekOrigin.Begin);\n                                Byte[] buffer = new Byte[ExpectByte];\n                                //从流中读取字节块并将该数据写入给定缓冲区buffer中\n                                stream.Read(buffer, 0, Convert.ToInt32(buffer.Length));\n                                stream.Close();\n                                //写出文件\n                                MemoryStream m = new MemoryStream(buffer);\n                                FileStream fs = new FileStream(savePath, FileMode.OpenOrCreate);\n                                m.WriteTo(fs);\n                                m.Close();\n                                fs.Close();\n                                m = null;\n                                fs = null;\n                            }\n                        }\n                    }\n                    else\n                    {\n                        //下载\n                        Global.HttpDownloadFile(fileUrl, savePath, TimeOut, Headers, StartByte, ExpectByte);\n                    }\n                }\n                if (File.Exists(savePath) && Global.ShouldStop == false) \n                {\n                    FileInfo fi = new FileInfo(savePath);\n                    if (File.Exists(fi.FullName) && EnableChaCha20)\n                    {\n                        byte[] decryptBuff = Decrypter.CHACHA20Decrypt(File.ReadAllBytes(fi.FullName), Convert.FromBase64String(ChaCha20KeyBase64), Convert.FromBase64String(ChaCha20NonceBase64));\n                        FileStream fs = new FileStream(Path.GetDirectoryName(SavePath) + \"\\\\\" + Path.GetFileNameWithoutExtension(SavePath) + \".ts\", FileMode.Create);\n                        fs.Write(decryptBuff, 0, decryptBuff.Length);\n                        fs.Close();\n                        DownloadManager.DownloadedSize += fi.Length;\n                        fi.Delete();\n                    }\n                    else if (Method == \"NONE\" || Method.Contains(\"NOTSUPPORTED\"))\n                    {\n                        fi.MoveTo(Path.GetDirectoryName(SavePath) + \"\\\\\" + Path.GetFileNameWithoutExtension(SavePath) + \".ts\");\n                        DownloadManager.DownloadedSize += fi.Length;\n                        //Console.WriteLine(Path.GetFileNameWithoutExtension(savePath) + \" Completed.\");\n                    }\n                    else if (File.Exists(fi.FullName)\n                        && Method == \"AES-128\") \n                    {\n                        //解密\n                        try\n                        {\n                            byte[] decryptBuff = null;\n                            if(fileUrl.Contains(\".51cto.com/\")) //使用AES-128-ECB模式解密\n                            {\n                                decryptBuff = Decrypter.AES128Decrypt(\n                                    fi.FullName,\n                                    Convert.FromBase64String(Key),\n                                    Decrypter.HexStringToBytes(Iv),\n                                    System.Security.Cryptography.CipherMode.ECB\n                                    );\n                            }\n                            else\n                            {\n                                decryptBuff = Decrypter.AES128Decrypt(\n                                    fi.FullName,\n                                    Convert.FromBase64String(Key),\n                                    Decrypter.HexStringToBytes(Iv)\n                                    );\n                            }\n                            FileStream fs = new FileStream(Path.GetDirectoryName(savePath) + \"\\\\\" + Path.GetFileNameWithoutExtension(savePath) + \".ts\", FileMode.Create);\n                            fs.Write(decryptBuff, 0, decryptBuff.Length);\n                            fs.Close();\n                            DownloadManager.DownloadedSize += fi.Length;\n                            fi.Delete();\n                            //Console.WriteLine(Path.GetFileNameWithoutExtension(savePath) + \" Completed & Decrypted.\");\n                        }\n                        catch (Exception ex)\n                        {\n                            LOGGER.PrintLine(ex.Message, LOGGER.Error);\n                            LOGGER.WriteLineError(ex.Message);\n                            Thread.Sleep(3000);\n                            Environment.Exit(-1);\n                        }\n                    }\n                    else\n                    {\n                        LOGGER.WriteLineError(strings.SomethingWasWrong);\n                        LOGGER.PrintLine(strings.SomethingWasWrong, LOGGER.Error);\n                        return;\n                    }\n                    return;\n                }\n            }\n            catch (Exception ex)\n            {\n                LOGGER.WriteLineError(ex.Message);\n                if (ex.Message.Contains(\"404\") || ex.Message.Contains(\"400\"))//(400) 错误的请求,片段过期会提示400错误\n                {\n                    IsDone = true;\n                    return;\n                }\n                else if (IsLive && count++ < Retry) \n                {\n                    Thread.Sleep(2000);//直播一般3-6秒一个片段\n                    Down();\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "N_m3u8DL-CLI/FFmpeg.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace N_m3u8DL_CLI\n{\n    class FFmpeg\n    {\n        public static string FFMPEG_PATH = \"ffmpeg\";\n        public static string REC_TIME = \"\"; //录制日期\n\n        public static string OutPutPath { get; set; } = string.Empty;\n        public static string ReportFile { get; set; } = string.Empty;\n        public static bool UseAACFilter { get; set; } = false;  //是否启用滤镜\n        public static bool WriteDate { get; set; } = true;  //是否写入录制日期\n\n        public static void Merge(string[] files, string muxFormat, bool fastStart,\n            string poster = \"\", string audioName = \"\", string title = \"\",\n            string copyright = \"\", string comment = \"\", string encodingTool = \"\")\n        {\n            string dateString = string.IsNullOrEmpty(REC_TIME) ? DateTime.Now.ToString(\"o\") : REC_TIME;\n\n            //同名文件已存在的共存策略\n            if (File.Exists($\"{OutPutPath}.{muxFormat.ToLower()}\")) \n            {\n                OutPutPath = Path.Combine(Path.GetDirectoryName(OutPutPath),\n                    Path.GetFileName(OutPutPath) + \"_\" + DateTime.Now.ToString(\"yyyy-MM-dd_HH-mm-ss\"));\n            }\n\n            string command = \"-loglevel warning -i concat:\\\"\";\n            string data = string.Empty;\n            string ddpAudio = string.Empty;\n            string addPoster = \"-map 1 -c:v:1 copy -disposition:v:1 attached_pic\";\n            ddpAudio = (File.Exists($\"{Path.GetFileNameWithoutExtension(OutPutPath + \".mp4\")}.txt\") ? File.ReadAllText($\"{Path.GetFileNameWithoutExtension(OutPutPath + \".mp4\")}.txt\") : \"\") ;\n            if (!string.IsNullOrEmpty(ddpAudio)) UseAACFilter = false;\n\n\n            foreach (string t in files)\n            {\n                command += Path.GetFileName(t) + \"|\";\n            }\n\n            switch (muxFormat.ToUpper())\n            {\n                case (\"MP4\"):\n                    command += \"\\\" \" + (string.IsNullOrEmpty(poster) ? \"\" : \"-i \\\"\" + poster + \"\\\"\");\n                    command += \" \" + (string.IsNullOrEmpty(ddpAudio) ? \"\" : \"-i \\\"\" + ddpAudio + \"\\\"\");\n                    command +=\n                        $\" -map 0:v? {(string.IsNullOrEmpty(ddpAudio) ? \"-map 0:a?\" : $\"-map {(string.IsNullOrEmpty(poster) ? \"1\" : \"2\")}:a -map 0:a?\")} -map 0:s? \" + (string.IsNullOrEmpty(poster) ? \"\" : addPoster)\n                        + (WriteDate ? \" -metadata date=\\\"\" + dateString + \"\\\"\" : \"\") +\n                        \" -metadata encoding_tool=\\\"\" + encodingTool + \"\\\" -metadata title=\\\"\" + title +\n                        \"\\\" -metadata copyright=\\\"\" + copyright + \"\\\" -metadata comment=\\\"\" + comment +\n                        $\"\\\" -metadata:s:a:{(string.IsNullOrEmpty(ddpAudio) ? \"0\" : \"1\")} handler_name=\\\"\" + audioName + $\"\\\" -metadata:s:a:{(string.IsNullOrEmpty(ddpAudio) ? \"0\" : \"1\")} handler=\\\"\" + audioName + \"\\\" \";\n                    command += (string.IsNullOrEmpty(ddpAudio) ? \"\" : \" -metadata:s:a:0 handler_name=\\\"DD+\\\" -metadata:s:a:0 handler=\\\"DD+\\\" \");\n                    if (fastStart)\n                        command += \"-movflags +faststart\";\n                    command += \"  -c copy -y \" + (UseAACFilter ? \"-bsf:a aac_adtstoasc\" : \"\") + \" \\\"\" + OutPutPath + \".mp4\\\"\";\n                    break;\n                case (\"MKV\"):\n                    command += \"\\\" -map 0  -c copy -y \" + (UseAACFilter ? \"-bsf:a aac_adtstoasc\" : \"\") + \" \\\"\" + OutPutPath + \".mkv\\\"\";\n                    break;\n                case (\"FLV\"):\n                    command += \"\\\" -map 0  -c copy -y \" + (UseAACFilter ? \"-bsf:a aac_adtstoasc\" : \"\") + \" \\\"\" + OutPutPath + \".flv\\\"\";\n                    break;\n                case (\"TS\"):\n                    command += \"\\\" -map 0  -c copy -y -f mpegts -bsf:v h264_mp4toannexb \\\"\" + OutPutPath + \".ts\\\"\";\n                    break;\n                case (\"VTT\"):\n                    command += \"\\\" -map 0  -y \\\"\" + OutPutPath + \".srt\\\"\";  //Convert To Srt\n                    break;\n                case (\"EAC3\"):\n                    command += \"\\\" -map 0:a -c copy -y \\\"\" + OutPutPath + \".eac3\\\"\";\n                    break;\n                case (\"AAC\"):\n                    command += \"\\\" -map 0:a -c copy -y \\\"\" + OutPutPath + \".m4a\\\"\";\n                    break;\n                case (\"AC3\"):\n                    command += \"\\\" -map 0:a -c copy -y \\\"\" + OutPutPath + \".ac3\\\"\";\n                    break;\n\n            }\n\n            Run(FFMPEG_PATH, command, Path.GetDirectoryName(files[0]));\n            LOGGER.WriteLine(strings.ffmpegDone);\n            //Console.WriteLine(command);\n        }\n\n        public static void ConvertToMPEGTS(string file)\n        {\n            if (Global.VIDEO_TYPE == \"H264\")\n            {\n                Run(FFMPEG_PATH,\n                    \"-loglevel quiet -i \\\"\" + file + \"\\\" -map 0 -c copy -copy_unknown -f mpegts -bsf:v h264_mp4toannexb \\\"\"\n                    + Path.GetFileNameWithoutExtension(file) + \"[MPEGTS].ts\\\"\", \n                    Path.GetDirectoryName(file));\n                if (File.Exists(Path.GetDirectoryName(file) + \"\\\\\" + Path.GetFileNameWithoutExtension(file) + \"[MPEGTS].ts\"))\n                {\n                    File.Delete(file);\n                    File.Move(Path.GetDirectoryName(file) + \"\\\\\" + Path.GetFileNameWithoutExtension(file) + \"[MPEGTS].ts\", file);\n                }\n            }\n            else if (Global.VIDEO_TYPE == \"H265\")\n            {\n                Run(FFMPEG_PATH,\n                    \"-loglevel quiet -i \\\"\" + file + \"\\\" -map 0 -c copy -copy_unknown -f mpegts -bsf:v hevc_mp4toannexb \\\"\"\n                    + Path.GetFileNameWithoutExtension(file) + \"[MPEGTS].ts\\\"\",\n                    Path.GetDirectoryName(file));\n                if (File.Exists(Path.GetDirectoryName(file) + \"\\\\\" + Path.GetFileNameWithoutExtension(file) + \"[MPEGTS].ts\"))\n                {\n                    File.Delete(file);\n                    File.Move(Path.GetDirectoryName(file) + \"\\\\\" + Path.GetFileNameWithoutExtension(file) + \"[MPEGTS].ts\", file);\n                }\n            }\n            else\n            {\n                LOGGER.WriteLineError(\"Unkown Video Type\");\n            }\n        }\n\n        public static void Run(string path, string args, string workDir)\n        {\n            string nowDir = Directory.GetCurrentDirectory();  //当前工作路径\n            Directory.SetCurrentDirectory(workDir);\n            Process p = new Process();//建立外部调用线程\n            p.StartInfo.FileName = path;//要调用外部程序的绝对路径\n            Environment.SetEnvironmentVariable(\"FFREPORT\", \"file=\" + ReportFile + \":level=32\"); //兼容XP系统\n            //p.StartInfo.Environment.Add(\"FFREPORT\", \"file=\" + ReportFile + \":level=32\");\n            p.StartInfo.Arguments = args;//参数(这里就是FFMPEG的参数了)\n            p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)\n            p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的...这是我耗费了2个多月得出来的经验...mencoder就是用standardOutput来捕获的)\n            p.StartInfo.CreateNoWindow = false;//不创建进程窗口\n            p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN\n            p.StartInfo.StandardErrorEncoding = Encoding.UTF8;\n            p.Start();//启动线程\n            p.BeginErrorReadLine();//开始异步读取\n            p.WaitForExit();//阻塞等待进程结束\n            p.Close();//关闭进程\n            p.Dispose();//释放资源\n            Environment.SetEnvironmentVariable(\"FFREPORT\", null); //兼容XP系统\n            Directory.SetCurrentDirectory(nowDir);\n        }\n\n        private static void Output(object sendProcess, DataReceivedEventArgs output)\n        {\n            if (!String.IsNullOrEmpty(output.Data))\n            {\n                LOGGER.PrintLine(output.Data, LOGGER.Warning);\n            }\n        }\n\n        public static bool CheckMPEGTS(string file)\n        {\n            //放行杜比视界或纯音频文件\n            if (Global.VIDEO_TYPE == \"DV\" || Global.AUDIO_TYPE != \"\")\n                return true;\n            //如果是多分片，也认为不是MPEGTS\n            if (DownloadManager.PartsCount > 1)\n                return false;\n\n            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) \n            {\n                byte[] firstByte = new byte[1];\n                fs.Read(firstByte, 0, 1);\n                //第一字节的16进制字符串\n                string _1_byte_str = Convert.ToString(firstByte[0], 16);\n                //syncword不为47就不处理\n                if (_1_byte_str != \"47\")\n                    return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/Global.cs",
    "content": "﻿using BrotliSharpLib;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Net;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading;\n\nnamespace N_m3u8DL_CLI\n{\n    class Global\n    {\n        private volatile static bool shouldStop = false;\n        public static long BYTEDOWN = 0;\n        public static long STOP_SPEED = 0; //KB 小于此值自动重试\n        public static long MAX_SPEED = 0; //KB 速度上限\n        public static string VIDEO_TYPE = \"\";\n        public static string AUDIO_TYPE = \"\";\n        public static bool HadReadInfo = false;\n        private static bool noProxy = false;\n        private static string useProxyAddress = \"\";\n\n        public static bool ShouldStop { get => shouldStop; set => shouldStop = value; }\n        public static bool NoProxy { get => noProxy; set => noProxy = value; }\n        public static string UseProxyAddress { get => useProxyAddress; set => useProxyAddress = value; }\n\n\n        /*===============================================================================*/\n        static Version ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;\n        static string nowVer = $\"{ver.Major}.{ver.Minor}.{ver.Build}\";\n        static string nowDate = \"20220711\";\n        public static void WriteInit()\n        {\n            Console.WriteLine($\"N_m3u8DL-CLI version {nowVer} 2018-2022\");\n            Console.WriteLine($\"  built date: {nowDate}\");\n            Console.WriteLine();\n        }\n\n        public static void CheckUpdate()\n        {\n            try\n            {\n                string redirctUrl = Get302(\"https://github.com/nilaoda/N_m3u8DL-CLI/releases/latest\");\n                string latestVer = redirctUrl.Replace(\"https://github.com/nilaoda/N_m3u8DL-CLI/releases/tag/\", \"\");\n                if (nowVer != latestVer && !latestVer.StartsWith(\"https\"))\n                {\n                    Console.Title = string.Format(strings.newerVisionDetected, latestVer);\n                    try\n                    {\n                        //尝试下载新版本\n                        string url = $\"https://mirror.ghproxy.com/https://github.com/nilaoda/N_m3u8DL-CLI/releases/download/{latestVer}/N_m3u8DL-CLI_v{latestVer}.exe\";\n                        if (File.Exists(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), $\"N_m3u8DL-CLI_v{latestVer}.exe\")))\n                        {\n                            Console.Title = string.Format(strings.newerVerisonDownloaded, latestVer);\n                            return;\n                        }\n                        HttpDownloadFile(url, Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), $\"N_m3u8DL-CLI_v{latestVer}.exe\"));\n                        if (File.Exists(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), $\"N_m3u8DL-CLI_v{latestVer}.exe\")))\n                            Console.Title = string.Format(strings.newerVerisonDownloaded, latestVer);\n                        else\n                            Console.Title = string.Format(strings.newerVerisonDownloadFailed, latestVer);\n                    }\n                    catch (Exception)\n                    {\n                        ;\n                    }\n                }\n            }\n            catch (Exception)\n            {\n                ;\n            }\n        }\n\n        public static string GetValidFileName(string input, string re = \".\")\n        {\n            string title = input;\n            foreach (char invalidChar in Path.GetInvalidFileNameChars())\n            {\n                title = title.Replace(invalidChar.ToString(), re);\n            }\n            return title;\n        }\n\n        // parseInt(s, radix)\n        public static int GetNum(string str, int numBase)\n        {\n            return Convert.ToInt32(Microsoft.JScript.GlobalObject.parseInt(str, numBase)); \n        }\n        \n        // 统一设置代理\n        // 替换 else if (UseProxyAddress != \"\") {\n        //      WebProxy proxy = new WebProxy(UseProxyAddress);\n        //      webRequest.Proxy = proxy;\n        // }\n        public static void SetProxy(WebRequest webRequest)\n        {\n            var g_ProxyAddress = UseProxyAddress;\n            if (g_ProxyAddress.StartsWith(\"http://\"))\n            {\n                WebProxy proxy = new WebProxy(g_ProxyAddress);\n                //proxy.Credentials = new NetworkCredential(username, password);                     \n                webRequest.Proxy = proxy;\n            }\n\n            // socks5\n            if (g_ProxyAddress.StartsWith(\"socks5://\"))\n            {\n                string input = g_ProxyAddress.Remove(0, 9);\n                if (input.EndsWith(\"/\"))\n                {\n                    input = input.Remove(input.LastIndexOf('/'), 1);\n                }\n\n                string[] addr = input.Split(':');\n                //LOGGER.PrintLine(\"addr Length :\" + addr.Length);\n                if (addr.Length == 2)\n                {\n                    int port = 0;\n                    if (int.TryParse(addr[1], out port))\n                    {\n                        var proxySocks5 = new MihaZupan.HttpToSocks5Proxy(addr[0], int.Parse(addr[1]));\n                        webRequest.Proxy = proxySocks5;\n                        //LOGGER.PrintLine(\"sock5 :\" + addr[0] + \":\" + addr[1]);\n                    }\n                }\n                else\n                {\n                    LOGGER.PrintLine(\"Socks5addr String Length : \" + addr.Length);\n                }\n            }\n        }\n\n        //获取网页源码\n        public static string GetWebSource(String url, string headers = \"\", int TimeOut = 60000)\n        {\n            string htmlCode = string.Empty;\n            for (int i = 0; i < 5; i++)\n            {\n                try\n                {\n                reProcess:\n                    HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);\n                    webRequest.Method = \"GET\";\n                    if (NoProxy)\n                    {\n                        webRequest.Proxy = null;\n                    }\n                    else if (UseProxyAddress != \"\")\n                    {\n                        SetProxy(webRequest);\n                    }\n                    webRequest.UserAgent = \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36\";\n                    webRequest.Accept = \"*/*\";\n                    webRequest.Headers.Add(\"Accept-Encoding\", \"gzip, deflate, br\");\n                    webRequest.Timeout = TimeOut;  //设置超时\n                    webRequest.KeepAlive = false;\n                    webRequest.AllowAutoRedirect = false; //手动处理重定向，否则会丢失Referer\n                    if (url.Contains(\"pcvideo\") && url.Contains(\".titan.mgtv.com\"))\n                    {\n                        webRequest.UserAgent = \"\";\n                        if (!url.Contains(\"/internettv/\"))\n                            webRequest.Referer = \"https://www.mgtv.com\";\n                        webRequest.Headers.Add(\"Cookie\", \"MQGUID\");\n                    }\n                    //添加headers\n                    if (headers != \"\")\n                    {\n                        foreach (string att in headers.Split('|'))\n                        {\n                            try\n                            {\n                                if (att.Split(':')[0].ToLower() == \"referer\")\n                                    webRequest.Referer = att.Substring(att.IndexOf(\":\") + 1);\n                                else if (att.Split(':')[0].ToLower() == \"user-agent\")\n                                    webRequest.UserAgent = att.Substring(att.IndexOf(\":\") + 1);\n                                else if (att.Split(':')[0].ToLower() == \"range\")\n                                    webRequest.AddRange(Convert.ToInt32(att.Substring(att.IndexOf(\":\") + 1).Split('-')[0], Convert.ToInt32(att.Substring(att.IndexOf(\":\") + 1).Split('-')[1])));\n                                else if (att.Split(':')[0].ToLower() == \"accept\")\n                                    webRequest.Accept = att.Substring(att.IndexOf(\":\") + 1);\n                                else\n                                    webRequest.Headers.Add(att);\n                            }\n                            catch (Exception e)\n                            {\n                                LOGGER.WriteLineError(e.Message);\n                            }\n                        }\n                    }\n                    HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();\n\n                    //302\n                    if (webResponse.Headers.Get(\"Location\") != null)\n                    {\n                        url = webResponse.Headers.Get(\"Location\");\n                        webResponse.Close();\n                        goto reProcess;\n                    }\n\n                    //文件过大则认为不是m3u8\n                    if (webResponse.ContentLength != -1 && webResponse.ContentLength > 50 * 1024 * 1024) return \"\";\n\n                    if (webResponse.ContentEncoding != null\n                        && webResponse.ContentEncoding.ToLower() == \"gzip\") //如果使用了GZip则先解压\n                    {\n                        using (Stream streamReceive = webResponse.GetResponseStream())\n                        {\n                            using (var zipStream =\n                                new System.IO.Compression.GZipStream(streamReceive, System.IO.Compression.CompressionMode.Decompress))\n                            {\n                                using (StreamReader sr = new StreamReader(zipStream, Encoding.UTF8))\n                                {\n                                    htmlCode = sr.ReadToEnd();\n                                }\n                            }\n                        }\n                    }\n                    else if (webResponse.ContentEncoding != null\n                        && webResponse.ContentEncoding.ToLower() == \"br\") //如果使用了Brotli则先解压\n                    {\n                        using (Stream streamReceive = webResponse.GetResponseStream())\n                        {\n                            using (var bs = new BrotliStream(streamReceive, CompressionMode.Decompress))\n                            {\n                                using (StreamReader sr = new StreamReader(bs, Encoding.UTF8))\n                                {\n                                    htmlCode = sr.ReadToEnd();\n                                }\n                            }\n                        }\n                    }\n                    else\n                    {\n                        using (Stream streamReceive = webResponse.GetResponseStream())\n                        {\n                            using (StreamReader sr = new StreamReader(streamReceive, Encoding.UTF8))\n                            {\n                                htmlCode = sr.ReadToEnd();\n                            }\n                        }\n                    }\n\n                    if (webResponse != null)\n                    {\n                        webResponse.Close();\n                    }\n                    if (webRequest != null)\n                    {\n                        webRequest.Abort();\n                    }\n                    break;\n                }\n                catch (Exception e)  //捕获所有异常\n                {\n                    LOGGER.WriteLine(e.Message);\n                    LOGGER.WriteLineError(e.Message);\n                    Thread.Sleep(1000); //1秒后重试\n                    continue;\n                }\n            }\n\n            return htmlCode;\n        }\n\n        [DllImport(\"shell32.dll\", ExactSpelling = true)]\n        private static extern void ILFree(IntPtr pidlList);\n        [DllImport(\"shell32.dll\", CharSet = CharSet.Unicode, ExactSpelling = true)]\n        private static extern IntPtr ILCreateFromPathW(string pszPath);\n        [DllImport(\"shell32.dll\", ExactSpelling = true)]\n        private static extern int SHOpenFolderAndSelectItems(IntPtr pidlList, uint cild, IntPtr children, uint dwFlags);\n\n        //参数：\n        //  string dir 指定的文件夹\n        //  string ext 文件类型的扩展名，如\".txt\" , “.exe\"\n        public static int GetFileCount(string dir, string ext)\n        {\n            if (!Directory.Exists(dir)) \n                return 0;\n\n            int count = 0;\n            DirectoryInfo d = new DirectoryInfo(dir);\n            foreach (FileInfo fi in d.GetFiles())\n            {\n                if (fi.Extension.ToUpper() == ext.ToUpper())\n                {\n                    count++;\n                }\n            }\n            return count;\n        }\n        \n        /// <summary>\n        /// 寻找指定目录下指定后缀的文件的详细路径 如\".txt\"\n        /// </summary>\n        /// <param name=\"dir\"></param>\n        /// <param name=\"ext\"></param>\n        /// <returns></returns>\n        public static string[] GetFiles(string dir, string ext)\n        {\n            ArrayList al = new ArrayList();\n            StringBuilder sb = new StringBuilder();\n            DirectoryInfo d = new DirectoryInfo(dir);\n            foreach (FileInfo fi in d.GetFiles())\n            {\n                if (fi.Extension.ToUpper() == ext.ToUpper())\n                {\n                    al.Add(fi.FullName);\n                }\n            }\n            string[] res = (string[])al.ToArray(typeof(string));\n            Array.Sort(res); //排序\n            return res;\n        }\n\n        /// <summary>  \n        /// 获取url字符串参数，返回参数值字符串  \n        /// </summary>  \n        /// <param name=\"name\">参数名称</param>  \n        /// <param name=\"url\">url字符串</param>  \n        /// <returns></returns>  \n        public static string GetQueryString(string name, string url)\n        {\n            Regex re = new Regex(@\"(^|&)?(\\w+)=([^&]+)(&|$)?\", System.Text.RegularExpressions.RegexOptions.Compiled);\n            MatchCollection mc = re.Matches(url);\n            foreach (Match m in mc)\n            {\n                if (m.Result(\"$2\").Equals(name))\n                {\n                    return m.Result(\"$3\");\n                }\n            }\n            return \"\";\n        }\n\n        //大量文件分部分二进制合并\n        public static void PartialCombineMultipleFiles(string[] files)\n        {\n            int div = 0;\n            if (files.Length <= 90000)\n                div = 100;\n            else\n                div = 200;\n\n            string outputName = Path.GetDirectoryName(files[0]) + \"\\\\T\";\n            int index = 0; //序号\n\n            //按照div的容量分割为小数组\n            string[][] li = Enumerable.Range(0, files.Count() / div + 1).Select(x => files.Skip(x * div).Take(div).ToArray()).ToArray();\n            foreach (var items in li)\n            {\n                if (items.Count() == 0) \n                    continue;\n                CombineMultipleFilesIntoSingleFile(items, outputName + index.ToString(\"0000\") + \".ts\");\n                //合并后删除这些文件\n                foreach (var item in items)\n                {\n                    File.Delete(item);\n                }\n                index++;\n            }\n        }\n\n        /// <summary>\n        /// 输入一堆已存在的文件，合并到新文件\n        /// </summary>\n        /// <param name=\"files\"></param>\n        /// <param name=\"outputFilePath\"></param>\n        public static void CombineMultipleFilesIntoSingleFile(string[] files, string outputFilePath)\n        {\n            //同名文件已存在的共存策略\n            if (File.Exists(outputFilePath))\n            {\n                outputFilePath = Path.Combine(Path.GetDirectoryName(outputFilePath),\n                    Path.GetFileNameWithoutExtension(outputFilePath) + \"_\" + DateTime.Now.ToString(\"yyyy-MM-dd_HH-mm-ss\") + Path.GetExtension(outputFilePath));\n            }\n            if (files.Length == 1)\n            {\n                FileInfo fi = new FileInfo(files[0]);\n                fi.MoveTo(outputFilePath);\n                return;\n            }\n\n            if (!Directory.Exists(Path.GetDirectoryName(outputFilePath)))\n                Directory.CreateDirectory(Path.GetDirectoryName(outputFilePath));\n\n            string[] inputFilePaths = files;\n            using (var outputStream = File.Create(outputFilePath))\n            {\n                foreach (var inputFilePath in inputFilePaths)\n                {\n                    if (inputFilePath == \"\")\n                        continue;\n                    using (var inputStream = File.OpenRead(inputFilePath))\n                    {\n                        // Buffer size can be passed as the second argument.\n                        inputStream.CopyTo(outputStream);\n                    }\n                    //Console.WriteLine(\"The file {0} has been processed.\", inputFilePath);\n                }\n            }\n            //Global.ExplorerFile(outputFilePath);\n        }\n        \n\n\n        /// <summary>\n        /// 将一个字节流附加至文件流\n        /// </summary>\n        /// <param name=\"liveStream\"></param>\n        /// <param name=\"file\"></param>\n        public static void AppendBytesToFileStreamAndDoNotClose(FileStream liveStream, byte[] file)\n        {\n            FileStream outputStream = liveStream;\n            using (var inputStream = new MemoryStream(file))\n            {\n                inputStream.CopyTo(outputStream);\n            }\n        }\n\n        //重定向\n        public static string Get302(string url, string headers = \"\", int timeout = 5000)\n        {\n            try\n            {\n                string redirectUrl;\n                WebRequest myRequest = WebRequest.Create(url);\n                myRequest.Timeout = timeout;\n                if (NoProxy)\n                {\n                    myRequest.Proxy = null;\n                }\n                else if (UseProxyAddress != \"\")\n                {\n                    SetProxy(myRequest);\n                }\n                //添加headers\n                if (headers != \"\")\n                {\n                    foreach (string att in headers.Split('|'))\n                    {\n                        try\n                        {\n                            myRequest.Headers.Add(att);\n                        }\n                        catch (Exception)\n                        {\n\n                        }\n                    }\n                }\n                WebResponse myResponse = myRequest.GetResponse();\n                redirectUrl = myResponse.ResponseUri.ToString();\n                myResponse.Close();\n                return redirectUrl;\n            }\n            catch (Exception) { return url; }\n        }\n\n        /// <summary>\n        /// 下载文件为字节流\n        /// </summary>\n        /// <param name=\"url\"></param>\n        /// <param name=\"timeOut\"></param>\n        /// <returns></returns>\n        public static byte[] HttpDownloadFileToBytes(string url, string headers = \"\", int timeOut = 60000)\n        {\n            //本地文件\n            if (url.StartsWith(\"file:\"))\n            {\n                Uri t = new Uri(url);\n                url = t.LocalPath;\n                if (File.Exists(url))\n                {\n                    FileStream fs = new FileStream(url, FileMode.Open, FileAccess.Read);\n                    byte[] infbytes = new byte[(int)fs.Length];\n                    fs.Read(infbytes, 0, infbytes.Length);\n                    fs.Close();\n                    return infbytes;\n                }\n            }\n\n        reProcess:\n            byte[] arraryByte;\n            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);\n            req.Method = \"GET\";\n            req.Timeout = timeOut;\n            req.ReadWriteTimeout = timeOut; //重要\n            req.AllowAutoRedirect = false; //手动处理重定向，否则会丢失Referer\n            if (NoProxy)\n            {\n                req.Proxy = null;\n            }\n            else if (UseProxyAddress != \"\")\n            {\n                SetProxy(req);\n            }\n            req.Headers.Add(\"Accept-Encoding\", \"gzip, deflate\");\n            req.Accept = \"*/*\";\n            req.UserAgent = \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36\";\n            //添加headers\n            if (headers != \"\")\n            {\n                foreach (string att in headers.Split('|'))\n                {\n                    try\n                    {\n                        if (att.Split(':')[0].ToLower() == \"referer\")\n                            req.Referer = att.Substring(att.IndexOf(\":\") + 1);\n                        else if (att.Split(':')[0].ToLower() == \"user-agent\")\n                            req.UserAgent = att.Substring(att.IndexOf(\":\") + 1);\n                        else if (att.Split(':')[0].ToLower() == \"range\")\n                            req.AddRange(Convert.ToInt32(att.Substring(att.IndexOf(\":\") + 1).Split('-')[0], Convert.ToInt32(att.Substring(att.IndexOf(\":\") + 1).Split('-')[1])));\n                        else if (att.Split(':')[0].ToLower() == \"accept\")\n                            req.Accept = att.Substring(att.IndexOf(\":\") + 1);\n                        else\n                            req.Headers.Add(att);\n                    }\n                    catch (Exception e)\n                    {\n                        LOGGER.WriteLineError(e.Message);\n                    }\n                }\n            }\n\n            using (HttpWebResponse wr = (HttpWebResponse)req.GetResponse())\n            {\n                //302\n                if (wr.Headers.Get(\"Location\") != null)\n                {\n                    url = wr.Headers.Get(\"Location\");\n                    wr.Close();\n                    goto reProcess;\n                }\n                if (wr.ContentEncoding != null && wr.ContentEncoding.ToLower() == \"gzip\") //如果使用了GZip则先解压\n                {\n                    using (Stream streamReceive = wr.GetResponseStream())\n                    {\n                        using (var zipStream =\n                            new System.IO.Compression.GZipStream(streamReceive, System.IO.Compression.CompressionMode.Decompress))\n                        {\n                            //读取到内存\n                            MemoryStream stmMemory = new MemoryStream();\n                            Stream responseStream = zipStream;\n\n                            byte[] bArr = new byte[1024];\n                            int size = responseStream.Read(bArr, 0, (int)bArr.Length);\n                            while (size > 0)\n                            {\n                                stmMemory.Write(bArr, 0, size);\n                                size = responseStream.Read(bArr, 0, (int)bArr.Length);\n                            }\n                            arraryByte = stmMemory.ToArray();\n                            responseStream.Close();\n                            stmMemory.Close();\n                        }\n                    }\n                }\n                else\n                {\n                    using (Stream streamReceive = wr.GetResponseStream())\n                    {\n                        //读取到内存\n                        MemoryStream stmMemory = new MemoryStream();\n                        Stream responseStream = streamReceive;\n\n                        byte[] bArr = new byte[1024];\n                        int size = responseStream.Read(bArr, 0, (int)bArr.Length);\n                        while (size > 0)\n                        {\n                            stmMemory.Write(bArr, 0, size);\n                            size = responseStream.Read(bArr, 0, (int)bArr.Length);\n                        }\n                        arraryByte = stmMemory.ToArray();\n                        responseStream.Close();\n                        stmMemory.Close();\n                    }\n                }\n            }\n            return arraryByte;\n        }\n\n        /// <summary>\n        /// Http下载文件\n        /// </summary>\n        public static void HttpDownloadFile(string url, string path, int timeOut = 20000, string headers = \"\", long startByte = 0, long expectByte = -1)\n        {\n            int retry = 0;\n            reDownload:\n            try\n            {\n                if (File.Exists(path))\n                    File.Delete(path);\n                if (shouldStop)\n                    return;\n\n                reProcess:\n                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;\n                request.Timeout = timeOut;\n                request.ReadWriteTimeout = timeOut; //重要\n                request.AllowAutoRedirect = false; //手动处理重定向，否则会丢失Referer\n                request.KeepAlive = false;\n                request.Method = \"GET\";\n                if (NoProxy)\n                {\n                    request.Proxy = null;\n                }\n                else if (UseProxyAddress != \"\")\n                {\n                    SetProxy(request);\n                }\n                if (url.Contains(\"data.video.iqiyi.com\"))\n                    request.UserAgent = \"QYPlayer/Android/4.4.5;NetType/3G;QTP/1.1.4.3\";\n                else if (url.Contains(\"pcvideo\") && url.Contains(\".titan.mgtv.com\"))\n                {\n                    request.UserAgent = \"\";\n                    if (!url.Contains(\"/internettv/\"))\n                        request.Referer = \"https://www.mgtv.com\";\n                    request.Headers.Add(\"Cookie\", \"MQGUID\");\n                }\n                else if (url.Contains(\".xboku.com/\")) //独播库\n                {\n                    request.Referer = \"https://my.duboku.vip/static/player/videojs.html\";\n                }\n                else\n                    request.UserAgent = \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36\";\n                //下载部分字节\n                if (expectByte != -1)\n                    request.AddRange(\"bytes\", startByte, startByte + expectByte - 1);\n                //添加headers\n                if (headers != \"\")\n                {\n                    foreach (string att in headers.Split('|'))\n                    {\n                        try\n                        {\n                            if (att.Split(':')[0].ToLower() == \"referer\")\n                                request.Referer = att.Substring(att.IndexOf(\":\") + 1);\n                            else if (att.Split(':')[0].ToLower() == \"user-agent\")\n                                request.UserAgent = att.Substring(att.IndexOf(\":\") + 1);\n                            else if (att.Split(':')[0].ToLower() == \"range\")\n                                request.AddRange(Convert.ToInt32(att.Substring(att.IndexOf(\":\") + 1).Split('-')[0], Convert.ToInt32(att.Substring(att.IndexOf(\":\") + 1).Split('-')[1])));\n                            else if (att.Split(':')[0].ToLower() == \"accept\")\n                                request.Accept = att.Substring(att.IndexOf(\":\") + 1);\n                            else\n                                request.Headers.Add(att);\n                        }\n                        catch (Exception e)\n                        {\n                            LOGGER.WriteLineError(e.Message);\n                        }\n                    }\n                }\n\n                long totalLen = 0;\n                long downLen = 0;\n                bool pngHeader = false; //PNG HEADER检测\n                using (var response = (HttpWebResponse)request.GetResponse())\n                {\n                    //302\n                    if (response.Headers.Get(\"Location\") != null)\n                    {\n                        url = response.Headers.Get(\"Location\");\n                        response.Close();\n                        goto reProcess;\n                    }\n                    using (var responseStream = response.GetResponseStream())\n                    {\n                        using (var stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write))\n                        {\n                            //responseStream.CopyTo(stream);\n                            totalLen = response.ContentLength;\n                            byte[] bArr = new byte[1024];\n                            int size = responseStream.Read(bArr, 0, (int)bArr.Length);\n                            if (!pngHeader && size > 3 && 137 == bArr[0] && 80 == bArr[1] && 78 == bArr[2] && 71 == bArr[3])\n                            {\n                                pngHeader = true;\n                            }\n                            //GIF HEADER检测\n                            if (!pngHeader && size > 3 && 0x47 == bArr[0] && 0x49 == bArr[1] && 0x46 == bArr[2] && 0x38 == bArr[3])\n                            {\n                                bArr = bArr.Skip(42).ToArray();\n                                size -= 42;\n                                downLen += 42;\n                            }\n                            //BMP HEADER检测\n                            if (!pngHeader && size > 10 && 0x42 == bArr[0] && 0x4D == bArr[1] && 0x00 == bArr[5] && 0x00 == bArr[6] && 0x00 == bArr[7] && 0x00 == bArr[8])\n                            {\n                                bArr = bArr.Skip(0x3E).ToArray();\n                                size -= 0x3E;\n                                downLen += 0x3E;\n                            }\n                            while (size > 0)\n                            {\n                                stream.Write(bArr, 0, size);\n                                downLen += size;\n                                BYTEDOWN += size; //计算下载速度\n                                if (MAX_SPEED != 0)\n                                    while (BYTEDOWN >= MAX_SPEED * 1024 * DownloadManager.CalcTime)  //限速\n                                    {\n                                        Thread.Sleep(1);\n                                    }\n                                size = responseStream.Read(bArr, 0, (int)bArr.Length);\n                                if (shouldStop)\n                                {\n                                    request.Abort();\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                }\n                if (shouldStop)\n                    try { File.Delete(path); } catch (Exception) { }\n                if (totalLen != -1 && downLen != totalLen)\n                    try { File.Delete(path); } catch (Exception) { }\n                if (pngHeader)\n                    TrySkipPngHeader(path);\n\n            }\n            catch (Exception e)\n            {\n                LOGGER.WriteLineError(\"DOWN: \" + e.Message + \" \" + url);\n                try { File.Delete(path); } catch (Exception) { }\n                if (retry++ < 3)\n                {\n                    Thread.Sleep(1000);\n                    LOGGER.WriteLineError($\"DOWN: AUTO RETRY {retry}/3 \" + url);\n                    goto reDownload;\n                }\n            }\n        }\n\n        /// <summary>\n        /// 用于处理利用图床上传TS导致前面被插入PNG Header的情况\n        /// </summary>\n        /// <param name=\"filePath\"></param>\n        public static void TrySkipPngHeader(string filePath)\n        {\n            var u = File.ReadAllBytes(filePath);\n            if (0x47 == u[0])\n            {\n                return;\n            }\n            else if (u.Length > 120 && 137 == u[0] && 80 == u[1] && 78 == u[2] && 71 == u[3] && 96 == u[118] && 130 == u[119])\n            {\n                u = u.Skip(120).ToArray();\n            }\n            else if (u.Length > 6102 && 137 == u[0] && 80 == u[1] && 78 == u[2] && 71 == u[3] && 96 == u[6100] && 130 == u[6101])\n            {\n                u = u.Skip(6102).ToArray();\n            }\n            else if (u.Length > 69 && 137 == u[0] && 80 == u[1] && 78 == u[2] && 71 == u[3] && 96 == u[67] && 130 == u[68])\n            {\n                u = u.Skip(69).ToArray();\n            }\n            else if (u.Length > 771 && 137 == u[0] && 80 == u[1] && 78 == u[2] && 71 == u[3] && 96 == u[769] && 130 == u[770])\n            {\n                u = u.Skip(771).ToArray();\n            }\n            else if (u.Length > 4 && 137 == u[0] && 80 == u[1] && 78 == u[2] && 71 == u[3])\n            {\n                //确定是PNG但是需要手动查询结尾标记 0x47 出现两次\n                int skip = 0;\n                for (int i = 4; i < u.Length - 188 * 2 - 4; i++)\n                {\n                    if (u[i] == 0x47 && u[i + 188] == 0x47 && u[i + 188 + 188] == 0x47)\n                    {\n                        skip = i;\n                        break;\n                    }\n                }\n                u = u.Skip(skip).ToArray();\n            }\n\n            File.WriteAllBytes(filePath, u);\n        }\n\n        //格式化json字符串\n        public static string ConvertJsonString(string str)\n        {\n            //Console.WriteLine(str);\n            JsonSerializer serializer = new JsonSerializer();\n            TextReader tr = new StringReader(str);\n            JsonTextReader jtr = new JsonTextReader(tr);\n            object obj = serializer.Deserialize(jtr);\n            if (obj != null)\n            {\n                StringWriter textWriter = new StringWriter();\n                JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)\n                {\n                    Formatting = Newtonsoft.Json.Formatting.Indented,\n                    Indentation = 2,\n                    IndentChar = ' '\n                };  //Indentation 为缩进量\n                serializer.Serialize(jsonWriter, obj);\n                return textWriter.ToString();\n            }\n            else\n            {\n                return str;\n            }\n        }\n\n        //获取属性\n        public static string GetTagAttribute(string attributeList, string key)\n        {\n            /*#EXT-X-STREAM-INF:PROGRAM-ID=1,RESOLUTION=1056x594,BANDWIDTH=1963351,CODECS=\"mp4a.40.5,avc1.4d001f\",FRAME-RATE=30.000,AUDIO=\"aac\",AVERAGE-BANDWIDTH=1655131*/\n            if (attributeList != \"\") \n            {\n                try\n                {\n                    string tmp = attributeList.Trim();\n                    if (tmp.Contains(key + \"=\")) \n                    {\n                        if (tmp[tmp.IndexOf(key + \"=\") + key.Length + 1] == '\\\"')\n                        {\n                            return tmp.Substring(tmp.IndexOf(key + \"=\") + key.Length + 2, tmp.Remove(0, tmp.IndexOf(key + \"=\") + key.Length + 2).IndexOf('\\\"'));\n                        }\n                        else\n                        {\n                            if (tmp.Remove(0, tmp.IndexOf(key + \"=\") + key.Length + 2).Contains(\",\"))\n                                return tmp.Substring(tmp.IndexOf(key + \"=\") + key.Length + 1, tmp.Remove(0, tmp.IndexOf(key + \"=\") + key.Length + 1).IndexOf(','));\n                            else\n                                return tmp.Substring(tmp.IndexOf(key + \"=\") + key.Length + 1);\n                        }\n                    }\n                }\n                catch (Exception)\n                {\n                    return string.Empty;\n                }\n            }\n            return string.Empty;\n        }\n\n        //正则表达式\n        public static ArrayList RegexFind(string regex, string src, int group = -1)\n        {\n            ArrayList array = new ArrayList();\n            Regex reg = new Regex(@regex);\n            MatchCollection result = reg.Matches(src);\n            if (result.Count == 0)\n                array.Add(\"NULL\");\n            foreach (Match m in result)\n            {\n                if (group == -1)\n                    array.Add(m.Value);\n                else\n                    array.Add(m.Groups[group].Value);\n            }\n            return array;\n        }\n\n        //调用ffmpeg获取视频信息\n        public static ArrayList GetVideoInfo(string file)\n        {\n            LOGGER.WriteLine(strings.readingFileInfo);\n            LOGGER.PrintLine(strings.readingFileInfo, LOGGER.Warning);\n            StringBuilder sb = new StringBuilder();\n            ArrayList info = new ArrayList();\n            string cmd = \"-hide_banner -i \\\"\" + file + \"\\\"\";\n            if (!File.Exists(file))\n            {\n                info.Add(\"Error in reading file\");\n                return info;\n            }\n            using (Process p = new Process())\n            {\n                p.StartInfo.FileName = \"ffmpeg\";\n                p.StartInfo.Arguments = cmd;\n                p.StartInfo.UseShellExecute = false;        //是否使用操作系统shell启动\n                p.StartInfo.RedirectStandardInput = true;   //接受来自调用程序的输入信息\n                p.StartInfo.RedirectStandardOutput = true;  //由调用程序获取输出信息\n                p.StartInfo.RedirectStandardError = true;   //重定向标准错误输出\n                p.StartInfo.CreateNoWindow = true;          //不显示程序窗口\n                p.StartInfo.StandardErrorEncoding = Encoding.UTF8;\n                p.Start();//启动程序\n                p.StandardInput.AutoFlush = true;\n                //获取cmd窗口的输出信息\n                StreamReader reader = p.StandardError;//截取输出流\n                sb.Append(reader.ReadLine() + \"\\r\\n\");//每次读取一行\n                while (!reader.EndOfStream)\n                {\n                    sb.Append(reader.ReadLine() + \"\\r\\n\");\n                }\n                p.WaitForExit();//等待程序执行完退出进程\n                p.Close();\n            }\n\n            string res = string.Empty;\n            foreach (string s in (string[])RegexFind(\"Stream #.*\", sb.ToString()).ToArray(typeof(string)))\n            {\n                res = \"PID \"\n                    + RegexFind(@\"\\[(0x\\d{2,})\\]\", s, 1)[0].ToString() + \": \"\n                    + RegexFind(@\": (.*)\", s, 1)[0].ToString()\n                    .Replace(RegexFind(@\" \\(\\[.*?\\)\", s)[0].ToString(), \"\")\n                    .Replace(\": \", \" \");\n\n                if (VIDEO_TYPE == \"\" && res.Contains(\": Video\")) \n                {\n                    if (res.Contains(\"Video dvvideo\"))  //爱奇艺杜比视界\n                    {\n                        VIDEO_TYPE = \"DV\";\n                    }\n                    else if (res.Contains(\"Video none (dvhe\"))  //腾讯视频杜比视界\n                    {\n                        VIDEO_TYPE = \"DV\";\n                    }\n                    else if (res.Contains(\"Video hevc (dvhe\"))  //腾讯视频杜比视界\n                    {\n                        VIDEO_TYPE = \"DV\";\n                    }\n                    else if (res.Contains(\"Video hevc (DOVI\"))  //腾讯视频杜比视界\n                    {\n                        VIDEO_TYPE = \"DV\";\n                    }\n                    else if (res.Contains(\"Video hevc (Main 10) (DOVI\"))  //优酷视频杜比视界\n                    {\n                        VIDEO_TYPE = \"DV\";\n                    }\n                    else if (res.Contains(\"Video hevc (Main 10) (dvh1\"))  //优酷视频杜比视界\n                    {\n                        VIDEO_TYPE = \"DV\";\n                    }\n                    else if (res.Contains(\"Video hevc (dvh1\"))  //优酷视频杜比视界\n                    {\n                        VIDEO_TYPE = \"DV\";\n                    }\n                    else if (res.Contains(\"Video h264\"))\n                    {\n                        VIDEO_TYPE = \"H264\";\n                    }\n                    else if (res.Contains(\"Video hevc\"))\n                    {\n                        VIDEO_TYPE = \"H265\";\n                    }\n                    else\n                    {\n                        VIDEO_TYPE = \"UNKOWN\";\n                    }\n                }\n\n                if (res.Contains(\"Audio aac\"))\n                {\n                    FFmpeg.UseAACFilter = true;\n                }\n\n                //有非AAC音轨则关闭UseAACFilter\n                if (res.Contains(\"Audio\") && !res.Contains(\"Audio aac\"))\n                {\n                    FFmpeg.UseAACFilter = false;\n                }\n\n                if ((VIDEO_TYPE == \"\" || VIDEO_TYPE == \"IGNORE\") && res.Contains(\"Audio eac3\")) \n                {\n                    AUDIO_TYPE = \"eac3\";\n                }\n                else if((VIDEO_TYPE == \"\" || VIDEO_TYPE == \"IGNORE\") && res.Contains(\"Audio aac\"))\n                {\n                    AUDIO_TYPE = \"aac\";\n                }\n                else if ((VIDEO_TYPE == \"\" || VIDEO_TYPE == \"IGNORE\") && res.Contains(\"Audio ac3\"))\n                {\n                    AUDIO_TYPE = \"ac3\";\n                }\n\n                info.Add(res);\n            }\n\n            if (VIDEO_TYPE != \"\" && VIDEO_TYPE != \"IGNORE\")\n                AUDIO_TYPE = \"\";\n\n            return info;\n        }\n\n        //所给路径中所对应的文件大小\n        public static long FileSize(string filePath)\n        {\n            //定义一个FileInfo对象，是指与filePath所指向的文件相关联，以获取其大小\n            FileInfo fileInfo = new FileInfo(filePath);\n            return fileInfo.Length;\n        }\n\n        //获取文件夹大小\n        public static long GetDirectoryLength(string path)\n        {\n            if (!Directory.Exists(path))\n            {\n                return 0;\n            }\n            long size = 0;\n            //遍历指定路径下的所有文件\n            DirectoryInfo di = new DirectoryInfo(path);\n            foreach (FileInfo fi in di.GetFiles())\n            {\n                size += fi.Length;\n            }\n            //遍历指定路径下的所有文件夹\n            DirectoryInfo[] dis = di.GetDirectories();\n            if (dis.Length > 0)\n            {\n                for (int i = 0; i < dis.Length; i++)\n                {\n                    size += GetDirectoryLength(dis[i].FullName);\n                }\n            }\n            return size;\n        }\n\n        //此函数用于格式化输出时长  \n        public static String FormatTime(Int32 time)\n        {\n            TimeSpan ts = new TimeSpan(0, 0, time);\n            string str = \"\";\n            str = (ts.Hours.ToString(\"00\") == \"00\" ? \"\" : ts.Hours.ToString(\"00\") + \"h\") + ts.Minutes.ToString(\"00\") + \"m\" + ts.Seconds.ToString(\"00\") + \"s\";\n            return str;\n        }\n\n        //此函数用于格式化输出文件大小\n        public static String FormatFileSize(Double fileSize)\n        {\n            if (fileSize < 0)\n            {\n                return \"Error\";\n            }\n            else if (fileSize >= 1024 * 1024 * 1024)\n            {\n                return string.Format(\"{0:########0.00} GB\", ((Double)fileSize) / (1024 * 1024 * 1024));\n            }\n            else if (fileSize >= 1024 * 1024)\n            {\n                return string.Format(\"{0:####0.00} MB\", ((Double)fileSize) / (1024 * 1024));\n            }\n            else if (fileSize >= 1024)\n            {\n                return string.Format(\"{0:####0.00} KB\", ((Double)fileSize) / 1024);\n            }\n            else\n            {\n                return string.Format(\"{0} bytes\", fileSize);\n            }\n        }\n\n        /// <summary>  \n        /// 获取当前时间戳  \n        /// </summary>  \n        /// <param name=\"bflag\">为真时获取10位时间戳,为假时获取13位时间戳.bool bflag = true</param>  \n        /// <returns></returns>  \n        public static string GetTimeStamp(bool bflag)\n        {\n            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);\n            string ret = string.Empty;\n            if (bflag)\n                ret = Convert.ToInt64(ts.TotalSeconds).ToString();\n            else\n                ret = Convert.ToInt64(ts.TotalMilliseconds).ToString();\n\n            return ret;\n        }\n\n        /// <summary>\n        /// 获取有效文件名\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"replacement\"></param>\n        /// <returns></returns>\n        public static string MakeValidFileName(string text, string replacement = \"_\")\n        {\n            StringBuilder str = new StringBuilder();\n            var invalidFileNameChars = Path.GetInvalidFileNameChars();\n            foreach (var c in text)\n            {\n                if (invalidFileNameChars.Contains(c))\n                {\n                    str.Append(replacement ?? \"\");\n                }\n                else\n                {\n                    str.Append(c);\n                }\n            }\n            return str.ToString();\n        }\n\n        /// <summary>\n        /// 从URL获取文件名\n        /// </summary>\n        /// <param name=\"url\"></param>\n        /// <returns></returns>\n        public static string GetUrlFileName(string url)\n        {\n            if (File.Exists(url))\n            {\n                return Path.GetFileNameWithoutExtension(url);\n            }\n            if (string.IsNullOrEmpty(url))\n            {\n                return \"None\";\n            }\n            try\n            {\n                string[] strs1 = url.Split(new char[] { '/' });\n                return MakeValidFileName(System.Web.HttpUtility.UrlDecode(strs1[strs1.Length - 1].Split(new char[] { '?' })[0].Replace(\".m3u8\", \"\")));\n            }\n            catch (Exception)\n            {\n                return DateTime.Now.ToString(\"yyyy.MM.dd-HH.mm.ss\");\n            }\n        }\n\n        //检测GZip并解压\n        public static void GzipHandler(string file)\n        {\n            try\n            {\n                using (FileStream fr = File.OpenRead(file))\n                {\n                    using (GZipStream gz = new GZipStream(fr, CompressionMode.Decompress))\n                    {\n                        using (FileStream fw = File.OpenWrite(Path.Combine(Path.GetDirectoryName(file), Path.GetFileNameWithoutExtension(file) + \"[t].ts\")))\n                        {\n                            byte[] by = new byte[1024];\n                            int r = gz.Read(by, 0, by.Length);\n                            while (r > 0)\n                            {\n                                fw.Write(by, 0, r);\n                                r = gz.Read(by, 0, r);\n                            }\n                        }\n                    }\n                    File.Delete(file);\n                    File.Move(Path.Combine(Path.GetDirectoryName(file), Path.GetFileNameWithoutExtension(file) + \"[t].ts\"), file);\n                }\n            }\n            catch (Exception)\n            {\n                if (File.Exists(Path.Combine(Path.GetDirectoryName(file), Path.GetFileNameWithoutExtension(file) + \"[t].ts\")))\n                    File.Delete(Path.Combine(Path.GetDirectoryName(file), Path.GetFileNameWithoutExtension(file) + \"[t].ts\"));\n                return;\n            }\n        }\n\n        [DllImport(\"shell32.dll\", SetLastError = true)]\n        static extern IntPtr CommandLineToArgvW([MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, out int pNumArgs);\n        //使用Win32 API解析字符串为命令行参数\n        public static IEnumerable<string> ParseArguments(string commandLine)\n        {\n            int argc;\n            var argv = CommandLineToArgvW(commandLine, out argc);\n            if (argv == IntPtr.Zero)\n                throw new System.ComponentModel.Win32Exception();\n            try\n            {\n                var args = new string[argc];\n                for (var i = 0; i < args.Length; i++)\n                {\n                    var p = Marshal.ReadIntPtr(argv, i * IntPtr.Size);\n                    args[i] = Marshal.PtrToStringUni(p);\n                }\n\n                return args;\n            }\n            finally\n            {\n                Marshal.FreeHGlobal(argv);\n            }\n        }\n\n        //重载\n        public class WebClientEx : WebClient\n        {\n            private readonly long from;\n            private readonly long to;\n            private readonly int timeout;\n            private readonly bool setTimeout;\n            private readonly bool setRange;\n\n            public WebClientEx()\n            {\n                \n            }\n\n            public WebClientEx(long from, long to)\n            {\n                this.from = from;\n                this.to = to;\n                setRange = true;\n            }\n\n            public WebClientEx(int timeout)\n            {\n                this.timeout = timeout;\n                setTimeout = true;\n            }\n\n            public WebClientEx(int timeout, long from, long to)\n            {\n                this.timeout = timeout;\n                setTimeout = true;\n                this.from = from;\n                this.to = to;\n                setRange = true;\n            }\n\n            protected override WebRequest GetWebRequest(Uri address)\n            {\n                var wr = (HttpWebRequest)base.GetWebRequest(address);\n                if (NoProxy)\n                {\n                    wr.Proxy = null;\n                }\n                else if (UseProxyAddress != \"\")\n                {\n                    SetProxy(wr);\n                }\n                if (setRange)\n                    wr.AddRange(this.from, this.to);\n                if (setTimeout)\n                    wr.Timeout = timeout; // timeout in milliseconds (ms)\n                return wr;\n            }\n        }\n\n        /**\n         * 通过X-TIMESTAMP-MAP 调整VTT字幕的时间轴\n         */\n        public static void ReAdjustVtt(string[] vtts)\n        {\n            string MsToTime(int ms)\n            {\n                TimeSpan ts = new TimeSpan(0, 0, 0, 0, ms);\n                string str = \"\";\n                str = (ts.Hours.ToString(\"00\") + \":\") + ts.Minutes.ToString(\"00\") + \":\" + ts.Seconds.ToString(\"00\") + \".\" + ts.Milliseconds.ToString(\"000\");\n                return str;\n            }\n\n            int TimeToMs(string line)\n            {\n                int hh = Convert.ToInt32(line.Split(':')[0]);\n                int mm = Convert.ToInt32(line.Split(':')[1]);\n                int ss = Convert.ToInt32(line.Split(':')[2].Split('.')[0]);\n                int ms = Convert.ToInt32(line.Split(':')[2].Split('.')[1]);\n                return hh * 60 * 60 * 1000 + mm * 60 * 1000 + ss * 1000 + ms;\n            }\n\n            int addTime = 0;\n            int baseTime = 0;\n            for (int i = 0; i < vtts.Length; i++)\n            {\n                string tmp = File.ReadAllText(vtts[i], Encoding.UTF8);\n                if (!Regex.IsMatch(tmp, \"X-TIMESTAMP-MAP.*MPEGTS:(\\\\d+)\"))\n                    break;\n                if (i > 0)\n                {\n                    int newTime = Convert.ToInt32(Regex.Match(tmp, \"X-TIMESTAMP-MAP.*MPEGTS:(\\\\d+)\").Groups[1].Value);\n                    if (newTime == 900000)\n                        continue;\n                    //计算偏移量\n                    //LOGGER.PrintLine((newTime - baseTime).ToString());\n                    addTime = addTime + ((newTime - baseTime) / 100);\n                    if ((newTime - baseTime) == 6300000)\n                        addTime -= 3000;\n                    //将新的作为基准时间\n                    baseTime = newTime;\n                    foreach (Match m in Regex.Matches(tmp, @\"(\\d{2}:\\d{2}:\\d{2}\\.\\d{3}) --> (\\d{2}:\\d{2}:\\d{2}\\.\\d{3})\"))\n                    {\n                        string start = m.Groups[1].Value;\n                        string end = m.Groups[2].Value;\n                        tmp = tmp.Replace(m.Value, MsToTime(TimeToMs(start) + addTime) + \" --> \" + MsToTime(TimeToMs(end) + addTime));\n                    }\n                }\n                File.WriteAllText(vtts[i], Regex.Replace(tmp, \"X-TIMESTAMP-MAP=.*\", \"\"), Encoding.UTF8);\n            }\n            //Console.ReadLine();\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/HLSLiveDownloader.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Timers;\n\nnamespace N_m3u8DL_CLI\n{\n    class HLSLiveDownloader\n    {\n        public static int REC_DUR_LIMIT = -1; //默认不限制录制时长\n        public static double REC_DUR = 0; //已录制时长\n        private string liveFile = string.Empty;\n        private string jsonFile = string.Empty;\n        private string headers = string.Empty;\n        private string downDir = string.Empty;\n        private FileStream liveStream = null;\n        private double targetduration = 10;\n        private bool isFirstJson = true;\n\n        public double TotalDuration { get; set; }\n        public string Headers { get => headers; set => headers = value; }\n        public string DownDir { get => downDir; set => downDir = value; }\n        public FileStream LiveStream { get => liveStream; set => liveStream = value; }\n        public string LiveFile { get => liveFile; set => liveFile = value; }\n\n        ArrayList toDownList = new ArrayList();  //所有待下载的列表\n        System.Timers.Timer timer = new System.Timers.Timer();\n        Downloader sd = new Downloader();  //只有一个实例\n\n        public void TimerStart()\n        {\n            timer.Enabled = true;\n            //timer.Interval = (targetduration - 2) * 1000; //执行间隔时间,单位为毫秒\n            timer.Start();\n            timer.Elapsed += new ElapsedEventHandler(UpdateList);\n            UpdateList(timer, new EventArgs());  //立即执行一次\n            Record();\n        }\n\n        public void TimerStop()\n        {\n            timer.Stop();\n        }\n\n        //更新列表\n        private void UpdateList(object source, EventArgs e)\n        {\n            jsonFile = Path.Combine(DownDir, \"meta.json\");\n            if (!File.Exists(jsonFile)) \n            {\n                TimerStop();\n                return;\n            }\n            string jsonContent = File.ReadAllText(jsonFile);\n            JObject initJson = JObject.Parse(jsonContent);\n            string m3u8Url = initJson[\"m3u8\"].Value<string>();\n            targetduration = initJson[\"m3u8Info\"][\"targetDuration\"].Value<double>();\n            TotalDuration = initJson[\"m3u8Info\"][\"totalDuration\"].Value<double>();\n            timer.Interval = Math.Abs(TotalDuration - targetduration) * 1000;//设置定时器运行间隔\n            if (timer.Interval <= 1000) timer.Interval = 10000;\n            JArray lastSegments = JArray.Parse(initJson[\"m3u8Info\"][\"segments\"][0].ToString().Trim());  //上次的分段，用于比对新分段\n            ArrayList tempList = new ArrayList();  //所有待下载的列表\n            tempList.Clear();\n            foreach (JObject seg in lastSegments)\n            {\n                tempList.Add(seg.ToString());\n            }\n\n            if(isFirstJson)\n            {\n                toDownList = tempList;\n                isFirstJson = false;\n                return;\n            }\n\n            Parser parser = new Parser();\n            parser.Headers = Headers;\n            parser.DownDir = Path.GetDirectoryName(jsonFile);\n            parser.M3u8Url = m3u8Url;\n            parser.LiveStream = true;\n            parser.Parse();  //产生新的json文件\n\n            jsonContent = File.ReadAllText(jsonFile);\n            initJson = JObject.Parse(jsonContent);\n            JArray segments = JArray.Parse(initJson[\"m3u8Info\"][\"segments\"][0].ToString());  //大分组\n            foreach (JObject seg in segments)\n            {\n                if (!tempList.Contains(seg.ToString()))\n                {\n                    toDownList.Add(seg.ToString());  //加入真正的待下载队列\n                    //Console.WriteLine(seg.ToString());\n                }\n            }\n            if (toDownList.Count > 0)\n                Record();\n        }\n\n        //public void TryDownload()\n        //{\n        //    Thread t = new Thread(Download);\n        //    while (toDownList.Count != 0)\n        //    {\n        //        t = new Thread(Download);\n        //        t.Start();\n        //        t.Join();\n        //        while (sd.IsDone != true) ;  //忙等待\n        //        if (toDownList.Count > 0)\n        //            toDownList.RemoveAt(0);  //下完删除一项\n        //    }\n        //    Console.WriteLine(\"Waiting...\");\n        //}\n\n        private void Record()\n        {\n            while (toDownList.Count > 0 && (sd.FileUrl != \"\" ? sd.IsDone : true)) \n            {\n                JObject info = JObject.Parse(toDownList[0].ToString());\n                int index = info[\"index\"].Value<int>();\n                sd.FileUrl = info[\"segUri\"].Value<string>();\n                sd.Method = info[\"method\"].Value<string>();\n                if (sd.Method != \"NONE\")\n                {\n                    sd.Key = info[\"key\"].Value<string>();\n                    sd.Iv = info[\"iv\"].Value<string>();\n                }\n                sd.TimeOut = (int)timer.Interval - 1000;//超时时间不超过下次执行时间\n                if (sd.TimeOut <= 0) sd.TimeOut = (int)timer.Interval;\n                sd.SegIndex = index;\n                sd.Headers = Headers;\n                sd.SegDur = info[\"duration\"].Value<double>();\n                sd.IsLive = true;  //标记为直播\n                sd.LiveFile = LiveFile;\n                sd.LiveStream = LiveStream;\n                sd.Down();  //开始下载\n                while (sd.IsDone != true) { Thread.Sleep(1); };  //忙等待 Thread.Sleep(1) 可防止cpu 100% 防止电脑风扇狂转\n                if (toDownList.Count > 0)\n                    toDownList.RemoveAt(0);  //下完删除一项\n            }\n            LOGGER.PrintLine(\"Waiting...\", LOGGER.Warning);\n            LOGGER.WriteLine(\"Waiting...\");\n        }\n\n        //检测是否有新分片\n        private bool isNewSeg()\n        {\n            if (toDownList.Count > 0)\n                return true;\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/HLSTags.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace N_m3u8DL_CLI\n{\n    class HLSTags\n    {\n        public static string ext_m3u = \"#EXTM3U\";\n        public static string ext_x_targetduration = \"#EXT-X-TARGETDURATION\";\n        public static string ext_x_media_sequence = \"#EXT-X-MEDIA-SEQUENCE\";\n        public static string ext_x_discontinuity_sequence = \"#EXT-X-DISCONTINUITY-SEQUENCE\";\n        public static string ext_x_program_date_time = \"#EXT-X-PROGRAM-DATE-TIME\";\n        public static string ext_x_media = \"#EXT-X-MEDIA\";\n        public static string ext_x_playlist_type = \"#EXT-X-PLAYLIST-TYPE\";\n        public static string ext_x_key = \"#EXT-X-KEY\";\n        public static string ext_x_stream_inf = \"#EXT-X-STREAM-INF\";\n        public static string ext_x_version = \"#EXT-X-VERSION\";\n        public static string ext_x_allow_cache = \"#EXT-X-ALLOW-CACHE\";\n        public static string ext_x_endlist = \"#EXT-X-ENDLIST\";\n        public static string extinf = \"#EXTINF\";\n        public static string ext_i_frames_only = \"#EXT-X-I-FRAMES-ONLY\";\n        public static string ext_x_byterange = \"#EXT-X-BYTERANGE\";\n        public static string ext_x_i_frame_stream_inf = \"#EXT-X-I-FRAME-STREAM-INF\";\n        public static string ext_x_discontinuity = \"#EXT-X-DISCONTINUITY\";\n        public static string ext_x_cue_out_start = \"#EXT-X-CUE-OUT\";\n        public static string ext_x_cue_out = \"#EXT-X-CUE-OUT-CONT\";\n        public static string ext_is_independent_segments = \"#EXT-X-INDEPENDENT-SEGMENTS\";\n        public static string ext_x_scte35 = \"#EXT-OATCLS-SCTE35\";\n        public static string ext_x_cue_start = \"#EXT-X-CUE-OUT\";\n        public static string ext_x_cue_end = \"#EXT-X-CUE-IN\";\n        public static string ext_x_cue_span = \"#EXT-X-CUE-SPAN\";\n        public static string ext_x_map = \"#EXT-X-MAP\";\n        public static string ext_x_start = \"#EXT-X-START\";\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/IqJsonParser.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace N_m3u8DL_CLI\n{\n    class IqJsonParser\n    {\n        public static string Parse(string downDir, string json)\n        {\n            JObject jObject = JObject.Parse(json);\n            var aClips = jObject[\"payload\"][\"wm_a\"][\"audio_track1\"][\"files\"].Value<JArray>();\n            var vClips = jObject[\"payload\"][\"wm_a\"][\"video_track1\"][\"files\"].Value<JArray>();\n\n            var codecsList = new List<string>();\n\n            var audioPath = \"\";\n            var videoPath = \"\";\n            var audioInitPath = \"\";\n            var videoInitPath = \"\";\n\n            if (aClips.Count > 0)\n            {\n                var init = jObject[\"payload\"][\"wm_a\"][\"audio_track1\"][\"codec_init\"].Value<string>();\n                byte[] bytes = Convert.FromBase64String(init);\n                //输出init文件\n                audioInitPath = Path.Combine(downDir, \"iqAudioInit.mp4\");\n                File.WriteAllBytes(audioInitPath, bytes);\n                StringBuilder sb = new StringBuilder();\n                sb.AppendLine(\"#EXTM3U\");\n                sb.AppendLine(\"#EXT-X-VERSION:3\");\n                sb.AppendLine(\"#EXT-X-PLAYLIST-TYPE:VOD\");\n                sb.AppendLine(\"#CREATED-BY:N_m3u8DL-CLI\");\n                sb.AppendLine($\"#EXT-CODEC:{jObject[\"payload\"][\"wm_a\"][\"audio_track1\"][\"codec\"].Value<string>()}\");\n                sb.AppendLine($\"#EXT-KID:{jObject[\"payload\"][\"wm_a\"][\"audio_track1\"][\"key_id\"].Value<string>()}\");\n                sb.AppendLine($\"#EXT-X-MAP:URI=\\\"{new Uri(Path.Combine(downDir + \"(Audio)\", \"iqAudioInit.mp4\")).ToString()}\\\"\");\n                sb.AppendLine(\"#EXT-X-KEY:METHOD=PLZ-KEEP-RAW,URI=\\\"None\\\"\");\n                foreach (var a in aClips)\n                {\n                    sb.AppendLine($\"#EXTINF:{a[\"duration_second\"].ToString()}\");\n                    sb.AppendLine(a[\"file_name\"].Value<string>());\n                }\n                sb.AppendLine(\"#EXT-X-ENDLIST\");\n                //输出m3u8文件\n                var _path = Path.Combine(downDir, \"iqAudio.m3u8\");\n                File.WriteAllText(_path, sb.ToString());\n                audioPath = new Uri(_path).ToString();\n                codecsList.Add(jObject[\"payload\"][\"wm_a\"][\"audio_track1\"][\"codec\"].Value<string>());\n            }\n\n            if (vClips.Count > 0)\n            {\n                var init = jObject[\"payload\"][\"wm_a\"][\"video_track1\"][\"codec_init\"].Value<string>();\n                byte[] bytes = Convert.FromBase64String(init);\n                //输出init文件\n                videoInitPath = Path.Combine(downDir, \"iqVideoInit.mp4\");\n                File.WriteAllBytes(videoInitPath, bytes);\n                StringBuilder sb = new StringBuilder();\n                sb.AppendLine(\"#EXTM3U\");\n                sb.AppendLine(\"#EXT-X-VERSION:3\");\n                sb.AppendLine(\"#EXT-X-PLAYLIST-TYPE:VOD\");\n                sb.AppendLine(\"#CREATED-BY:N_m3u8DL-CLI\");\n                sb.AppendLine($\"#EXT-CODEC:{jObject[\"payload\"][\"wm_a\"][\"video_track1\"][\"codec\"].Value<string>()}\");\n                sb.AppendLine($\"#EXT-KID:{jObject[\"payload\"][\"wm_a\"][\"video_track1\"][\"key_id\"].Value<string>()}\");\n                sb.AppendLine($\"#EXT-X-MAP:URI=\\\"{new Uri(videoInitPath).ToString()}\\\"\");\n                sb.AppendLine(\"#EXT-X-KEY:METHOD=PLZ-KEEP-RAW,URI=\\\"None\\\"\");\n                foreach (var a in vClips)\n                {\n                    var start = a[\"seekable\"][\"pos_start\"].Value<long>();\n                    var size = a[\"size\"].Value<long>();\n                    sb.AppendLine($\"#EXTINF:{a[\"duration_second\"].ToString()}\");\n                    sb.AppendLine($\"#EXT-X-BYTERANGE:{size}@{start}\");\n                    sb.AppendLine(a[\"file_name\"].Value<string>());\n                }\n                sb.AppendLine(\"#EXT-X-ENDLIST\");\n                //输出m3u8文件\n                var _path = Path.Combine(downDir, \"iqVideo.m3u8\");\n                File.WriteAllText(_path, sb.ToString());\n                videoPath = new Uri(_path).ToString();\n                codecsList.Add(jObject[\"payload\"][\"wm_a\"][\"video_track1\"][\"codec\"].Value<string>());\n            }\n\n            var content = \"\";\n            if ((videoPath == \"\" && audioPath != \"\") || Global.VIDEO_TYPE == \"IGNORE\")\n            {\n                return audioPath;\n            }\n            else if (audioPath == \"\" && videoPath != \"\")\n            {\n                return videoPath;\n            }\n            else\n            {\n                if (!Directory.Exists(downDir + \"(Audio)\"))\n                    Directory.CreateDirectory(downDir + \"(Audio)\");\n                var _path = Path.Combine(downDir + \"(Audio)\", \"iqAudio.m3u8\");\n                var _pathInit = Path.Combine(downDir + \"(Audio)\", \"iqAudioInit.mp4\");\n                File.Copy(new Uri(audioPath).LocalPath, _path, true);\n                File.Copy(new Uri(audioInitPath).LocalPath, _pathInit, true);\n                audioPath = new Uri(_path).ToString();\n                content = $\"#EXTM3U\\r\\n\" +\n                    $\"#EXT-X-MEDIA:TYPE=AUDIO,URI=\\\"{audioPath}\\\",GROUP-ID=\\\"default-audio-group\\\",NAME=\\\"stream_0\\\",AUTOSELECT=YES,CHANNELS=\\\"0\\\"\\r\\n\" +\n                    $\"#EXT-X-STREAM-INF:BANDWIDTH=99999,CODECS=\\\"{string.Join(\",\", codecsList)}\\\",RESOLUTION=0x0,AUDIO=\\\"default-audio-group\\\"\\r\\n\" +\n                    $\"{videoPath}\";\n            }\n\n            var _masterPath = Path.Combine(downDir, \"master.m3u8\");\n            File.WriteAllText(_masterPath, content);\n            return new Uri(_masterPath).ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/LOGGER.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace N_m3u8DL_CLI\n{\n    class LOGGER\n    {\n        public const int Default = 1;\n        public const int Error = 2;\n        public const int Warning = 3;\n\n        public static string LOGFILE;\n        public static bool STOPLOG = false;\n        public static string FindLog(string dir)\n        {\n            DirectoryInfo d = new DirectoryInfo(dir);\n            foreach (FileInfo fi in d.GetFiles())\n            {\n                if (fi.Extension.ToUpper() == \".LOG\")\n                {\n                    return fi.FullName;\n                }\n            }\n            return \"\";\n        }\n\n        public static void InitLog()\n        {\n            if (!Directory.Exists(Path.GetDirectoryName(LOGFILE)))//若文件夹不存在则新建文件夹   \n                Directory.CreateDirectory(Path.GetDirectoryName(LOGFILE)); //新建文件夹\n            //若文件存在则加序号\n            int index = 1;\n            var fileName = Path.GetFileNameWithoutExtension(LOGFILE);\n            while (File.Exists(LOGFILE))\n            {\n                LOGFILE = Path.Combine(Path.GetDirectoryName(LOGFILE), $\"{fileName}-{index++}.log\");\n            }\n            string file = LOGFILE;\n            string now = DateTime.Now.ToString(\"yyyy-MM-dd_HH-mm-ss\");\n            string init = \"LOG \" + DateTime.Now.ToString(\"yyyy/MM/dd\") + \"\\r\\n\"\n                + \"Save Path: \" + Path.GetDirectoryName(LOGFILE) + \"\\r\\n\"\n                + \"Task Start: \" + DateTime.Now.ToString(\"yyyy/MM/dd HH:mm:ss\") + \"\\r\\n\"\n                + \"Task CommandLine: \" + Environment.CommandLine;\n\n            if (File.Exists(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), \"N_m3u8DL-CLI.args.txt\")))\n            {\n                init += \"\\r\\nAdditional Args: \" + File.ReadAllText(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), \"N_m3u8DL-CLI.args.txt\"));  //解析命令行\n            }\n\n            init += \"\\r\\n\\r\\n\";\n            File.WriteAllText(file, init, Encoding.UTF8);\n        }\n\n        //读写锁机制，当资源被占用，其他线程等待\n        static ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim();\n\n        public static void PrintLine(string text, int printLevel = 1)\n        {\n            int windowWith = 63;\n            try\n            {\n                windowWith = Console.WindowWidth;\n            }\n            catch (Exception e)\n            {\n               // empty\n            }\n            switch (printLevel)\n            {\n                case 0:\n                    Console.Write(\"\\r\" + new string(' ', windowWith - 1) + \"\\r\");\n                    Console.WriteLine(\" \".PadRight(12) + \" \" + text);\n                    break;\n                case 1:\n                    Console.Write(\"\\r\" + new string(' ', windowWith - 1) + \"\\r\");\n                    Console.Write(DateTime.Now.ToString(\"HH:mm:ss.fff\") + \" \");\n                    Console.WriteLine(text);\n                    break;\n                case 2:\n                    Console.Write(\"\\r\" + new string(' ', windowWith - 1) + \"\\r\");\n                    Console.Write(DateTime.Now.ToString(\"HH:mm:ss.fff\") + \" \");\n                    Console.ForegroundColor = ConsoleColor.Red;\n                    Console.WriteLine(text);\n                    Console.ResetColor();\n                    break;\n                case 3:\n                    Console.Write(\"\\r\" + new string(' ', windowWith - 1) + \"\\r\");\n                    Console.Write(DateTime.Now.ToString(\"HH:mm:ss.fff\") + \" \");\n                    Console.ForegroundColor = ConsoleColor.DarkYellow;\n                    Console.WriteLine(text);\n                    Console.ResetColor();\n                    break;\n            }\n        }\n\n        public static void WriteLine(string text)\n        {\n            if (STOPLOG)\n                return;\n            if (!File.Exists(LOGFILE))\n                return;\n\n            try\n            {\n                string file = LOGFILE;\n                //进入写入\n                LogWriteLock.EnterWriteLock();\n                using (StreamWriter sw = File.AppendText(file))\n                {\n                    sw.WriteLine(DateTime.Now.ToString(\"HH:mm:ss.fff\") + \" / (NORMAL) \" + text, Encoding.UTF8);\n                }\n            }\n            catch (Exception)\n            {\n\n            }\n            finally\n            {\n                //释放占用\n                LogWriteLock.ExitWriteLock();\n            }\n        }\n\n        public static void WriteLineError(string text)\n        {\n            if (!File.Exists(LOGFILE))\n                return;\n            try\n            {\n                string file = LOGFILE;\n                //进入写入\n                LogWriteLock.EnterWriteLock();\n                using (StreamWriter sw = File.AppendText(file))\n                {\n                    sw.WriteLine(DateTime.Now.ToString(\"HH:mm:ss.fff\") + \" / (ERROR) \" + text, Encoding.UTF8);\n                }\n            }\n            catch (Exception)\n            {\n\n            }\n            finally\n            {\n                //释放占用\n                LogWriteLock.ExitWriteLock();\n            }\n        }\n\n        public static void Show(string text)\n        {\n            Console.ForegroundColor = ConsoleColor.Red;\n            Console.WriteLine(DateTime.Now.ToString(\"o\") + \"  \" + text);\n            while (Console.ForegroundColor == ConsoleColor.Red)\n                Console.ResetColor();\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/MPDParser.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing System.Xml;\n\nnamespace N_m3u8DL_CLI\n{\n    //code from https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/extractor/common.py#L2076\n    class MPDParser\n    {\n        private static string MPD_URL;\n        static Dictionary<string, dynamic> ExtractMultisegmentInfo(XmlElement Period, XmlNamespaceManager nsMgr, Dictionary<string, dynamic> info)\n        {\n            var MultisegmentInfo = new Dictionary<string, dynamic>(info);\n            void ExtractCommon(XmlNode source)\n            {\n                var sourceE = (XmlElement)source;\n                var segmentTimeline = source.SelectSingleNode(\"ns:SegmentTimeline\", nsMgr);\n                if (segmentTimeline != null)\n                {\n                    var sE = segmentTimeline.SelectNodes(\"ns:S\", nsMgr);\n                    if (sE.Count > 0)\n                    {\n                        MultisegmentInfo[\"TotalNumber\"] = 0;\n                        var SList = new List<Dictionary<string, dynamic>>();\n                        foreach (XmlElement s in sE)\n                        {\n                            var r = string.IsNullOrEmpty(s.GetAttribute(\"r\")) ? 0 : Convert.ToInt64(s.GetAttribute(\"r\"));\n                            MultisegmentInfo[\"TotalNumber\"] += 1 + r;\n                            SList.Add(new Dictionary<string, dynamic>()\n                            {\n                                [\"t\"] = string.IsNullOrEmpty(s.GetAttribute(\"t\")) ? 0 : Convert.ToInt64(s.GetAttribute(\"t\")),\n                                [\"d\"] = Convert.ToInt64(s.GetAttribute(\"d\")),\n                                [\"r\"] = r\n                            });\n                        }\n                        MultisegmentInfo.Add(\"S\", SList);\n                    }\n                }\n                var startNumber = sourceE.GetAttribute(\"startNumber\");\n                if (!string.IsNullOrEmpty(startNumber))\n                {\n                    MultisegmentInfo[\"StartNumber\"] = Convert.ToInt32(startNumber);\n                }\n                var timescale = sourceE.GetAttribute(\"timescale\");\n                if (!string.IsNullOrEmpty(timescale))\n                {\n                    MultisegmentInfo[\"Timescale\"] = Convert.ToInt32(timescale);\n                }\n                var segmentDuration = sourceE.GetAttribute(\"duration\");\n                if (!string.IsNullOrEmpty(segmentDuration))\n                {\n                    MultisegmentInfo[\"SegmentDuration\"] = Convert.ToDouble(segmentDuration);\n                }\n            }\n\n            void ExtractInitialization(XmlNode source)\n            {\n                var initialization = source.SelectSingleNode(\"ns:Initialization\", nsMgr);\n                if (initialization != null)\n                {\n                    MultisegmentInfo[\"InitializationUrl\"] = ((XmlElement)initialization).GetAttribute(\"sourceURL\");\n                    if (((XmlElement)initialization).HasAttribute(\"range\"))\n                    {\n                        MultisegmentInfo[\"InitializationUrl\"] += \"$$Range=\" + ((XmlElement)initialization).GetAttribute(\"range\");\n                    }\n                }\n            }\n\n            var segmentList = Period.SelectSingleNode(\"ns:SegmentList\", nsMgr);\n            if (segmentList != null)\n            {\n                ExtractCommon(segmentList);\n                ExtractInitialization(segmentList);\n                var segmentUrlsE = segmentList.SelectNodes(\"ns:SegmentURL\", nsMgr);\n                MultisegmentInfo[\"SegmentUrls\"] = new List<string>();\n                foreach (XmlElement segment in segmentUrlsE)\n                {\n                    if (segment.HasAttribute(\"mediaRange\"))\n                    {\n                        MultisegmentInfo[\"SegmentUrls\"].Add(\"$$Range=\" + segment.GetAttribute(\"mediaRange\"));\n                    }\n                    else\n                    {\n                        MultisegmentInfo[\"SegmentUrls\"].Add(segment.GetAttribute(\"media\"));\n                    }\n                }\n            }\n            else\n            {\n                var segmentTemplate = Period.SelectSingleNode(\"ns:SegmentTemplate\", nsMgr);\n                if (segmentTemplate != null)\n                {\n                    ExtractCommon(segmentTemplate);\n                    var media = ((XmlElement)segmentTemplate).GetAttribute(\"media\");\n                    if (!string.IsNullOrEmpty(media))\n                    {\n                        MultisegmentInfo[\"Media\"] = media;\n                    }\n                    var initialization = ((XmlElement)segmentTemplate).GetAttribute(\"initialization\");\n                    if (!string.IsNullOrEmpty(initialization))\n                    {\n                        MultisegmentInfo[\"Initialization\"] = initialization;\n                    }\n                    else\n                    {\n                        ExtractInitialization(segmentTemplate);\n                    }\n                }\n            }\n\n            return MultisegmentInfo;\n        }\n\n        /// <summary>\n        /// 返回生成的master文件地址\n        /// </summary>\n        /// <param name=\"downDir\">文件存储目录</param>\n        /// <param name=\"mpdUrl\">MPD链接</param>\n        /// <param name=\"mpdContent\">MPD内容</param>\n        /// <param name=\"defaultBase\">BaseUrl</param>\n        /// <returns></returns>\n        public static string Parse(string downDir, string mpdUrl, string mpdContent, string defaultBase = \"\")\n        {\n            MPD_URL = mpdUrl;\n            //XiGua\n            if (mpdContent.Contains(\"<mas:\") && !mpdContent.Contains(\"xmlns:mas\"))\n                mpdContent = mpdContent.Replace(\"<MPD \", \"<MPD xmlns:mas=\\\"urn:marlin:mas:1-0:services:schemas:mpd\\\" \");\n\n            XmlDocument mpdDoc = new XmlDocument();\n            mpdDoc.LoadXml(mpdContent);\n\n            XmlNode xn = null;\n            //Select MPD node\n            foreach (XmlNode node in mpdDoc.ChildNodes)\n            {\n                if (node.NodeType == XmlNodeType.Element && node.Name == \"MPD\")\n                {\n                    xn = node;\n                    break;\n                }\n            }\n            var mediaPresentationDuration = ((XmlElement)xn).GetAttribute(\"mediaPresentationDuration\");\n            var ns = ((XmlElement)xn).GetAttribute(\"xmlns\");\n\n            XmlNamespaceManager nsMgr = new XmlNamespaceManager(mpdDoc.NameTable);\n            nsMgr.AddNamespace(\"ns\", ns);\n\n            TimeSpan ts = XmlConvert.ToTimeSpan(mediaPresentationDuration); //时长\n\n            //读取在MPD开头定义的<BaseURL>，并替换本身的URL\n            var baseNode = xn.SelectSingleNode(\"ns:BaseURL\", nsMgr);\n            if (baseNode != null)\n            {\n                if (MPD_URL.Contains(\"kkbox.com.tw/\"))\n                {\n                    var badUrl = baseNode.InnerText;\n                    var goodUrl = badUrl.Replace(\"//https:%2F%2F\", \"//\");\n                    MPD_URL = mpdUrl = goodUrl;\n                }\n                else\n                {\n                    MPD_URL = mpdUrl = baseNode.InnerText;\n                }\n            }\n\n            var formatList = new List<Dictionary<string, dynamic>>(); //存放所有音视频清晰度\n            var periodIndex = 0; //解决同一个period且同id导致被重复添加分片\n\n            foreach (XmlElement period in xn.SelectNodes(\"ns:Period\", nsMgr))\n            {\n                periodIndex++;\n                var periodDuration = string.IsNullOrEmpty(period.GetAttribute(\"duration\")) ? XmlConvert.ToTimeSpan(mediaPresentationDuration) : XmlConvert.ToTimeSpan(period.GetAttribute(\"duration\"));\n                var periodMsInfo = ExtractMultisegmentInfo(period, nsMgr, new Dictionary<string, dynamic>()\n                {\n                    [\"StartNumber\"] = 1,\n                    [\"Timescale\"] = 1\n                });\n                foreach (XmlElement adaptationSet in period.SelectNodes(\"ns:AdaptationSet\", nsMgr))\n                {\n                    var adaptionSetMsInfo = ExtractMultisegmentInfo(adaptationSet, nsMgr, periodMsInfo);\n                    foreach (XmlElement representation in adaptationSet.SelectNodes(\"ns:Representation\", nsMgr))\n                    {\n                        string GetAttribute(string key)\n                        {\n                            var v1 = representation.GetAttribute(key);\n                            if (string.IsNullOrEmpty(v1))\n                                return adaptationSet.GetAttribute(key);\n                            return v1;\n                        }\n\n                        var mimeType = GetAttribute(\"mimeType\");\n                        var contentType = mimeType.Split('/')[0];\n                        if (contentType == \"text\")\n                        {\n                            continue; //暂不支持字幕下载\n                        }\n                        else if (contentType == \"video\" || contentType == \"audio\")\n                        {\n                            var baseUrl = \"\";\n                            bool CheckBaseUrl()\n                            {\n                                return Regex.IsMatch(baseUrl, @\"^https?://\");\n                            }\n\n                            var list = new List<XmlNodeList>()\n                            {\n                                representation.ChildNodes,\n                                adaptationSet.ChildNodes,\n                                period.ChildNodes,\n                                mpdDoc.ChildNodes\n                            };\n\n                            foreach (XmlNodeList xmlNodeList in list)\n                            {\n                                foreach (XmlNode node in xmlNodeList)\n                                {\n                                    if (node.Name == \"BaseURL\")\n                                    {\n                                        baseUrl = node.InnerText + baseUrl;\n                                        if (CheckBaseUrl()) break;\n                                    }\n                                }\n                                if (CheckBaseUrl()) break;\n                            }\n\n                            string GetBaseUrl(string url)\n                            {\n                                if (url.Contains(\"?\"))\n                                    url = url.Remove(url.LastIndexOf('?'));\n                                url = url.Substring(0, url.LastIndexOf('/') + 1);\n                                return url;\n                            }\n\n                            var mpdBaseUrl = string.IsNullOrEmpty(defaultBase) ? GetBaseUrl(mpdUrl) : defaultBase;\n                            if (!string.IsNullOrEmpty(mpdBaseUrl) && !CheckBaseUrl())\n                            {\n                                if (!mpdBaseUrl.EndsWith(\"/\") && !baseUrl.StartsWith(\"/\"))\n                                {\n                                    mpdBaseUrl += \"/\";\n                                }\n                                baseUrl = CombineURL(mpdBaseUrl, baseUrl);\n                            }\n                            var representationId = GetAttribute(\"id\");\n                            var lang = GetAttribute(\"lang\");\n                            var bandwidth = IntOrNull(GetAttribute(\"bandwidth\"));\n                            var f = new Dictionary<string, dynamic>\n                            {\n                                [\"PeriodIndex\"] = periodIndex,\n                                [\"ContentType\"] = contentType,\n                                [\"FormatId\"] = representationId,\n                                [\"ManifestUrl\"] = mpdUrl,\n                                [\"Width\"] = IntOrNull(GetAttribute(\"width\")),\n                                [\"Height\"] = IntOrNull(GetAttribute(\"height\")),\n                                [\"Tbr\"] = DoubleOrNull(bandwidth, 1000),\n                                [\"Asr\"] = IntOrNull(GetAttribute(\"audioSamplingRate\")),\n                                [\"Fps\"] = IntOrNull(GetAttribute(\"frameRate\")),\n                                [\"Language\"] = lang,\n                                [\"Codecs\"] = GetAttribute(\"codecs\")\n                            };\n\n                            var representationMsInfo = ExtractMultisegmentInfo(representation, nsMgr, adaptionSetMsInfo);\n\n                            string PrepareTemplate(string templateName, string[] identifiers)\n                            {\n                                var tmpl = representationMsInfo[templateName];\n                                var t = new StringBuilder();\n                                var inTemplate = false;\n                                foreach (var ch in tmpl)\n                                {\n                                    t.Append(ch);\n                                    if (ch == '$')\n                                    {\n                                        inTemplate = !inTemplate;\n                                    }\n                                    else if (ch == '%' && !inTemplate)\n                                    {\n                                        t.Append(ch);\n                                    }\n                                }\n                                var str = t.ToString();\n                                str = str.Replace(\"$RepresentationID$\", representationId);\n                                str = Regex.Replace(str, \"\\\\$(\" + string.Join(\"|\", identifiers) + \")\\\\$\", \"{{$1}}\");\n                                str = Regex.Replace(str, \"\\\\$(\" + string.Join(\"|\", identifiers) + \")%([^$]+)d\\\\$\", \"{{$1}}{0:D$2}\");\n                                str = str.Replace(\"$$\", \"$\");\n                                return str;\n                            }\n\n                            string PadNumber(string template, string key, long value)\n                            {\n                                string ReplaceFirst(string text, string search, string replace)\n                                {\n                                    int pos = text.IndexOf(search);\n                                    if (pos < 0)\n                                    {\n                                        return text;\n                                    }\n                                    return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);\n                                }\n\n                                template = template.Replace(\"{{\" + key + \"}}\", \"\");\n                                var m = Regex.Match(template, \"{0:D(\\\\d+)}\");\n                                return ReplaceFirst(template, m.Value, value.ToString(\"0\".PadRight(Convert.ToInt32(m.Groups[1].Value), '0')));\n                            }\n\n                            if (representationMsInfo.ContainsKey(\"Initialization\"))\n                            {\n                                var initializationTemplate = PrepareTemplate(\"Initialization\", new string[] { \"Bandwidth\" });\n                                var initializationUrl = \"\";\n                                if (initializationTemplate.Contains(\"{0:D\"))\n                                {\n                                    if (initializationTemplate.Contains(\"{{Bandwidth}}\"))\n                                        initializationUrl = PadNumber(initializationTemplate, \"Bandwidth\", bandwidth);\n                                }\n                                else\n                                {\n                                    initializationUrl = initializationTemplate.Replace(\"{{Bandwidth}}\", bandwidth.ToString());\n                                }\n                                representationMsInfo[\"InitializationUrl\"] = CombineURL(baseUrl, initializationUrl);\n                            }\n\n                            string LocationKey(string location)\n                            {\n                                return Regex.IsMatch(location, \"^https?://\") ? \"url\" : \"path\";\n                            }\n\n                            if (!representationMsInfo.ContainsKey(\"SegmentUrls\") && representationMsInfo.ContainsKey(\"Media\"))\n                            {\n                                var mediaTemplate = PrepareTemplate(\"Media\", new string[] { \"Number\", \"Bandwidth\", \"Time\" });\n                                var mediaLocationKey = LocationKey(mediaTemplate);\n\n                                if (mediaTemplate.Contains(\"{{Number\") && !representationMsInfo.ContainsKey(\"S\"))\n                                {\n                                    var segmentDuration = 0.0;\n                                    if (!representationMsInfo.ContainsKey(\"TotalNumber\") && representationMsInfo.ContainsKey(\"SegmentDuration\"))\n                                    {\n                                        segmentDuration = DoubleOrNull(representationMsInfo[\"SegmentDuration\"], representationMsInfo[\"Timescale\"]);\n                                        representationMsInfo[\"TotalNumber\"] = (int)Math.Ceiling(periodDuration.TotalSeconds / segmentDuration);\n                                    }\n                                    var fragments = new List<Dictionary<string, dynamic>>();\n                                    for (int i = representationMsInfo[\"StartNumber\"]; i < representationMsInfo[\"StartNumber\"] + representationMsInfo[\"TotalNumber\"]; i++)\n                                    {\n                                        var segUrl = \"\";\n                                        if (mediaTemplate.Contains(\"{0:D\"))\n                                        {\n                                            if (mediaTemplate.Contains(\"{{Bandwidth}}\"))\n                                                segUrl = PadNumber(mediaTemplate, \"Bandwidth\", bandwidth);\n                                            if (mediaTemplate.Contains(\"{{Number}}\"))\n                                                segUrl = PadNumber(mediaTemplate, \"Number\", i);\n                                        }\n                                        else\n                                        {\n                                            segUrl = mediaTemplate.Replace(\"{{Bandwidth}}\", bandwidth.ToString());\n                                            segUrl = segUrl.Replace(\"{{Number}}\", i.ToString());\n                                        }\n                                        fragments.Add(new Dictionary<string, dynamic>()\n                                        {\n                                            [mediaLocationKey] = CombineURL(baseUrl, segUrl),\n                                            [\"duration\"] = segmentDuration\n                                        });\n                                    }\n                                    representationMsInfo[\"Fragments\"] = fragments;\n                                }\n                                else\n                                {\n                                    var fragments = new List<Dictionary<string, dynamic>>();\n\n                                    var segmentTime = 0L;\n                                    var segmentD = 0L;\n                                    var segmentNumber = representationMsInfo[\"StartNumber\"];\n\n                                    void addSegmentUrl()\n                                    {\n                                        var segUrl = \"\";\n                                        if (mediaTemplate.Contains(\"{0:D\"))\n                                        {\n                                            if (mediaTemplate.Contains(\"{{Bandwidth}}\"))\n                                                segUrl = PadNumber(mediaTemplate, \"Bandwidth\", bandwidth);\n                                            if (mediaTemplate.Contains(\"{{Number}}\"))\n                                                segUrl = PadNumber(mediaTemplate, \"Number\", segmentNumber);\n                                            if (mediaTemplate.Contains(\"{{Time}}\"))\n                                                segUrl = PadNumber(mediaTemplate, \"Time\", segmentTime);\n                                        }\n                                        else\n                                        {\n                                            segUrl = mediaTemplate.Replace(\"{{Bandwidth}}\", bandwidth.ToString());\n                                            segUrl = segUrl.Replace(\"{{Number}}\", segmentNumber.ToString());\n                                            segUrl = segUrl.Replace(\"{{Time}}\", segmentTime.ToString());\n                                        }\n                                        fragments.Add(new Dictionary<string, dynamic>()\n                                        {\n                                            [mediaLocationKey] = CombineURL(baseUrl, segUrl),\n                                            [\"duration\"] = DoubleOrNull(segmentD, representationMsInfo[\"Timescale\"])\n                                        });\n                                    }\n\n                                    if (representationMsInfo.ContainsKey(\"S\"))\n                                    {\n                                        for (int i = 0; i < representationMsInfo[\"S\"].Count; i++)\n                                        {\n                                            var s = representationMsInfo[\"S\"][i];\n                                            segmentTime = s[\"t\"] == 0 ? segmentTime : s[\"t\"];\n                                            segmentD = s[\"d\"];\n                                            addSegmentUrl();\n                                            segmentNumber++;\n                                            for (int j = 0; j < s[\"r\"]; j++)\n                                            {\n                                                segmentTime += segmentD;\n                                                addSegmentUrl();\n                                                segmentNumber++;\n                                            }\n                                            segmentTime += segmentD;\n                                        }\n                                    }\n                                    representationMsInfo[\"Fragments\"] = fragments;\n                                }\n                            }\n                            else if (representationMsInfo.ContainsKey(\"SegmentUrls\") && representationMsInfo.ContainsKey(\"S\"))\n                            {\n                                var fragments = new List<Dictionary<string, dynamic>>();\n\n                                var segmentIndex = 0;\n                                var timescale = representationMsInfo[\"Timescale\"];\n                                foreach (var s in representationMsInfo[\"S\"])\n                                {\n                                    var duration = DoubleOrNull(s[\"d\"], timescale);\n                                    for (int j = 0; j < s[\"r\"] + 1; j++)\n                                    {\n                                        var segmentUri = representationMsInfo[\"SegmentUrls\"][segmentIndex];\n                                        fragments.Add(new Dictionary<string, dynamic>()\n                                        {\n                                            [LocationKey(segmentUri)] = CombineURL(baseUrl, segmentUri),\n                                            [\"duration\"] = duration\n                                        });\n                                        segmentIndex++;\n                                    }\n                                }\n\n                                representationMsInfo[\"Fragments\"] = fragments;\n                            }\n                            else if (representationMsInfo.ContainsKey(\"SegmentUrls\"))\n                            {\n                                var fragments = new List<Dictionary<string, dynamic>>();\n\n                                var segmentDuration = DoubleOrNull(representationMsInfo[\"SegmentDuration\"], representationMsInfo.ContainsKey(\"SegmentDuration\") ? representationMsInfo[\"Timescale\"] : 1);\n                                foreach (var segmentUrl in representationMsInfo[\"SegmentUrls\"])\n                                {\n                                    if (segmentDuration != null)\n                                    {\n                                        fragments.Add(new Dictionary<string, dynamic>()\n                                        {\n                                            [LocationKey(segmentUrl)] = CombineURL(baseUrl, segmentUrl),\n                                            [\"duration\"] = segmentDuration\n                                        });\n                                    }\n                                    else\n                                    {\n                                        fragments.Add(new Dictionary<string, dynamic>()\n                                        {\n                                            [LocationKey(segmentUrl)] = CombineURL(baseUrl, segmentUrl)\n                                        });\n                                    }\n                                }\n\n                                representationMsInfo[\"Fragments\"] = fragments;\n                            }\n\n                            if (representationMsInfo.ContainsKey(\"Fragments\"))\n                            {\n                                f[\"Url\"] = string.IsNullOrEmpty(mpdUrl) ? baseUrl : mpdUrl;\n                                f[\"FragmentBaseUrl\"] = baseUrl;\n                                if (representationMsInfo.ContainsKey(\"InitializationUrl\"))\n                                {\n                                    f[\"InitializationUrl\"] = CombineURL(baseUrl, representationMsInfo[\"InitializationUrl\"]);\n                                    if (f[\"InitializationUrl\"].StartsWith(\"$$Range\"))\n                                    {\n                                        f[\"InitializationUrl\"] = CombineURL(baseUrl, f[\"InitializationUrl\"]);\n                                    }\n                                    f[\"Fragments\"] = representationMsInfo[\"Fragments\"];\n                                }\n                            }\n                            else\n                            {\n                                //整段mp4\n                                f[\"Fragments\"] = new List<Dictionary<string, dynamic>> {\n                                    new Dictionary<string, dynamic>()\n                                    {\n                                        [\"url\"] = baseUrl,\n                                        [\"duration\"] = ts.TotalSeconds\n                                    }\n                                };\n                            }\n\n                            //处理同一ID分散在不同Period的情况\n                            if (formatList.Any(_f => _f[\"FormatId\"] == f[\"FormatId\"] && _f[\"Width\"] == f[\"Width\"] && _f[\"ContentType\"] == f[\"ContentType\"]))\n                            {\n                                for (int i = 0; i < formatList.Count; i++)\n                                {\n                                    //参数相同但不在同一个Period才可以\n                                    if (formatList[i][\"FormatId\"] == f[\"FormatId\"] && formatList[i][\"Width\"] == f[\"Width\"] && formatList[i][\"ContentType\"] == f[\"ContentType\"] && formatList[i][\"PeriodIndex\"] != f[\"PeriodIndex\"]) \n                                    {\n                                        formatList[i][\"Fragments\"].AddRange(f[\"Fragments\"]);\n                                        break;\n                                    }\n                                }\n                            }\n                            else\n                            {\n                                formatList.Add(f);\n                            }\n\n                        }\n                    }\n                }\n            }\n\n            //排序\n            formatList.Sort((a, b) =>\n            {\n                return (a[\"Width\"] + a[\"Height\"]) * 1000 + a[\"Tbr\"] > (b[\"Width\"] + b[\"Height\"]) * 1000 + b[\"Tbr\"] ? -1 : 1;\n            });\n\n            //默认为最高码率的视频和音频\n            var bestVideo = SelectBestVideo(formatList);\n            var bestAudio = SelectBestAudio(formatList);\n\n            var audioLangList = new List<string>();\n            formatList.ForEach(f =>\n            {\n                if (f[\"ContentType\"] == \"audio\" && !audioLangList.Contains(f[\"Language\"])) audioLangList.Add(f[\"Language\"]);\n            });\n\n            if (audioLangList.Count > 1)\n            {\n                string Stringify(Dictionary<string, dynamic> f)\n                {\n                    var type = f[\"ContentType\"] == \"audio\" ? \"Audio\" : \"Video\";\n                    var res = type == \"Video\" ? $\"[{f[\"Width\"]}x{f[\"Height\"]}]\" : \"\";\n                    var id = $\"[{f[\"FormatId\"]}] \";\n                    var tbr = $\"[{((int)f[\"Tbr\"]).ToString().PadLeft(4)} Kbps] \";\n                    var asr = f[\"Asr\"] != -1 ? $\"[{f[\"Asr\"]} Hz] \" : \"\";\n                    var fps = f[\"Fps\"] != -1 ? $\"[{f[\"Fps\"]} fps] \" : \"\";\n                    var lang = string.IsNullOrEmpty(f[\"Language\"]) ? \"\" : $\"[{f[\"Language\"]}] \";\n                    var codecs = $\"[{f[\"Codecs\"]}] \";\n                    return $\"{type} => {id}{tbr}{asr}{fps}{lang}{codecs}{res}\";\n                }\n\n                var startCursorIndex = Console.CursorTop;\n                var cursorIndex = startCursorIndex;\n                for (int i = 0; i < formatList.Count; i++)\n                {\n                    Console.WriteLine(\"\".PadRight(13) + $\"[{i.ToString().PadLeft(2)}]. {Stringify(formatList[i])}\");\n                    cursorIndex++;\n                }\n                LOGGER.PrintLine(\"Found Multiple Language Audio Tracks.\\r\\n\" + \"\".PadRight(13) + \"Please Select What You Want(Up to 1 Video and 1 Audio).\");\n                Console.Write(\"\".PadRight(13) + \"Enter Numbers Separated By A Space: \");\n                var input = Console.ReadLine();\n                cursorIndex += 2;\n                try\n                {\n                    for (int i = startCursorIndex; i < cursorIndex; i++)\n                    {\n                        Console.SetCursorPosition(0, i);\n                        Console.Write(\"\".PadRight(300));\n                    }\n                    Console.SetCursorPosition(0, startCursorIndex);\n                }\n                catch (Exception)\n                {\n                    ;\n                }\n                if (!string.IsNullOrEmpty(input))\n                {\n                    bestVideo = new Dictionary<string, dynamic>() { [\"Tbr\"] = 0 };\n                    bestAudio = new Dictionary<string, dynamic>() { [\"Tbr\"] = 0 };\n                    foreach (var index in input.Split())\n                    {\n                        var n = 0;\n                        int.TryParse(index, out n);\n                        if (formatList[n][\"ContentType\"] == \"audio\")\n                        {\n                            bestAudio = formatList[n];\n                        }\n                        else\n                        {\n                            bestVideo = formatList[n];\n                        }\n                    }\n                }\n            }\n\n            if (bestVideo.Keys.Count > 1 && bestAudio.Keys.Count > 1)  //音视频\n            {\n                return GenerateMasterList(downDir, bestVideo, bestAudio);\n            }\n            else if (bestAudio.Keys.Count > 1)  //仅有音频\n            {\n                return GenerateMasterList(downDir, bestAudio);\n            }\n            else if (bestVideo.Keys.Count > 1)  //仅有视频\n            {\n                return GenerateMasterList(downDir, bestVideo);\n            }\n            else\n            {\n                return \"ERROR\";\n            }\n        }\n\n\n        /// <summary>\n        /// 返回master文件地址\n        /// </summary>\n        /// <param name=\"downDir\">存储目录</param>\n        /// <param name=\"fs\">format列表</param>\n        /// <returns></returns>\n        static string GenerateMasterList(string downDir, params Dictionary<string, dynamic>[] fs)\n        {\n            var audioPath = \"\";\n            var videoPath = \"\";\n            var bandwidth = 0;\n            var codecsList = new List<string>();\n            var res = \"\";\n\n            foreach (var f in fs)\n            {\n                var m3u8 = GenerateM3u8(f);\n                bandwidth += Convert.ToInt32(f[\"Tbr\"] * 1000);\n                //Video\n                if (m3u8.Contains(\"#EXT-VIDEO-WIDTH\"))\n                {\n                    var _path = Path.Combine(downDir, \"mpdVideo.m3u8\");\n                    File.WriteAllText(_path, m3u8);\n                    videoPath = new Uri(_path).ToString();\n                    res = f[\"Width\"] + \"x\" + f[\"Height\"];\n                }\n                else\n                {\n                    var _path = Path.Combine(downDir, \"mpdAudio.m3u8\");\n                    File.WriteAllText(_path, m3u8);\n                    audioPath = new Uri(_path).ToString();\n                }\n                codecsList.Add(f[\"Codecs\"]);\n            }\n\n            var content = \"\";\n            if ((videoPath == \"\" && audioPath != \"\") || Global.VIDEO_TYPE == \"IGNORE\")\n            {\n                return audioPath;\n            }\n            else if (audioPath == \"\" && videoPath != \"\")\n            {\n                return videoPath;\n            }\n            else\n            {\n                if (!Directory.Exists(downDir + \"(Audio)\"))\n                    Directory.CreateDirectory(downDir + \"(Audio)\");\n                var _path = Path.Combine(downDir + \"(Audio)\", \"mpdAudio.m3u8\");\n                File.Copy(new Uri(audioPath).LocalPath, _path, true);\n                audioPath = new Uri(_path).ToString();\n                content = $\"#EXTM3U\\r\\n\" +\n                    $\"#EXT-X-MEDIA:TYPE=AUDIO,URI=\\\"{audioPath}\\\",GROUP-ID=\\\"default-audio-group\\\",NAME=\\\"stream_0\\\",AUTOSELECT=YES,CHANNELS=\\\"0\\\"\\r\\n\" +\n                    $\"#EXT-X-STREAM-INF:BANDWIDTH={bandwidth},CODECS=\\\"{string.Join(\",\", codecsList)}\\\",RESOLUTION={res},AUDIO=\\\"default-audio-group\\\"\\r\\n\" +\n                    $\"{videoPath}\";\n            }\n\n            var _masterPath = Path.Combine(downDir, \"master.m3u8\");\n            File.WriteAllText(_masterPath, content);\n            return new Uri(_masterPath).ToString();\n        }\n\n        static string GenerateM3u8(Dictionary<string, dynamic> f)\n        {\n            StringBuilder sb = new StringBuilder();\n            sb.AppendLine(\"#EXTM3U\");\n            sb.AppendLine(\"#EXT-X-VERSION:3\");\n            sb.AppendLine(\"#EXT-X-PLAYLIST-TYPE:VOD\");\n            sb.AppendLine(\"#CREATED-BY:N_m3u8DL-CLI\");\n\n            //Video\n            if (f[\"ContentType\"] != \"audio\")\n            {\n                sb.AppendLine($\"#EXT-VIDEO-WIDTH:{f[\"Width\"]}\");\n                sb.AppendLine($\"#EXT-VIDEO-HEIGHT:{f[\"Height\"]}\");\n            }\n\n            sb.AppendLine($\"#EXT-CODEC:{f[\"Codecs\"]}\");\n            sb.AppendLine($\"#EXT-TBR:{f[\"Tbr\"]}\");\n            if (f.ContainsKey(\"InitializationUrl\"))\n            {\n                string initUrl = f[\"InitializationUrl\"];\n                if (MPD_URL.Contains(\"?\") && MPD_URL.Contains(\".kakao.com/\"))\n                {\n                    initUrl += new Regex(\"\\\\?.*\").Match(MPD_URL).Value;\n                }\n                if (Regex.IsMatch(initUrl, \"\\\\$\\\\$Range=(\\\\d+)-(\\\\d+)\"))\n                {\n                    var match = Regex.Match(initUrl, \"\\\\$\\\\$Range=(\\\\d+)-(\\\\d+)\");\n                    string rangeStr = match.Value;\n                    long start = Convert.ToInt64(match.Groups[1].Value);\n                    long end = Convert.ToInt64(match.Groups[2].Value);\n                    sb.AppendLine($\"#EXT-X-MAP:URI=\\\"{initUrl.Replace(rangeStr, \"\")}\\\",BYTERANGE=\\\"{end + 1 - start}@{start}\\\"\");\n                }\n                else\n                {\n                    sb.AppendLine($\"#EXT-X-MAP:URI=\\\"{initUrl}\\\"\");\n                }\n            }\n            sb.AppendLine(\"#EXT-X-KEY:METHOD=PLZ-KEEP-RAW,URI=\\\"None\\\"\"); //使下载器使用二进制合并\n\n            List<Dictionary<string, dynamic>> fragments = f[\"Fragments\"];\n\n            //检测最后一片的有效性\n            if (fragments.Count > 1)\n            {\n                bool checkValid(string url)\n                {\n                    try\n                    {\n                        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));\n                        request.Timeout = 120000;\n                        HttpWebResponse response = (HttpWebResponse)request.GetResponse();\n                        if (((int)response.StatusCode).ToString().StartsWith(\"2\")) return true;\n                        else return false;\n                    }\n                    catch (Exception) { return false; }\n                }\n\n                var last = fragments.Last();\n                var secondToLast = fragments[fragments.Count - 2];\n                var urlLast = last.ContainsKey(\"url\") ? last[\"url\"] : last[\"path\"];\n                var urlSecondToLast = secondToLast.ContainsKey(\"url\") ? secondToLast[\"url\"] : secondToLast[\"path\"];\n                if (MPD_URL.Contains(\"?\") && MPD_URL.Contains(\".kakao.com/\"))\n                {\n                    urlLast += new Regex(\"\\\\?.*\").Match(MPD_URL).Value;\n                    urlSecondToLast += new Regex(\"\\\\?.*\").Match(MPD_URL).Value;\n                }\n                //普通分段才判断\n                if (urlLast.StartsWith(\"http\") && !Regex.IsMatch(urlLast, \"\\\\$\\\\$Range=(\\\\d+)-(\\\\d+)\"))\n                {\n                    LOGGER.PrintLine(strings.checkingLast + (f[\"ContentType\"] != \"audio\" ? \"(Video)\" : \"(Audio)\"));\n                    LOGGER.WriteLine(strings.checkingLast + (f[\"ContentType\"] != \"audio\" ? \"(Video)\" : \"(Audio)\"));\n                    //倒数第二段正常，倒数第一段不正常\n                    if (checkValid(urlSecondToLast) && !checkValid(urlLast))\n                        fragments.RemoveAt(fragments.Count - 1);\n                }\n            }\n\n            //添加分段\n            foreach (var seg in fragments)\n            {\n                var dur = seg.ContainsKey(\"duration\") ? seg[\"duration\"] : 0.0;\n                var url = seg.ContainsKey(\"url\") ? seg[\"url\"] : seg[\"path\"];\n                if (MPD_URL.Contains(\"?\") && MPD_URL.Contains(\".kakao.com/\"))\n                {\n                    url += new Regex(\"\\\\?.*\").Match(MPD_URL).Value;\n                }\n                sb.AppendLine($\"#EXTINF:{dur.ToString(\"0.00\")}\");\n                if (Regex.IsMatch(url, \"\\\\$\\\\$Range=(\\\\d+)-(\\\\d+)\"))\n                {\n                    var match = Regex.Match(url, \"\\\\$\\\\$Range=(\\\\d+)-(\\\\d+)\");\n                    string rangeStr = match.Value;\n                    long start = Convert.ToInt64(match.Groups[1].Value);\n                    long end = Convert.ToInt64(match.Groups[2].Value);\n                    sb.AppendLine($\"#EXT-X-BYTERANGE:{end + 1 - start}@{start}\");\n                    sb.AppendLine(url.Replace(rangeStr, \"\"));\n                }\n                else\n                {\n                    sb.AppendLine(url);\n                }\n            }\n\n            sb.AppendLine(\"#EXT-X-ENDLIST\");\n\n            return sb.ToString();\n        }\n\n        static Dictionary<string, dynamic> SelectBestVideo(List<Dictionary<string, dynamic>> fs)\n        {\n            var best = new Dictionary<string, dynamic>() { [\"Tbr\"] = 0 };\n            var bandwidth = best[\"Tbr\"];\n            var width = 0;\n\n            foreach (var f in fs)\n            {\n                var w = f[\"Width\"];\n                var h = f[\"Height\"];\n                if (f[\"ContentType\"] == \"video\")\n                {\n                    if (f[\"Tbr\"] > bandwidth && w > width)\n                    {\n                        best = f;\n                        bandwidth = f[\"Tbr\"];\n                        width = w;\n                    }\n                }\n            }\n\n            return best;\n        }\n\n        static Dictionary<string, dynamic> SelectBestAudio(List<Dictionary<string, dynamic>> fs)\n        {\n            var best = new Dictionary<string, dynamic>() { [\"Tbr\"] = 0 };\n            var bandwidth = best[\"Tbr\"];\n\n            foreach (var f in fs)\n            {\n                if (f[\"ContentType\"] == \"audio\")\n                {\n                    if (f[\"Tbr\"] > bandwidth)\n                    {\n                        best = f;\n                        bandwidth = f[\"Tbr\"];\n                    }\n                }\n            }\n\n            return best;\n        }\n\n        static int IntOrNull(object text, int scale = 1)\n        {\n            try\n            {\n                return Convert.ToInt32(text) / scale;\n            }\n            catch (Exception)\n            {\n                return -1;\n            }\n        }\n\n        static double DoubleOrNull(object text, int scale = 1)\n        {\n            try\n            {\n                return Convert.ToDouble(text) / scale;\n            }\n            catch (Exception)\n            {\n                return -1;\n            }\n        }\n\n        /// <summary>\n        /// 拼接Baseurl和RelativeUrl\n        /// </summary>\n        /// <param name=\"baseurl\">Baseurl</param>\n        /// <param name=\"url\">RelativeUrl</param>\n        /// <returns></returns>\n        static string CombineURL(string baseurl, string url)\n        {\n            if (url.StartsWith(\"$$Range\"))\n            {\n                return baseurl + url;\n            }\n            Uri uri1 = new Uri(baseurl);\n            Uri uri2 = new Uri(uri1, url);\n            url = uri2.ToString();\n\n            return url;\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/MyOptions.cs",
    "content": "﻿using CommandLine;\nusing CommandLine.Text;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace N_m3u8DL_CLI\n{\n    internal class MyOptions\n    {\n        [Value(0, Hidden = true, MetaName = \"Input Source\", HelpText = \"Help_input\", ResourceType = typeof(strings))]\n        public string Input { get; set; }\n\n        [Option(\"workDir\", HelpText = \"Help_workDir\", ResourceType = typeof(strings))]\n        public string WorkDir { get; set; }\n\n        [Option(\"saveName\", HelpText = \"Help_saveName\", ResourceType = typeof(strings))]\n        public string SaveName { get; set; } = \"\";\n\n        [Option(\"baseUrl\", HelpText = \"Help_baseUrl\", ResourceType = typeof(strings))]\n        public string BaseUrl { get; set; }\n\n        [Option(\"headers\", HelpText = \"Help_headers\", ResourceType = typeof(strings))]\n        public string Headers { get; set; } = \"\";\n\n        [Option(\"maxThreads\", Default = 32U, HelpText = \"Help_maxThreads\", ResourceType = typeof(strings))]\n        public uint MaxThreads { get; set; }\n\n        [Option(\"minThreads\", Default = 16U, HelpText = \"Help_minThreads\", ResourceType = typeof(strings))]\n        public uint MinThreads { get; set; }\n\n        [Option(\"retryCount\", Default = 15U, HelpText = \"Help_retryCount\", ResourceType = typeof(strings))]\n        public uint RetryCount { get; set; }\n\n        [Option(\"timeOut\", Default = 10U, HelpText = \"Help_timeOut\", ResourceType = typeof(strings))]\n        public uint TimeOut { get; set; }\n\n        [Option(\"muxSetJson\", HelpText = \"Help_muxSetJson\", ResourceType = typeof(strings))]\n        public string MuxSetJson { get; set; }\n\n        [Option(\"useKeyFile\", HelpText = \"Help_useKeyFile\", ResourceType = typeof(strings))]\n        public string UseKeyFile { get; set; }\n\n        [Option(\"useKeyBase64\", HelpText = \"Help_useKeyBase64\", ResourceType = typeof(strings))]\n        public string UseKeyBase64 { get; set; }\n\n        [Option(\"useKeyIV\", HelpText = \"Help_useKeyIV\", ResourceType = typeof(strings))]\n        public string UseKeyIV { get; set; }\n\n        [Option(\"downloadRange\", HelpText = \"Help_downloadRange\", ResourceType = typeof(strings))]\n        public string DownloadRange { get; set; }\n\n        [Option(\"liveRecDur\", HelpText = \"Help_liveRecDur\", ResourceType = typeof(strings))]\n        public string LiveRecDur { get; set; }\n\n        [Option(\"stopSpeed\", HelpText = \"Help_stopSpeed\", ResourceType = typeof(strings))]\n        public long StopSpeed { get; set; } = 0L;\n\n        [Option(\"maxSpeed\", HelpText = \"Help_maxSpeed\", ResourceType = typeof(strings))]\n        public long MaxSpeed { get; set; } = 0L;\n\n        [Option(\"proxyAddress\", HelpText = \"Help_proxyAddress\", ResourceType = typeof(strings))]\n        public string ProxyAddress { get; set; }\n\n        [Option(\"enableDelAfterDone\", HelpText = \"Help_enableDelAfterDone\", ResourceType = typeof(strings))]\n        public bool EnableDelAfterDone { get; set; }\n\n        [Option(\"enableMuxFastStart\", HelpText = \"Help_enableMuxFastStart\", ResourceType = typeof(strings))]\n        public bool EnableMuxFastStart { get; set; }\n\n        [Option(\"enableBinaryMerge\", HelpText = \"Help_enableBinaryMerge\", ResourceType = typeof(strings))]\n        public bool EnableBinaryMerge { get; set; }\n\n        [Option(\"enableParseOnly\", HelpText = \"Help_enableParseOnly\", ResourceType = typeof(strings))]\n        public bool EnableParseOnly { get; set; }\n\n        [Option(\"enableAudioOnly\", HelpText = \"Help_enableAudioOnly\", ResourceType = typeof(strings))]\n        public bool EnableAudioOnly { get; set; }\n\n        [Option(\"disableDateInfo\", HelpText = \"Help_disableDateInfo\", ResourceType = typeof(strings))]\n        public bool DisableDateInfo { get; set; }\n\n        [Option(\"disableIntegrityCheck\", HelpText = \"Help_disableIntegrityCheck\", ResourceType = typeof(strings))]\n        public bool DisableIntegrityCheck { get; set; }\n\n        [Option(\"noMerge\", HelpText = \"Help_noMerge\", ResourceType = typeof(strings))]\n        public bool NoMerge { get; set; }\n\n        [Option(\"noProxy\", HelpText = \"Help_noProxy\", ResourceType = typeof(strings))]\n        public bool NoProxy { get; set; }\n\n        [Option(\"registerUrlProtocol\", HelpText = \"Help_registerUrlProtocol\", ResourceType = typeof(strings))]\n        public bool RegisterUrlProtocol { get; set; }\n\n        [Option(\"unregisterUrlProtocol\", HelpText = \"Help_unregisterUrlProtocol\", ResourceType = typeof(strings))]\n        public bool UnregisterUrlProtocol { get; set; }\n\n        [Option(\"enableChaCha20\", HelpText = \"enableChaCha20\")]\n        public bool EnableChaCha20 { get; set; }\n\n        [Option(\"chaCha20KeyBase64\", HelpText = \"ChaCha20KeyBase64\")]\n        public string ChaCha20KeyBase64 { get; set; }\n\n        [Option(\"chaCha20NonceBase64\", HelpText = \"ChaCha20NonceBase64\")]\n        public string ChaCha20NonceBase64 { get; set; }\n\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/N_m3u8DL-CLI.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"..\\packages\\Costura.Fody.4.1.0\\build\\Costura.Fody.props\" Condition=\"Exists('..\\packages\\Costura.Fody.4.1.0\\build\\Costura.Fody.props')\" />\n  <Import Project=\"..\\packages\\Resource.Embedder.2.1.1\\build\\Resource.Embedder.props\" Condition=\"Exists('..\\packages\\Resource.Embedder.2.1.1\\build\\Resource.Embedder.props')\" />\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{4FB61439-B738-46AC-B3AF-2BF72150D057}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>N_m3u8DL_CLI</RootNamespace>\n    <AssemblyName>N_m3u8DL-CLI</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <TargetFrameworkProfile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>x86</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup>\n    <ApplicationIcon>logo_3Iv_icon.ico</ApplicationIcon>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"BrotliSharpLib, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3f4e2a1cd615fcb7, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\BrotliSharpLib.0.3.3\\lib\\net451\\BrotliSharpLib.dll</HintPath>\n    </Reference>\n    <Reference Include=\"CommandLine, Version=2.8.0.0, Culture=neutral, PublicKeyToken=5a870481e358d379, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\CommandLineParser.2.8.0\\lib\\net45\\CommandLine.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Costura, Version=4.1.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Costura.Fody.4.1.0\\lib\\net40\\Costura.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Build.Framework\" />\n    <Reference Include=\"Microsoft.Build.Utilities.v4.0\" />\n    <Reference Include=\"Microsoft.JScript\" />\n    <Reference Include=\"Microsoft.Win32.TaskScheduler, Version=2.8.7.0, Culture=neutral, PublicKeyToken=c416bc1b32d97233, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\TaskScheduler.2.8.7\\lib\\net452\\Microsoft.Win32.TaskScheduler.dll</HintPath>\n    </Reference>\n    <Reference Include=\"MihaZupan.HttpToSocks5Proxy, Version=1.4.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\HttpToSocks5Proxy.1.4.0\\lib\\net45\\MihaZupan.HttpToSocks5Proxy.dll</HintPath>\n    </Reference>\n    <Reference Include=\"netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51\" />\n    <Reference Include=\"Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.13.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"NiL.JS, Version=2.5.1428.0, Culture=neutral, PublicKeyToken=fa941a7c2a4de689, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NiL.JS.2.5.1428\\lib\\net45\\NiL.JS.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Collections\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.IO\" />\n    <Reference Include=\"System.IO.Compression\" />\n    <Reference Include=\"System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Runtime.CompilerServices.Unsafe.4.5.2\\lib\\netstandard1.0\\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"UACHelper, Version=1.3.0.4, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\UACHelper.1.3.0.5\\lib\\net40\\UACHelper.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"CSChaCha20.cs\" />\n    <Compile Include=\"Decode51CtoKey.cs\" />\n    <Compile Include=\"DecodeCdeledu.cs\" />\n    <Compile Include=\"DecodeDdyun.cs\" />\n    <Compile Include=\"DecodeHuke88Key.cs\" />\n    <Compile Include=\"DecodeImooc.cs\" />\n    <Compile Include=\"Decrypter.cs\" />\n    <Compile Include=\"DecodeNfmovies.cs\" />\n    <Compile Include=\"FFmpeg.cs\" />\n    <Compile Include=\"Global.cs\" />\n    <Compile Include=\"HLSLiveDownloader.cs\" />\n    <Compile Include=\"HLSTags.cs\" />\n    <Compile Include=\"IqJsonParser.cs\" />\n    <Compile Include=\"LOGGER.cs\" />\n    <Compile Include=\"DownloadManager.cs\" />\n    <Compile Include=\"MPDParser.cs\" />\n    <Compile Include=\"MyOptions.cs\" />\n    <Compile Include=\"Parser.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"ProgressReporter.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Downloader.cs\" />\n    <Compile Include=\"strings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>strings.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"strings.en-US.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>strings.en-US.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"strings.zh-TW.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>strings.zh-TW.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Watcher.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\">\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <COMReference Include=\"Scripting\">\n      <Guid>{420B2830-E718-11CF-893D-00A0C9054228}</Guid>\n      <VersionMajor>1</VersionMajor>\n      <VersionMinor>0</VersionMinor>\n      <Lcid>0</Lcid>\n      <WrapperTool>tlbimp</WrapperTool>\n      <Isolated>False</Isolated>\n      <EmbedInteropTypes>True</EmbedInteropTypes>\n    </COMReference>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"logo_3Iv_icon.ico\" />\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"strings.en-US.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>strings.en-US.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"strings.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>strings.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"strings.zh-TW.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>strings.zh-TW.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息，请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Resource.Embedder.2.1.1\\build\\Resource.Embedder.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Resource.Embedder.2.1.1\\build\\Resource.Embedder.props'))\" />\n    <Error Condition=\"!Exists('..\\packages\\Fody.6.0.0\\build\\Fody.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Fody.6.0.0\\build\\Fody.targets'))\" />\n    <Error Condition=\"!Exists('..\\packages\\Costura.Fody.4.1.0\\build\\Costura.Fody.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Costura.Fody.4.1.0\\build\\Costura.Fody.props'))\" />\n  </Target>\n  <Import Project=\"..\\packages\\Fody.6.0.0\\build\\Fody.targets\" Condition=\"Exists('..\\packages\\Fody.6.0.0\\build\\Fody.targets')\" />\n</Project>"
  },
  {
    "path": "N_m3u8DL-CLI/Parser.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace N_m3u8DL_CLI\n{\n    class Parser\n    {\n        struct Audio\n        {\n            public string Name;\n            public string Language;\n            public string Uri;\n            public string Channels;\n            public override string ToString()\n            {\n                return $\"[{Name}] [{Language}] [{(string.IsNullOrEmpty(Channels) ? \"\" : $\"{Channels}ch\")}]\".Replace(\"[]\", \"\");\n            }\n        }\n\n        struct Subtitle\n        {\n            public string Name;\n            public string Language;\n            public string Uri;\n            public override string ToString()\n            {\n                return $\"[{Name}] [{Language}]\";\n            }\n        }\n\n        //存储上一行key的信息，如果一样，就跳过下载key这一步\n        private string lastKeyLine = string.Empty;\n        //METHOD, KEY, IV\n        string[] m3u8CurrentKey = new string[] { \"NONE\", \"\", \"\" };\n        private string m3u8SavePath = string.Empty;\n        private string jsonSavePath = string.Empty;\n        private long bestBandwidth = 0;\n        private string bestUrl = string.Empty;\n        private string bestUrlAudio = string.Empty;\n        private string bestUrlSub = string.Empty;\n        Dictionary<string, List<Audio>> MEDIA_AUDIO_GROUP = new Dictionary<string, List<Audio>>(); //外挂音频所有分组信息\n        private string audioUrl = string.Empty; //音轨地址\n        Dictionary<string, List<Subtitle>> MEDIA_SUB_GROUP = new Dictionary<string, List<Subtitle>>(); //外挂字幕所有分组信息\n        private string subUrl = string.Empty; //字幕地址\n        //存放多轨道的信息\n        private ArrayList extLists = new ArrayList();\n        //标记是否已清除优酷广告分片\n        private static bool hasAd = false;\n\n        public string BaseUrl { get; set; } = string.Empty;\n        public string M3u8Url { get; set; } = string.Empty;\n        public string DownDir { get; set; } = string.Empty;\n        public string DownName { get; set; } = string.Empty;\n        public string Headers { get; set; } = string.Empty;\n        //存放Range信息，允许用户只下载部分视频\n        public static int RangeStart { get; set; } = 0;\n        public static int RangeEnd { get; set; } = -1;\n        //是否自动清除优酷广告分片\n        public static bool DelAd { get; set; } = true;\n        //存放Range信息，允许用户只下载部分视频\n        public static string DurStart { get; set; } = \"\";\n        public static string DurEnd { get; set; } = \"\";\n        public string KeyFile { get; set; } = string.Empty;\n        public string KeyBase64 { get; set; } = string.Empty;\n        public bool LiveStream { get; set; } = false;\n        public string KeyIV { get; set; } = string.Empty;\n\n        public void Parse()\n        {\n            FFmpeg.REC_TIME = \"\";\n\n            m3u8SavePath = Path.Combine(DownDir, \"raw.m3u8\");\n            jsonSavePath = Path.Combine(DownDir, \"meta.json\");\n\n            if (!Directory.Exists(DownDir))//若文件夹不存在则新建文件夹   \n                Directory.CreateDirectory(DownDir); //新建文件夹  \n\n            //存放分部的所有信息(#EXT-X-DISCONTINUITY)\n            JArray parts = new JArray();\n            //存放分片的所有信息\n            JArray segments = new JArray();\n            JObject segInfo = new JObject();\n            extLists.Clear();\n            MEDIA_AUDIO_GROUP.Clear();\n            MEDIA_SUB_GROUP.Clear();\n            string m3u8Content = string.Empty;\n            string m3u8Method = string.Empty;\n            string[] extMAP = { \"\", \"\" };\n            string[] extList = new string[10];\n            long segIndex = 0;\n            long startIndex = 0;\n            int targetDuration = 0;\n            double totalDuration = 0;\n            bool expectSegment = false, expectPlaylist = false, isIFramesOnly = false,\n                isIndependentSegments = false, isEndlist = false, isAd = false, isM3u = false;\n\n\n            //获取m3u8内容\n            //if (!LiveStream)\n            //    LOGGER.PrintLine(strings.downloadingM3u8, LOGGER.Warning);\n\n            //if (M3u8Url.Contains(\".cntv.\"))\n            //{\n            //    M3u8Url = M3u8Url.Replace(\"/h5e/\", \"/\");\n            //}\n\n            if (M3u8Url.StartsWith(\"http\"))\n            {\n                if (M3u8Url.Contains(\"nfmovies.com/hls\"))\n                    m3u8Content = DecodeNfmovies.DecryptM3u8(Global.HttpDownloadFileToBytes(M3u8Url, Headers));\n                else if (M3u8Url.Contains(\"hls.ddyunp.com/ddyun\") || M3u8Url.Contains(\"hls.90mm.me/ddyun\"))\n                    m3u8Content = DecodeDdyun.DecryptM3u8(Global.HttpDownloadFileToBytes(DecodeDdyun.GetVaildM3u8Url(M3u8Url), Headers));\n                else\n                    m3u8Content = Global.GetWebSource(M3u8Url, Headers);\n            }\n            else if (M3u8Url.StartsWith(\"file:\"))\n            {\n                Uri t = new Uri(M3u8Url);\n                m3u8Content = File.ReadAllText(t.LocalPath);\n            }\n            else if (File.Exists(M3u8Url))\n            {\n                m3u8Content = File.ReadAllText(M3u8Url);\n                if (!M3u8Url.Contains(\"\\\\\"))\n                    M3u8Url = Path.Combine(Environment.CurrentDirectory, M3u8Url);\n                Uri t = new Uri(M3u8Url);\n                M3u8Url = t.ToString();\n            }\n\n            if (m3u8Content == \"\")\n                return;\n\n            if (M3u8Url.Contains(\"tlivecloud-playback-cdn.ysp.cctv.cn\") && M3u8Url.Contains(\"endtime=\"))\n                isEndlist = true;\n\n            if (M3u8Url.Contains(\"imooc.com/\"))\n            {\n                m3u8Content = DecodeImooc.DecodeM3u8(m3u8Content);\n            }\n\n            if (m3u8Content.Contains(\"</MPD>\") && m3u8Content.Contains(\"<MPD\"))\n            {\n                //LOGGER.PrintLine(strings.startParsingMpd, LOGGER.Warning);\n                //LOGGER.WriteLine(strings.startParsingMpd);\n                var mpdSavePath = Path.Combine(DownDir, \"dash.mpd\");\n                //输出mpd文件\n                File.WriteAllText(mpdSavePath, m3u8Content);\n                //分析mpd文件\n                M3u8Url = Global.Get302(M3u8Url, Headers);\n                var newUri = MPDParser.Parse(DownDir, M3u8Url, m3u8Content, BaseUrl);\n                M3u8Url = newUri;\n                m3u8Content = File.ReadAllText(new Uri(M3u8Url).LocalPath);\n            }\n\n            if (m3u8Content.StartsWith(\"{\\\"payload\\\"\"))\n            {\n                var iqJsonPath = Path.Combine(DownDir, \"iq.json\");\n                //输出mpd文件\n                File.WriteAllText(iqJsonPath, m3u8Content);\n                //分析json文件\n                var newUri = IqJsonParser.Parse(DownDir, m3u8Content);\n                M3u8Url = newUri;\n                m3u8Content = File.ReadAllText(new Uri(M3u8Url).LocalPath);\n            }\n\n            //输出m3u8文件\n            File.WriteAllText(m3u8SavePath, m3u8Content);\n\n            //针对优酷#EXT-X-VERSION:7杜比视界片源修正\n            if (m3u8Content.Contains(\"#EXT-X-DISCONTINUITY\") && m3u8Content.Contains(\"#EXT-X-MAP\") && m3u8Content.Contains(\"ott.cibntv.net\") && m3u8Content.Contains(\"ccode=\"))\n            {\n                Regex ykmap = new Regex(\"#EXT-X-DISCONTINUITY\\\\s+#EXT-X-MAP:URI=\\\\\\\"(.*?)\\\\\\\",BYTERANGE=\\\\\\\"(.*?)\\\\\\\"\");\n                foreach (Match m in ykmap.Matches(m3u8Content))\n                {\n                    m3u8Content = m3u8Content.Replace(m.Value, $\"#EXTINF:0.000000,\\n#EXT-X-BYTERANGE:{m.Groups[2].Value}\\n{m.Groups[1].Value}\");\n                }\n            }\n\n            //针对Disney+修正\n            if (m3u8Content.Contains(\"#EXT-X-DISCONTINUITY\") && m3u8Content.Contains(\"#EXT-X-MAP\") && M3u8Url.Contains(\"media.dssott.com/\"))\n            {\n                Regex ykmap = new Regex(\"#EXT-X-MAP:URI=\\\\\\\".*?BUMPER/[\\\\s\\\\S]+?#EXT-X-DISCONTINUITY\");\n                if (ykmap.IsMatch(m3u8Content))\n                {\n                    m3u8Content = m3u8Content.Replace(ykmap.Match(m3u8Content).Value, \"#XXX\");\n                }\n            }\n\n            //针对AppleTv修正\n            if (m3u8Content.Contains(\"#EXT-X-DISCONTINUITY\") && m3u8Content.Contains(\"#EXT-X-MAP\") && (M3u8Url.Contains(\".apple.com/\") || Regex.IsMatch(m3u8Content, \"#EXT-X-MAP.*\\\\.apple\\\\.com/\"))) \n            {\n                //只取加密部分即可\n                Regex ykmap = new Regex(\"(#EXT-X-KEY:[\\\\s\\\\S]*?)(#EXT-X-DISCONTINUITY|#EXT-X-ENDLIST)\");\n                if (ykmap.IsMatch(m3u8Content))\n                {\n                    m3u8Content = \"#EXTM3U\\r\\n\" + ykmap.Match(m3u8Content).Groups[1].Value + \"\\r\\n#EXT-X-ENDLIST\";\n                }\n            }\n\n            //修复#EXT-X-KEY与#EXTINF出现次序异常问题\n            if (Regex.IsMatch(m3u8Content, \"(#EXTINF.*)(\\\\s+)(#EXT-X-KEY.*)\"))\n            {\n                m3u8Content = Regex.Replace(m3u8Content, \"(#EXTINF.*)(\\\\s+)(#EXT-X-KEY.*)\", \"$3$2$1\");\n            }\n\n            //如果BaseUrl为空则截取字符串充当\n            if (BaseUrl == \"\")\n            {\n                if (new Regex(\"#YUMING\\\\|(.*)\").IsMatch(m3u8Content))\n                    BaseUrl = new Regex(\"#YUMING\\\\|(.*)\").Match(m3u8Content).Groups[1].Value;\n                else\n                    BaseUrl = GetBaseUrl(M3u8Url, Headers);\n            }\n\n            //if (!LiveStream)\n            //{\n            //    LOGGER.WriteLine(strings.parsingM3u8);\n            //    LOGGER.PrintLine(strings.parsingM3u8);\n            //}\n\n            if (!string.IsNullOrEmpty(KeyBase64))\n            {\n                string line = \"\";\n                if (string.IsNullOrEmpty(KeyIV))\n                    line = $\"#EXT-X-KEY:METHOD=AES-128,URI=\\\"base64:{KeyBase64}\\\"\";\n                else\n                    line = $\"#EXT-X-KEY:METHOD=AES-128,URI=\\\"base64:{KeyBase64}\\\",IV=0x{KeyIV.Replace(\"0x\", \"\")}\";\n                m3u8CurrentKey = ParseKey(line);\n            }\n            if (!string.IsNullOrEmpty(KeyFile))\n            {\n                string line = \"\";\n                Uri u = new Uri(KeyFile);\n                if (string.IsNullOrEmpty(KeyIV))\n                    line = $\"#EXT-X-KEY:METHOD=AES-128,URI=\\\"{u.ToString()}\\\"\";\n                else\n                    line = $\"#EXT-X-KEY:METHOD=AES-128,URI=\\\"{u.ToString()}\\\",IV=0x{KeyIV.Replace(\"0x\", \"\")}\";\n\n                m3u8CurrentKey = ParseKey(line);\n            }\n\n            //逐行分析\n            using (StringReader sr = new StringReader(m3u8Content))\n            {\n                string line;\n                double segDuration = 0;\n                string segUrl = string.Empty;\n                //#EXT-X-BYTERANGE:<n>[@<o>]\n                long expectByte = -1; //parm n\n                long startByte = 0;  //parm o\n\n                while ((line = sr.ReadLine()) != null)\n                {\n                    if (string.IsNullOrEmpty(line))\n                        continue;\n                    if (line.StartsWith(HLSTags.ext_m3u))\n                        isM3u = true;\n                    //只下载部分字节\n                    else if (line.StartsWith(HLSTags.ext_x_byterange))\n                    {\n                        string[] t = line.Replace(HLSTags.ext_x_byterange + \":\", \"\").Split('@');\n                        if (t.Length > 0)\n                        {\n                            if (t.Length == 1)\n                            {\n                                expectByte = Convert.ToInt64(t[0]);\n                                segInfo.Add(\"expectByte\", expectByte);\n                                segInfo.Add(\"startByte\", segments.Last[\"startByte\"].Value<long>() + segments.Last[\"expectByte\"].Value<long>());\n                            }\n                            if (t.Length == 2)\n                            {\n                                expectByte = Convert.ToInt64(t[0]);\n                                startByte = Convert.ToInt64(t[1]);\n                                segInfo.Add(\"expectByte\", expectByte);\n                                segInfo.Add(\"startByte\", startByte);\n                            }\n                        }\n                        expectSegment = true;\n                    }\n                    //国家地理去广告\n                    else if (line.StartsWith(\"#UPLYNK-SEGMENT\"))\n                    {\n                        if (line.Contains(\",ad\"))\n                            isAd = true;\n                        else if (line.Contains(\",segment\"))\n                            isAd = false;\n                    }\n                    //国家地理去广告\n                    else if (isAd)\n                    {\n                        continue;\n                    }\n                    //解析定义的分段长度\n                    else if (line.StartsWith(HLSTags.ext_x_targetduration))\n                    {\n                        targetDuration = Convert.ToInt32(Convert.ToDouble(line.Replace(HLSTags.ext_x_targetduration + \":\", \"\").Trim()));\n                    }\n                    //解析起始编号\n                    else if (line.StartsWith(HLSTags.ext_x_media_sequence))\n                    {\n                        segIndex = Convert.ToInt64(line.Replace(HLSTags.ext_x_media_sequence + \":\", \"\").Trim());\n                        startIndex = segIndex;\n                    }\n                    else if (line.StartsWith(HLSTags.ext_x_discontinuity_sequence)) ;\n                    else if (line.StartsWith(HLSTags.ext_x_program_date_time))\n                    {\n                        if (string.IsNullOrEmpty(FFmpeg.REC_TIME))\n                        {\n                            FFmpeg.REC_TIME = line.Replace(HLSTags.ext_x_program_date_time + \":\", \"\").Trim();\n                        }\n                    }\n                    //解析不连续标记，需要单独合并（timestamp不同）\n                    else if (line.StartsWith(HLSTags.ext_x_discontinuity))\n                    {\n                        //修复优酷去除广告后的遗留问题\n                        if (hasAd && parts.Count > 0)\n                        {\n                            segments = (JArray)parts[parts.Count - 1];\n                            parts.RemoveAt(parts.Count - 1);\n                            hasAd = false;\n                            continue;\n                        }\n                        //常规情况的#EXT-X-DISCONTINUITY标记，新建part\n                        if (!hasAd && segments.Count >= 1)\n                        {\n                            parts.Add(segments);\n                            segments = new JArray();\n                        }\n                    }\n                    else if (line.StartsWith(HLSTags.ext_x_cue_out)) ;\n                    else if (line.StartsWith(HLSTags.ext_x_cue_out_start)) ;\n                    else if (line.StartsWith(HLSTags.ext_x_cue_span)) ;\n                    else if (line.StartsWith(HLSTags.ext_x_version)) ;\n                    else if (line.StartsWith(HLSTags.ext_x_allow_cache)) ;\n                    //解析KEY\n                    else if (line.StartsWith(HLSTags.ext_x_key))\n                    {\n                        //自定义KEY情况 判断是否需要读取IV\n                        if (!string.IsNullOrEmpty(KeyFile) || !string.IsNullOrEmpty(KeyBase64))\n                        {\n                            if (m3u8CurrentKey[2] == \"\" && line.Contains(\"IV=0x\"))\n                            {\n                                var temp = Global.GetTagAttribute(line.Replace(HLSTags.ext_x_key + \":\", \"\"), \"IV\");\n                                m3u8CurrentKey[2] = temp; //使用m3u8中的IV\n                            }\n                        }\n                        else\n                        {\n                            m3u8CurrentKey = ParseKey(line);\n                            //存储为上一行的key信息\n                            lastKeyLine = line;\n                        }\n                    }\n                    //解析分片时长(暂时不考虑标题属性)\n                    else if (line.StartsWith(HLSTags.extinf))\n                    {\n                        string[] tmp = line.Replace(HLSTags.extinf + \":\", \"\").Split(',');\n                        segDuration = Convert.ToDouble(tmp[0]);\n                        segInfo[\"index\"] = segIndex;\n                        segInfo[\"method\"] = m3u8CurrentKey[0];\n                        //是否有加密，有的话写入KEY和IV\n                        if (m3u8CurrentKey[0] != \"NONE\")\n                        {\n                            segInfo[\"key\"] = m3u8CurrentKey[1];\n                            //没有读取到IV，自己生成\n                            if (m3u8CurrentKey[2] == \"\")\n                                segInfo[\"iv\"] = \"0x\" + Convert.ToString(segIndex, 16).PadLeft(32, '0');\n                            else\n                                segInfo[\"iv\"] = m3u8CurrentKey[2];\n                        }\n                        totalDuration += segDuration;\n                        segInfo[\"duration\"] = segDuration;\n                        expectSegment = true;\n                        segIndex++;\n                    }\n                    //解析STREAM属性\n                    else if (line.StartsWith(HLSTags.ext_x_stream_inf))\n                    {\n                        expectPlaylist = true;\n                        string bandwidth = Global.GetTagAttribute(line, \"BANDWIDTH\");\n                        string average_bandwidth = Global.GetTagAttribute(line, \"AVERAGE-BANDWIDTH\");\n                        string codecs = Global.GetTagAttribute(line, \"CODECS\");\n                        string resolution = Global.GetTagAttribute(line, \"RESOLUTION\");\n                        string frame_rate = Global.GetTagAttribute(line, \"FRAME-RATE\");\n                        string hdcp_level = Global.GetTagAttribute(line, \"HDCP-LEVEL\");\n                        string audio = Global.GetTagAttribute(line, \"AUDIO\");\n                        string video = Global.GetTagAttribute(line, \"VIDEO\");\n                        string subtitles = Global.GetTagAttribute(line, \"SUBTITLES\");\n                        string closed_captions = Global.GetTagAttribute(line, \"CLOSED-CAPTIONS\");\n                        extList = new string[] { bandwidth, average_bandwidth, codecs, resolution,\n                            frame_rate,hdcp_level,audio,video,subtitles,closed_captions };\n                    }\n                    else if (line.StartsWith(HLSTags.ext_x_i_frame_stream_inf)) ;\n                    else if (line.StartsWith(HLSTags.ext_x_media))\n                    {\n                        var groupId = Global.GetTagAttribute(line, \"GROUP-ID\");\n                        if (Global.GetTagAttribute(line, \"TYPE\") == \"AUDIO\")\n                        {\n                            var audio = new Audio();\n                            audio.Channels = Global.GetTagAttribute(line, \"CHANNELS\");\n                            audio.Language = Global.GetTagAttribute(line, \"LANGUAGE\");\n                            audio.Name = Global.GetTagAttribute(line, \"NAME\");\n                            audio.Uri = CombineURL(BaseUrl, Global.GetTagAttribute(line, \"URI\"));\n                            if (!MEDIA_AUDIO_GROUP.ContainsKey(groupId))\n                            {\n                                MEDIA_AUDIO_GROUP.Add(groupId, new List<Audio>() { audio });\n                            }\n                            else\n                            {\n                                MEDIA_AUDIO_GROUP[groupId].Add(audio);\n                            }\n                        }\n                        else if (Global.GetTagAttribute(line, \"TYPE\") == \"SUBTITLES\")\n                        {\n                            var sub = new Subtitle();\n                            sub.Language = Global.GetTagAttribute(line, \"LANGUAGE\");\n                            sub.Name = Global.GetTagAttribute(line, \"NAME\");\n                            sub.Uri = CombineURL(BaseUrl, Global.GetTagAttribute(line, \"URI\"));\n                            if (!MEDIA_SUB_GROUP.ContainsKey(groupId))\n                            {\n                                MEDIA_SUB_GROUP.Add(groupId, new List<Subtitle>() { sub });\n                            }\n                            else\n                            {\n                                MEDIA_SUB_GROUP[groupId].Add(sub);\n                            }\n                        }\n                    }\n                    else if (line.StartsWith(HLSTags.ext_x_playlist_type)) ;\n                    else if (line.StartsWith(HLSTags.ext_i_frames_only))\n                    {\n                        isIFramesOnly = true;\n                    }\n                    else if (line.StartsWith(HLSTags.ext_is_independent_segments))\n                    {\n                        isIndependentSegments = true;\n                    }\n                    //m3u8主体结束\n                    else if (line.StartsWith(HLSTags.ext_x_endlist))\n                    {\n                        if (segments.Count > 0)\n                            parts.Add(segments);\n                        segments = new JArray();\n                        isEndlist = true;\n                    }\n                    //#EXT-X-MAP\n                    else if (line.StartsWith(HLSTags.ext_x_map))\n                    {\n                        if (extMAP[0] == \"\")\n                        {\n                            extMAP[0] = Global.GetTagAttribute(line, \"URI\");\n                            if (line.Contains(\"BYTERANGE\"))\n                                extMAP[1] = Global.GetTagAttribute(line, \"BYTERANGE\");\n                            if (!extMAP[0].StartsWith(\"http\")) extMAP[0] = CombineURL(BaseUrl, extMAP[0]);\n                        }\n                        //遇到了其他的map，说明已经不是一个视频了，全部丢弃即可\n                        else\n                        {\n                            if (segments.Count > 0)\n                                parts.Add(segments);\n                            segments = new JArray();\n                            isEndlist = true;\n                            break;\n                        }\n                    }\n                    else if (line.StartsWith(HLSTags.ext_x_start)) ;\n                    //评论行不解析\n                    else if (line.StartsWith(\"#\")) continue;\n                    //空白行不解析\n                    else if (line.StartsWith(\"\\r\\n\")) continue;\n                    //解析分片的地址\n                    else if (expectSegment)\n                    {\n                        segUrl = CombineURL(BaseUrl, line);\n                        if (M3u8Url.Contains(\"?__gda__\"))\n                        {\n                            segUrl += new Regex(\"\\\\?__gda__.*\").Match(M3u8Url).Value;\n                        }\n                        if (M3u8Url.Contains(\"//dlsc.hcs.cmvideo.cn\") && (segUrl.EndsWith(\".ts\") || segUrl.EndsWith(\".mp4\")))\n                        {\n                            segUrl += new Regex(\"\\\\?.*\").Match(M3u8Url).Value;\n                        }\n                        segInfo.Add(\"segUri\", segUrl);\n                        segments.Add(segInfo);\n                        segInfo = new JObject();\n                        //优酷的广告分段则清除此分片\n                        //需要注意，遇到广告说明程序对上文的#EXT-X-DISCONTINUITY做出的动作是不必要的，\n                        //其实上下文是同一种编码，需要恢复到原先的part上\n                        if (DelAd && segUrl.Contains(\"ccode=\") && segUrl.Contains(\"/ad/\") && segUrl.Contains(\"duration=\"))\n                        {\n                            segments.RemoveAt(segments.Count - 1);\n                            segIndex--;\n                            hasAd = true;\n                        }\n                        //优酷广告(4K分辨率测试)\n                        if (DelAd && segUrl.Contains(\"ccode=0902\") && segUrl.Contains(\"duration=\"))\n                        {\n                            segments.RemoveAt(segments.Count - 1);\n                            segIndex--;\n                            hasAd = true;\n                        }\n                        expectSegment = false;\n                    }\n                    //解析STREAM属性的URI\n                    else if (expectPlaylist)\n                    {\n                        string listUrl;\n                        listUrl = CombineURL(BaseUrl, line);\n                        if (M3u8Url.Contains(\"?__gda__\"))\n                        {\n                            listUrl += new Regex(\"\\\\?__gda__.*\").Match(M3u8Url).Value;\n                        }\n                        StringBuilder sb = new StringBuilder();\n                        sb.Append(\"{\");\n                        sb.Append(\"\\\"URL\\\":\\\"\" + listUrl + \"\\\",\");\n                        for (int i = 0; i < 10; i++)\n                        {\n                            if (extList[i] != \"\")\n                            {\n                                switch (i)\n                                {\n                                    case 0:\n                                        sb.Append(\"\\\"BANDWIDTH\\\":\\\"\" + extList[i] + \"\\\",\");\n                                        break;\n                                    case 1:\n                                        sb.Append(\"\\\"AVERAGE-BANDWIDTH\\\":\\\"\" + extList[i] + \"\\\",\");\n                                        break;\n                                    case 2:\n                                        sb.Append(\"\\\"CODECS\\\":\\\"\" + extList[i] + \"\\\",\");\n                                        break;\n                                    case 3:\n                                        sb.Append(\"\\\"RESOLUTION\\\":\\\"\" + extList[i] + \"\\\",\");\n                                        break;\n                                    case 4:\n                                        sb.Append(\"\\\"FRAME-RATE\\\":\\\"\" + extList[i] + \"\\\",\");\n                                        break;\n                                    case 5:\n                                        sb.Append(\"\\\"HDCP-LEVEL\\\":\\\"\" + extList[i] + \"\\\",\");\n                                        break;\n                                    case 6:\n                                        sb.Append(\"\\\"AUDIO\\\":\\\"\" + extList[i] + \"\\\",\");\n                                        break;\n                                    case 7:\n                                        sb.Append(\"\\\"VIDEO\\\":\\\"\" + extList[i] + \"\\\",\");\n                                        break;\n                                    case 8:\n                                        sb.Append(\"\\\"SUBTITLES\\\":\\\"\" + extList[i] + \"\\\",\");\n                                        break;\n                                    case 9:\n                                        sb.Append(\"\\\"CLOSED-CAPTIONS\\\":\\\"\" + extList[i] + \"\\\",\");\n                                        break;\n                                }\n                            }\n                        }\n                        sb.Append(\"}\");\n                        extLists.Add(sb.ToString().Replace(\",}\", \"}\"));\n                        if (Convert.ToInt64(extList[0]) >= bestBandwidth)\n                        {\n                            bestBandwidth = Convert.ToInt64(extList[0]);\n                            bestUrl = listUrl;\n                            bestUrlAudio = extList[6];\n                            bestUrlSub = extList[8];\n                        }\n                        extList = new string[8];\n                        expectPlaylist = false;\n                    }\n                }\n            }\n\n            if (isM3u == false)\n            {\n                LOGGER.WriteLineError(strings.invalidM3u8);\n                LOGGER.PrintLine(strings.invalidM3u8, LOGGER.Error);\n                return;\n            }\n\n            //直播的情况，无法遇到m3u8结束标记，需要手动将segments加入parts\n            if (parts.HasValues == false)\n                parts.Add(segments);\n\n            //处理外挂音轨的AudioOnly逻辑\n            if (audioUrl != \"\" && Global.VIDEO_TYPE == \"IGNORE\")\n            {\n                LOGGER.WriteLine(strings.startParsing + audioUrl);\n                LOGGER.WriteLine(strings.downloadingExternalAudioTrack);\n                LOGGER.PrintLine(strings.downloadingExternalAudioTrack, LOGGER.Warning);\n                try\n                {\n                    DirectoryInfo directoryInfo = new DirectoryInfo(DownDir);\n                    directoryInfo.Delete(true);\n                }\n                catch (Exception) { }\n                M3u8Url = audioUrl;\n                BaseUrl = \"\";\n                audioUrl = \"\";\n                bestUrlAudio = \"\";\n                Parse();\n                return;\n            }\n\n            //构造JSON文件\n            JObject jsonResult = new JObject();\n            jsonResult.Add(\"m3u8\", M3u8Url);\n            jsonResult.Add(\"m3u8BaseUri\", BaseUrl);\n            jsonResult.Add(\"updateTime\", DateTime.Now.ToString(\"o\"));\n            JObject jsonM3u8Info = new JObject();\n            jsonM3u8Info.Add(\"originalCount\", segIndex - startIndex);\n            jsonM3u8Info.Add(\"count\", segIndex - startIndex);\n            jsonM3u8Info.Add(\"vod\", isEndlist);\n            jsonM3u8Info.Add(\"targetDuration\", targetDuration);\n            jsonM3u8Info.Add(\"totalDuration\", totalDuration);\n            if (bestUrlAudio != \"\" && MEDIA_AUDIO_GROUP.ContainsKey(bestUrlAudio))\n            {\n                if (MEDIA_AUDIO_GROUP[bestUrlAudio].Count == 1)\n                {\n                    audioUrl = MEDIA_AUDIO_GROUP[bestUrlAudio][0].Uri;\n                }\n                //多种音频语言 让用户选择\n                else\n                {\n                    var startCursorIndex = Console.CursorTop;\n                    var cursorIndex = startCursorIndex;\n                    LOGGER.PrintLine(\"Found Multiple Language Audio Tracks.\", LOGGER.Warning);\n                    for (int i = 0; i < MEDIA_AUDIO_GROUP[bestUrlAudio].Count; i++)\n                    {\n                        Console.WriteLine(\"\".PadRight(13) + $\"[{i.ToString().PadLeft(2)}]. {bestUrlAudio} => {MEDIA_AUDIO_GROUP[bestUrlAudio][i]}\");\n                        cursorIndex++;\n                    }\n                    LOGGER.PrintLine(\"Please Select What You Want.(Up To 1 Track)\");\n                    Console.Write(\"\".PadRight(13) + \"Enter Number: \");\n                    var input = Console.ReadLine();\n                    cursorIndex += 2;\n                    try\n                    {\n                        for (int i = startCursorIndex; i < cursorIndex; i++)\n                        {\n                            Console.SetCursorPosition(0, i);\n                            Console.Write(\"\".PadRight(300));\n                        }\n                        Console.SetCursorPosition(0, startCursorIndex);\n                    }\n                    catch (Exception)\n                    {\n                        ;\n                    }\n                    audioUrl = MEDIA_AUDIO_GROUP[bestUrlAudio][int.Parse(input)].Uri;\n                }\n            }\n            if (bestUrlSub != \"\" && MEDIA_SUB_GROUP.ContainsKey(bestUrlSub))\n            {\n                if (MEDIA_SUB_GROUP[bestUrlSub].Count == 1)\n                {\n                    subUrl = MEDIA_SUB_GROUP[bestUrlSub][0].Uri;\n                }\n                //多种字幕语言 让用户选择\n                else\n                {\n                    var startCursorIndex = Console.CursorTop;\n                    var cursorIndex = startCursorIndex;\n                    LOGGER.PrintLine(\"Found Multiple Language Subtitle Tracks.\", LOGGER.Warning);\n                    for (int i = 0; i < MEDIA_SUB_GROUP[bestUrlSub].Count; i++)\n                    {\n                        Console.WriteLine(\"\".PadRight(13) + $\"[{i.ToString().PadLeft(2)}]. {bestUrlSub} => {MEDIA_SUB_GROUP[bestUrlSub][i]}\");\n                        cursorIndex++;\n                    }\n                    LOGGER.PrintLine(\"Please Select What You Want.(Up To 1 Track)\");\n                    Console.Write(\"\".PadRight(13) + \"Enter Number: \");\n                    var input = Console.ReadLine();\n                    cursorIndex += 2;\n                    try\n                    {\n                        for (int i = startCursorIndex; i < cursorIndex; i++)\n                        {\n                            Console.SetCursorPosition(0, i);\n                            Console.Write(\"\".PadRight(300));\n                        }\n                        Console.SetCursorPosition(0, startCursorIndex);\n                    }\n                    catch (Exception)\n                    {\n                        ;\n                    }\n                    subUrl = MEDIA_SUB_GROUP[bestUrlSub][int.Parse(input)].Uri;\n                }\n            }\n            if (audioUrl != \"\")\n                jsonM3u8Info.Add(\"audio\", audioUrl);\n            if (subUrl != \"\")\n                jsonM3u8Info.Add(\"sub\", subUrl);\n            if (extMAP[0] != \"\")\n            {\n                DownloadManager.HasExtMap = true;\n                if (extMAP[1] == \"\")\n                    jsonM3u8Info.Add(\"extMAP\", extMAP[0]);\n                else\n                    jsonM3u8Info.Add(\"extMAP\", extMAP[0] + \"|\" + extMAP[1]);\n            }\n            else\n            {\n                DownloadManager.HasExtMap = false;\n            }\n\n            //根据DurRange来生成分片Range\n            if (DurStart != \"\" || DurEnd != \"\")\n            {\n                double secStart = 0;\n                double secEnd = -1;\n\n                if (DurEnd == \"\")\n                {\n                    secEnd = totalDuration;\n                }\n\n                //时间码\n                Regex reg2 = new Regex(@\"(\\d+):(\\d+):(\\d+)\");\n                if (reg2.IsMatch(DurStart))\n                {\n                    int HH = Convert.ToInt32(reg2.Match(DurStart).Groups[1].Value);\n                    int MM = Convert.ToInt32(reg2.Match(DurStart).Groups[2].Value);\n                    int SS = Convert.ToInt32(reg2.Match(DurStart).Groups[3].Value);\n                    secStart = SS + MM * 60 + HH * 60 * 60;\n                }\n                if (reg2.IsMatch(DurEnd))\n                {\n                    int HH = Convert.ToInt32(reg2.Match(DurEnd).Groups[1].Value);\n                    int MM = Convert.ToInt32(reg2.Match(DurEnd).Groups[2].Value);\n                    int SS = Convert.ToInt32(reg2.Match(DurEnd).Groups[3].Value);\n                    secEnd = SS + MM * 60 + HH * 60 * 60;\n                }\n\n                bool flag1 = false;\n                bool flag2 = false;\n                if (secEnd - secStart > 0)\n                {\n                    double dur = 0; //当前时间\n                    foreach (JArray part in parts)\n                    {\n                        foreach (var seg in part)\n                        {\n                            dur += Convert.ToDouble(seg[\"duration\"].ToString());\n                            if (flag1 == false && dur > secStart)\n                            {\n                                RangeStart = seg[\"index\"].Value<int>();\n                                flag1 = true;\n                            }\n\n                            if (flag2 == false && dur >= secEnd)\n                            {\n                                RangeEnd = seg[\"index\"].Value<int>();\n                                flag2 = true;\n                            }\n                        }\n                    }\n                }\n            }\n\n\n            //根据Range来清除部分分片\n            if (RangeStart != 0 || RangeEnd != -1)\n            {\n                if (RangeEnd == -1)\n                    RangeEnd = (int)(segIndex - startIndex - 1);\n                int newCount = 0;\n                double newTotalDuration = 0;\n                JArray newParts = new JArray();\n                foreach (JArray part in parts)\n                {\n                    JArray newPart = new JArray();\n                    foreach (var seg in part)\n                    {\n                        if (RangeStart <= seg[\"index\"].Value<int>() && seg[\"index\"].Value<int>() <= RangeEnd)\n                        {\n                            newPart.Add(seg);\n                            newCount++;\n                            newTotalDuration += Convert.ToDouble(seg[\"duration\"].ToString());\n                        }\n                    }\n                    if (newPart.Count != 0)\n                        newParts.Add(newPart);\n                }\n                parts = newParts;\n                jsonM3u8Info[\"count\"] = newCount;\n                jsonM3u8Info[\"totalDuration\"] = newTotalDuration;\n            }\n\n\n            //添加\n            jsonM3u8Info.Add(\"segments\", parts);\n            jsonResult.Add(\"m3u8Info\", jsonM3u8Info);\n\n\n            //输出JSON文件\n            if (!LiveStream)\n            {\n                LOGGER.WriteLine(strings.wrtingMeta);\n                LOGGER.PrintLine(strings.wrtingMeta);\n            }\n            File.WriteAllText(jsonSavePath, jsonResult.ToString());\n            //检测是否为master list\n            MasterListCheck();\n        }\n\n        bool downloadingM3u8KeyTip = false;\n        public string[] ParseKey(string line)\n        {\n            if (!downloadingM3u8KeyTip)\n            {\n                LOGGER.PrintLine(strings.downloadingM3u8Key, LOGGER.Warning);\n                downloadingM3u8KeyTip = true;\n            }\n            string[] tmp = line.Replace(HLSTags.ext_x_key + \":\", \"\").Split(',');\n            string[] key = new string[] { \"NONE\", \"\", \"\" };\n            string u_l = Global.GetTagAttribute(lastKeyLine.Replace(HLSTags.ext_x_key + \":\", \"\"), \"URI\");\n            string m = Global.GetTagAttribute(line.Replace(HLSTags.ext_x_key + \":\", \"\"), \"METHOD\");\n            string u = Global.GetTagAttribute(line.Replace(HLSTags.ext_x_key + \":\", \"\"), \"URI\");\n            string i = Global.GetTagAttribute(line.Replace(HLSTags.ext_x_key + \":\", \"\"), \"IV\");\n\n            //存在加密\n            if (m != \"\")\n            {\n                if (m != \"AES-128\")\n                {\n                    LOGGER.PrintLine(string.Format(strings.notSupportMethod, m), LOGGER.Error);\n                    DownloadManager.BinaryMerge = true;\n                    return new string[] { $\"{m}(NOTSUPPORTED)\", \"\", \"\" };\n                }\n                //METHOD\n                key[0] = m;\n                //URI\n                key[1] = u;\n                if (u_l == u)\n                {\n                    key[1] = m3u8CurrentKey[1];\n                }\n                else\n                {\n                    LOGGER.WriteLine(strings.downloadingM3u8Key + \" \" + key[1]);\n                    if (key[1].StartsWith(\"http\"))\n                    {\n                        string keyUrl = key[1];\n                        if (key[1].Contains(\"imooc.com/\"))\n                        {\n                            key[1] = DecodeImooc.DecodeKey(Global.GetWebSource(key[1], Headers));\n                        }\n                        else if (key[1] == \"https://hls.ventunotech.com/m3u8/pc_videosecurevtnkey.key\")\n                        {\n                            string temp = Global.GetWebSource(keyUrl, Headers);\n                            LOGGER.PrintLine(temp);\n                            byte[] tempKey = new byte[16];\n                            for (int d = 0; d < 16; d++)\n                            {\n                                tempKey[d] = Convert.ToByte(temp.Substring(2 * d, 2), 16);\n                            }\n                            key[1] = Convert.ToBase64String(tempKey);\n                        }\n                        else if (key[1].Contains(\"elearning.cdeledu.com/hls/service/getKeyForHls\"))\n                        {\n                            var keyBytes = Global.HttpDownloadFileToBytes(keyUrl, Headers);\n                            if (keyBytes.Length != 16)\n                            {\n                                key[1] = DecodeCdeledu.DecodeKey(Encoding.UTF8.GetString(keyBytes));\n                            }\n                            else\n                            {\n                                key[1] = Convert.ToBase64String(keyBytes);\n                            }\n                        }\n                        else if (key[1].Contains(\"drm.vod2.myqcloud.com/getlicense\"))\n                        {\n                            var temp = Global.HttpDownloadFileToBytes(keyUrl, Headers);\n                            key[1] = DecodeHuke88Key.DecodeKey(key[1], temp);\n                        }\n                        else\n                        {\n                            if (keyUrl.Contains(\"https://keydeliver.linetv.tw/jurassicPark\"))  //linetv\n                                keyUrl = keyUrl + \"?time=\" + Global.GetTimeStamp(false);\n                            key[1] = Convert.ToBase64String(Global.HttpDownloadFileToBytes(keyUrl, Headers));\n                        }\n                    }\n                    //DMM网站\n                    else if (key[1].StartsWith(\"base64:\"))\n                    {\n                        key[1] = key[1].Replace(\"base64:\", \"\");\n                    }\n                    else\n                    {\n                        string keyUrl = CombineURL(BaseUrl, key[1]);\n                        if (keyUrl.Contains(\"edu.51cto.com\")) //51cto\n                        {\n                            string lessonId = Global.GetQueryString(\"lesson_id\", keyUrl);\n                            keyUrl = keyUrl + \"&sign=\" + Decode51CtoKey.GetSign(lessonId);\n                            var encodeKey = Encoding.UTF8.GetString(Global.HttpDownloadFileToBytes(keyUrl, Headers));\n                            key[1] = Decode51CtoKey.GetDecodeKey(encodeKey, lessonId);\n                        }\n                        else\n                        {\n                            key[1] = Convert.ToBase64String(Global.HttpDownloadFileToBytes(keyUrl, Headers));\n                        }\n                    }\n                }\n                //IV\n                key[2] = i;\n            }\n\n            return key;\n        }\n\n        public void MasterListCheck()\n        {\n            //若存在多个清晰度条目，输出另一个json文件存放\n            if (extLists.Count != 0)\n            {\n                File.Copy(m3u8SavePath, Path.GetDirectoryName(m3u8SavePath) + \"\\\\master.m3u8\", true);\n                LOGGER.WriteLine(\"Master List Found\");\n                LOGGER.PrintLine(strings.masterListFound, LOGGER.Warning);\n                var json = new JObject();\n                json.Add(\"masterUri\", M3u8Url);\n                json.Add(\"updateTime\", DateTime.Now.ToString(\"o\"));\n                json.Add(\"playLists\", JArray.Parse(\"[\" + string.Join(\",\", extLists.ToArray()) + \"]\"));\n                if (MEDIA_AUDIO_GROUP.Keys.Count > 0)\n                {\n                    var audioGroup = JObject.FromObject(MEDIA_AUDIO_GROUP);\n                    json.Add(\"audioTracks\", audioGroup);\n                }\n                if (MEDIA_SUB_GROUP.Keys.Count > 0)\n                {\n                    var subGroup = JObject.FromObject(MEDIA_SUB_GROUP);\n                    json.Add(\"subtitleTracks\", subGroup);\n                }\n                //输出json文件\n                LOGGER.WriteLine(strings.wrtingMasterMeta);\n                LOGGER.PrintLine(strings.wrtingMasterMeta);\n                File.WriteAllText(Path.GetDirectoryName(jsonSavePath) + \"\\\\playLists.json\", json.ToString());\n                LOGGER.WriteLine(strings.selectPlaylist + \": \" + bestUrl);\n                LOGGER.PrintLine(strings.selectPlaylist);\n                LOGGER.WriteLine(strings.startReParsing);\n                LOGGER.PrintLine(strings.startReParsing, LOGGER.Warning);\n                //重置Baseurl并重新解析\n                M3u8Url = bestUrl;\n                BaseUrl = \"\";\n                Parse();\n            }\n        }\n\n        //解决低版本.Net框架的一个BUG（XP上百分之百复现）\n        //https://stackoverflow.com/questions/781205/getting-a-url-with-an-url-encoded-slash#\n        private void ForceCanonicalPathAndQuery(Uri uri)\n        {\n            string paq = uri.PathAndQuery; // need to access PathAndQuery\n            FieldInfo flagsFieldInfo = typeof(Uri).GetField(\"m_Flags\", BindingFlags.Instance | BindingFlags.NonPublic);\n            ulong flags = (ulong)flagsFieldInfo.GetValue(uri);\n            flags &= ~((ulong)0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical\n            flagsFieldInfo.SetValue(uri, flags);\n        }\n\n        /// <summary>\n        /// 拼接Baseurl和RelativeUrl\n        /// </summary>\n        /// <param name=\"baseurl\">Baseurl</param>\n        /// <param name=\"url\">RelativeUrl</param>\n        /// <returns></returns>\n        public string CombineURL(string baseurl, string url)\n        {\n            /*\n            //本地文件形式\n            if (File.Exists(Path.Combine(baseurl, url)))\n            {\n                return Path.Combine(baseurl, url);\n            }*/\n\n\n            Uri uri1 = new Uri(baseurl);  //这里直接传完整的URL即可\n            Uri uri2 = new Uri(uri1, url);  \n            ForceCanonicalPathAndQuery(uri2);  //兼容XP的低版本.Net\n            url = uri2.ToString();\n\n\n            /*\n            if (!url.StartsWith(\"http\")) \n            {\n                if (url.StartsWith(\"/\"))\n                {\n                    if (!url.Contains(\":\"))  // => /livelvy:livelvy/lvy1/WysAABmKyDctEW8V-13959.ts?n=vdn-gdzh-tel-1-6\n                        url = baseurl.Substring(0, baseurl.Length - 1) + url;\n                    else\n                        url = baseurl.Substring(0, baseurl.Length - 1) + url.Substring(url.IndexOf(':'));\n                }\n                else\n                    url = baseurl + url;\n            }*/\n\n            return url;\n        }\n        \n        /// <summary>\n        /// 从url中截取字符串充当baseurl\n        /// </summary>\n        /// <param name=\"m3u8url\"></param>\n        /// <returns></returns>\n        public static string GetBaseUrl(string m3u8url, string headers)\n        {\n            string url = Global.Get302(m3u8url, headers);\n            if (url.Contains(\"?\"))\n                url = url.Remove(url.LastIndexOf('?'));\n            url = url.Substring(0, url.LastIndexOf('/') + 1);\n            return url;\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/Program.cs",
    "content": "﻿using CommandLine;\nusing CommandLine.Text;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Security;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Security.Cryptography.X509Certificates;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing Microsoft.Win32;\n\nnamespace N_m3u8DL_CLI.NetCore\n{\n    class Program\n    {\n        public delegate bool ControlCtrlDelegate(int CtrlType);\n        [DllImport(\"kernel32.dll\")]\n        private static extern bool SetConsoleCtrlHandler(ControlCtrlDelegate HandlerRoutine, bool Add);\n        private static ControlCtrlDelegate cancelHandler = new ControlCtrlDelegate(HandlerRoutine);\n        public static bool HandlerRoutine(int CtrlType)\n        {\n            switch (CtrlType)\n            {\n                case 0:\n                    LOGGER.WriteLine(strings.ExitedCtrlC\n                    + \"\\r\\n\\r\\nTask End: \" + DateTime.Now.ToString(\"yyyy/MM/dd HH:mm:ss\")); //Ctrl+C关闭\n                    break;\n                case 2:\n                    LOGGER.WriteLine(strings.ExitedForce\n                    + \"\\r\\n\\r\\nTask End: \" + DateTime.Now.ToString(\"yyyy/MM/dd HH:mm:ss\")); //按控制台关闭按钮关闭\n                    break;\n            }\n            return false;\n        }\n\n        private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)\n        {\n            return true;\n        }\n\n\n        static void Main(string[] args)\n        {\n            /******************************************************/\n            SetConsoleCtrlHandler(cancelHandler, true);\n            ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;\n            ServicePointManager.DefaultConnectionLimit = 1024;\n            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3\n                                   | SecurityProtocolType.Tls\n                                   | (SecurityProtocolType)0x300 //Tls11  \n                                   | (SecurityProtocolType)0xC00; //Tls12  \n            /******************************************************/\n\n            try\n            {\n                string loc = \"en-US\";\n                string currLoc = Thread.CurrentThread.CurrentUICulture.Name;\n                if (currLoc == \"zh-TW\" || currLoc == \"zh-HK\" || currLoc == \"zh-MO\") loc = \"zh-TW\";\n                else if (currLoc == \"zh-CN\" || currLoc == \"zh-SG\") loc = \"zh-CN\";\n                //设置语言\n                CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(loc);\n                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(loc);\n            }\n            catch (Exception) {; }\n\n            // 处理m3u8dl URL协议\n            if (args.Length == 1)\n            {\n                if (args[0].ToLower().StartsWith(\"m3u8dl:\"))\n                {\n                    var base64 = args[0].Replace(\"m3u8dl://\", \"\").Replace(\"m3u8dl:\", \"\");\n                    var cmd = \"\";\n                    try { cmd = Encoding.UTF8.GetString(Convert.FromBase64String(base64)); }\n                    catch (FormatException) { cmd = Encoding.UTF8.GetString(Convert.FromBase64String(base64.TrimEnd('/'))); }\n                    //修正参数转义符\n                    cmd = cmd.Replace(\"\\\\\\\"\", \"\\\"\");\n                    //修正工作目录\n                    Environment.CurrentDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);\n                    args = Global.ParseArguments(cmd).ToArray();  //解析命令行\n                }\n                else if (args[0] == \"--registerUrlProtocol\")\n                {\n                    RequireElevated(string.Join(\" \", args));\n                    bool result = RegisterUriScheme(\"m3u8dl\", Assembly.GetExecutingAssembly().Location);\n                    Console.WriteLine(result ? strings.registerUrlProtocolSuccessful : strings.registerUrlProtocolFailed);\n                    Environment.Exit(0);\n                }\n                else if (args[0] == \"--unregisterUrlProtocol\")\n                {\n                    RequireElevated(string.Join(\" \", args));\n                    bool result = UnregisterUriScheme(\"m3u8dl\");\n                    Console.WriteLine(result ? strings.unregisterUrlProtocolSuccessful : strings.unregisterUrlProtocolFailed);\n                    Environment.Exit(0);\n                }\n            }\n\n            //寻找ffmpeg.exe\n            if (File.Exists(\"ffmpeg.exe\"))\n            {\n                FFmpeg.FFMPEG_PATH = Path.Combine(Environment.CurrentDirectory, \"ffmpeg.exe\");\n            }\n            else if (File.Exists(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), \"ffmpeg.exe\")))\n            {\n                FFmpeg.FFMPEG_PATH = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), \"ffmpeg.exe\");\n            }\n            else\n            {\n                try\n                {\n                    string[] EnvironmentPath = Environment.GetEnvironmentVariable(\"Path\").Split(';');\n                    foreach (var de in EnvironmentPath)\n                    {\n                        if (File.Exists(Path.Combine(de.Trim('\\\"').Trim(), \"ffmpeg.exe\")))\n                        {\n                            FFmpeg.FFMPEG_PATH = Path.Combine(de.Trim('\\\"').Trim(), \"ffmpeg.exe\");\n                            goto HasFFmpeg;\n                        }\n                    }\n                }\n                catch (Exception)\n                {\n                    ;\n                }\n\n                Console.BackgroundColor = ConsoleColor.Red; //设置背景色\n                Console.ForegroundColor = ConsoleColor.White; //设置前景色，即字体颜色\n                Console.WriteLine(strings.ffmpegLost);\n                Console.ResetColor(); //将控制台的前景色和背景色设为默认值\n                Console.WriteLine(strings.ffmpegTip);\n                Console.WriteLine();\n                Console.WriteLine(\"http://ffmpeg.org/download.html#build-windows\");\n                Console.WriteLine();\n                Console.WriteLine(strings.pressAnyKeyExit);\n                Console.ReadKey();\n                Environment.Exit(-1);\n            }\n\n        HasFFmpeg:\n            if (!File.Exists(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), \"NO_UPDATE\")))\n            {\n                Thread checkUpdate = new Thread(() =>\n                {\n                    Global.CheckUpdate();\n                });\n                checkUpdate.IsBackground = true;\n                checkUpdate.Start();\n            }\n\n            //ReadLine字数上限\n            Stream steam = Console.OpenStandardInput();\n            Console.SetIn(new StreamReader(steam, Encoding.Default, false, 5000));\n\n            if (args.Length == 0)\n            {\n                Global.WriteInit();\n                Console.ForegroundColor = ConsoleColor.Cyan;\n                Console.Write(\"N_m3u8DL-CLI\");\n                Console.ResetColor();\n                Console.Write(\" > \");\n\n                var cmd = Console.ReadLine();\n                if (string.IsNullOrEmpty(cmd)) Environment.Exit(0);\n                args = Global.ParseArguments(cmd).ToArray();  //解析命令行\n                Console.Clear();\n            }\n            //如果只有URL，没有附加参数，则尝试解析配置文件\n            else if (args.Length == 1 || (args.Length == 3 && args[1].ToLower() == \"--savename\"))\n            {\n                if (File.Exists(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), \"N_m3u8DL-CLI.args.txt\")))\n                {\n                    if (args.Length == 3)\n                    {\n                        args = Global.ParseArguments($\"\\\"{args[0]}\\\" {args[1]} {args[2]} \" + File.ReadAllText(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), \"N_m3u8DL-CLI.args.txt\"))).ToArray();  //解析命令行\n                    }\n                    else\n                    {\n                        args = Global.ParseArguments($\"\\\"{args[0]}\\\" \" + File.ReadAllText(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), \"N_m3u8DL-CLI.args.txt\"))).ToArray();  //解析命令行\n                    }\n                }\n            }\n\n            var cmdParser = new CommandLine.Parser(with => with.HelpWriter = null);\n            var parserResult = cmdParser.ParseArguments<MyOptions>(args);\n\n            //解析命令行\n            parserResult\n              .WithParsed(o => DoWork(o))\n              .WithNotParsed(errs => DisplayHelp(parserResult, errs));\n        }\n\n        private static void DoWork(MyOptions o)\n        {\n            try\n            {\n                Global.WriteInit();\n                //当前程序路径（末尾有\\）\n                string CURRENT_PATH = Directory.GetCurrentDirectory();\n                string fileName = Global.GetValidFileName(o.SaveName);\n                string reqHeaders = o.Headers;\n                string muxSetJson = o.MuxSetJson ?? \"MUXSETS.json\";\n                string workDir = CURRENT_PATH + \"\\\\Downloads\";\n                string keyFile = \"\";\n                string keyBase64 = \"\";\n                string keyIV = \"\";\n                string baseUrl = \"\";\n                Global.STOP_SPEED = o.StopSpeed;\n                Global.MAX_SPEED = o.MaxSpeed;\n                if (!string.IsNullOrEmpty(o.UseKeyBase64)) keyBase64 = o.UseKeyBase64;\n                if (!string.IsNullOrEmpty(o.UseKeyIV)) keyIV = o.UseKeyIV;\n                if (!string.IsNullOrEmpty(o.BaseUrl)) baseUrl = o.BaseUrl;\n                if (o.EnableBinaryMerge) DownloadManager.BinaryMerge = true;\n                if (o.DisableDateInfo) FFmpeg.WriteDate = false;\n                if (o.NoProxy) Global.NoProxy = true;\n                if (o.DisableIntegrityCheck) DownloadManager.DisableIntegrityCheck = true;\n                if (o.EnableAudioOnly) Global.VIDEO_TYPE = \"IGNORE\";\n                if (!string.IsNullOrEmpty(o.WorkDir))\n                {\n                    workDir = Environment.ExpandEnvironmentVariables(o.WorkDir);\n                    DownloadManager.HasSetDir = true;\n                }\n                //CHACHA20\n                if (o.EnableChaCha20 && !string.IsNullOrEmpty(o.ChaCha20KeyBase64) && !string.IsNullOrEmpty(o.ChaCha20NonceBase64))\n                {\n                    Downloader.EnableChaCha20 = true;\n                    Downloader.ChaCha20KeyBase64 = o.ChaCha20KeyBase64;\n                    Downloader.ChaCha20NonceBase64 = o.ChaCha20NonceBase64;\n                }\n\n                //Proxy\n                if (!string.IsNullOrEmpty(o.ProxyAddress))\n                {\n                    var proxy = o.ProxyAddress;\n                    if (proxy.StartsWith(\"http://\"))\n                        Global.UseProxyAddress = proxy;\n                    if (proxy.StartsWith(\"socks5://\"))\n                        Global.UseProxyAddress = proxy;\n                }\n                //Key\n                if (!string.IsNullOrEmpty(o.UseKeyFile))\n                {\n                    if (File.Exists(o.UseKeyFile))\n                        keyFile = o.UseKeyFile;\n                }\n\n                if (File.Exists(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), \"headers.txt\")))\n                    reqHeaders = File.ReadAllText(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), \"headers.txt\"));\n\n                if (!string.IsNullOrEmpty(o.LiveRecDur))\n                {\n                    //时间码\n                    Regex reg2 = new Regex(@\"(\\d+):(\\d+):(\\d+)\");\n                    var t = o.LiveRecDur;\n                    if (reg2.IsMatch(t))\n                    {\n                        int HH = Convert.ToInt32(reg2.Match(t).Groups[1].Value);\n                        int MM = Convert.ToInt32(reg2.Match(t).Groups[2].Value);\n                        int SS = Convert.ToInt32(reg2.Match(t).Groups[3].Value);\n                        HLSLiveDownloader.REC_DUR_LIMIT = SS + MM * 60 + HH * 60 * 60;\n                    }\n                }\n                if (!string.IsNullOrEmpty(o.DownloadRange))\n                {\n                    string p = o.DownloadRange;\n\n                    if (p.Contains(\":\"))\n                    {\n                        //时间码\n                        Regex reg2 = new Regex(@\"((\\d+):(\\d+):(\\d+))?-((\\d+):(\\d+):(\\d+))?\");\n                        if (reg2.IsMatch(p))\n                        {\n                            Parser.DurStart = reg2.Match(p).Groups[1].Value;\n                            Parser.DurEnd = reg2.Match(p).Groups[5].Value;\n                            if (Parser.DurEnd == \"00:00:00\") Parser.DurEnd = \"\";\n                            Parser.DelAd = false;\n                        }\n                    }\n                    else\n                    {\n                        //数字\n                        Regex reg = new Regex(@\"(\\d*)-(\\d*)\");\n                        if (reg.IsMatch(p))\n                        {\n                            if (!string.IsNullOrEmpty(reg.Match(p).Groups[1].Value))\n                            {\n                                Parser.RangeStart = Convert.ToInt32(reg.Match(p).Groups[1].Value);\n                                Parser.DelAd = false;\n                            }\n                            if (!string.IsNullOrEmpty(reg.Match(p).Groups[2].Value))\n                            {\n                                Parser.RangeEnd = Convert.ToInt32(reg.Match(p).Groups[2].Value);\n                                Parser.DelAd = false;\n                            }\n                        }\n                    }\n                }\n\n                int inputRetryCount = 20;\n            input:\n                string testurl = o.Input;\n\n                //重试太多次，退出\n                if (inputRetryCount == 0)\n                    Environment.Exit(-1);\n\n                if (fileName == \"\")\n                    fileName = Global.GetUrlFileName(testurl) + \"_\" + DateTime.Now.ToString(\"yyyyMMddHHmmss\");\n\n\n                if (testurl.Contains(\"twitcasting\") && testurl.Contains(\"/fmp4/\"))\n                {\n                    DownloadManager.BinaryMerge = true;\n                }\n\n                string m3u8Content = string.Empty;\n                bool isVOD = true;\n\n                //避免文件路径过长\n                if (workDir.Length >= 200)\n                {\n                    //目录不能随便改 直接抛出异常\n                    throw new Exception(\"保存目录过长!\");\n                }\n                else if (workDir.Length + fileName.Length >= 200)\n                {\n                    //尝试缩短文件名\n                    while (workDir.Length + fileName.Length >= 200)\n                    {\n                        fileName = fileName.Substring(0, fileName.Length - 1);\n                    }\n                }\n\n                //开始解析\n\n                LOGGER.PrintLine($\"{strings.fileName}{fileName}\");\n                LOGGER.PrintLine($\"{strings.savePath}{Path.GetDirectoryName(Path.Combine(workDir, fileName))}\");\n\n                Parser parser = new Parser();\n                parser.DownName = fileName;\n                parser.DownDir = Path.Combine(workDir, parser.DownName);\n                parser.M3u8Url = testurl;\n                parser.KeyBase64 = keyBase64;\n                parser.KeyIV = keyIV;\n                parser.KeyFile = keyFile;\n                if (baseUrl != \"\")\n                    parser.BaseUrl = baseUrl;\n                parser.Headers = reqHeaders;\n                string exePath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);\n                LOGGER.LOGFILE = Path.Combine(exePath, \"Logs\", DateTime.Now.ToString(\"yyyy-MM-dd_HH-mm-ss-fff\") + \".log\");\n                LOGGER.InitLog();\n                LOGGER.WriteLine(strings.startParsing + testurl);\n                LOGGER.PrintLine(strings.startParsing + \" \" + testurl, LOGGER.Warning);\n                if (testurl.EndsWith(\".json\") && File.Exists(testurl))  //可直接跳过解析\n                {\n                    if (!Directory.Exists(Path.Combine(workDir, fileName)))//若文件夹不存在则新建文件夹   \n                        Directory.CreateDirectory(Path.Combine(workDir, fileName)); //新建文件夹  \n                    File.Copy(testurl, Path.Combine(Path.Combine(workDir, fileName), \"meta.json\"), true);\n                }\n                else\n                {\n                    parser.Parse();  //开始解析\n                }\n\n                //仅解析模式\n                if (o.EnableParseOnly)\n                {\n                    LOGGER.PrintLine(strings.parseExit);\n                    Environment.Exit(0);\n                }\n\n                if (File.Exists(Path.Combine(Path.Combine(workDir, fileName), \"meta.json\")))\n                {\n                    JObject initJson = JObject.Parse(File.ReadAllText(Path.Combine(Path.Combine(workDir, fileName), \"meta.json\")));\n                    isVOD = Convert.ToBoolean(initJson[\"m3u8Info\"][\"vod\"].ToString());\n                    //传给Watcher总时长\n                    Watcher.TotalDuration = initJson[\"m3u8Info\"][\"totalDuration\"].Value<double>();\n                    LOGGER.PrintLine($\"{strings.fileDuration}{Global.FormatTime((int)Watcher.TotalDuration)}\");\n                    LOGGER.PrintLine(strings.segCount + initJson[\"m3u8Info\"][\"originalCount\"].Value<int>()\n                        + $\", {strings.selectedCount}\" + initJson[\"m3u8Info\"][\"count\"].Value<int>());\n                }\n                else\n                {\n                    DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(workDir, fileName));\n                    directoryInfo.Delete(true);\n                    LOGGER.PrintLine(strings.InvalidUri, LOGGER.Error);\n                    inputRetryCount--;\n                    goto input;\n                }\n\n                //点播\n                if (isVOD == true)\n                {\n                    ServicePointManager.DefaultConnectionLimit = 10000;\n                    DownloadManager md = new DownloadManager();\n                    md.DownDir = parser.DownDir;\n                    md.Headers = reqHeaders;\n                    md.Threads = Environment.ProcessorCount;\n                    if (md.Threads > o.MaxThreads)\n                        md.Threads = (int)o.MaxThreads;\n                    if (md.Threads < o.MinThreads)\n                        md.Threads = (int)o.MinThreads;\n                    if (File.Exists(\"minT.txt\"))\n                    {\n                        int t = Convert.ToInt32(File.ReadAllText(\"minT.txt\"));\n                        if (md.Threads <= t)\n                            md.Threads = t;\n                    }\n                    md.TimeOut = (int)(o.TimeOut * 1000);\n                    md.NoMerge = o.NoMerge;\n                    md.DownName = fileName;\n                    md.DelAfterDone = o.EnableDelAfterDone;\n                    md.MuxFormat = \"mp4\";\n                    md.RetryCount = (int)o.RetryCount;\n                    md.MuxSetJson = muxSetJson;\n                    md.MuxFastStart = o.EnableMuxFastStart;\n                    md.DoDownload();\n                }\n                //直播\n                if (isVOD == false)\n                {\n                    LOGGER.WriteLine(strings.liveStreamFoundAndRecoding);\n                    LOGGER.PrintLine(strings.liveStreamFoundAndRecoding);\n                    //LOGGER.STOPLOG = true;  //停止记录日志\n                    //开辟文件流，且不关闭。（便于播放器不断读取文件）\n                    string LivePath = Path.Combine(Directory.GetParent(parser.DownDir).FullName\n                        , DateTime.Now.ToString(\"yyyy-MM-dd_HH-mm-ss\") + \"_\" + fileName + \".ts\");\n                    FileStream outputStream = new FileStream(LivePath, FileMode.Append);\n\n                    HLSLiveDownloader live = new HLSLiveDownloader();\n                    live.DownDir = parser.DownDir;\n                    live.Headers = reqHeaders;\n                    live.LiveStream = outputStream;\n                    live.LiveFile = LivePath;\n                    live.TimerStart();  //开始录制\n                    Console.ReadKey();\n                }\n\n                LOGGER.WriteLineError(strings.downloadFailed);\n                LOGGER.PrintLine(strings.downloadFailed, LOGGER.Error);\n                Thread.Sleep(3000);\n                Environment.Exit(-1);\n                //Console.Write(\"按任意键继续...\"); Console.ReadKey(); return;\n            }\n            catch (Exception ex)\n            {\n                LOGGER.PrintLine(ex.Message, LOGGER.Error);\n            }\n        }\n\n        public static bool RegisterUriScheme(string scheme, string applicationPath)\n        {\n            try\n            {\n                using (var schemeKey = Registry.ClassesRoot.CreateSubKey(scheme, writable: true))\n                {\n                    schemeKey.SetValue(\"\", \"URL:m3u8DL Protocol\");\n                    schemeKey.SetValue(\"URL Protocol\", \"\");\n                    using (var defaultIconKey = schemeKey.CreateSubKey(\"DefaultIcon\"))\n                    {\n                        defaultIconKey.SetValue(\"\", $\"\\\"{applicationPath}\\\",1\");\n                    }\n                    using (var shellKey = schemeKey.CreateSubKey(\"shell\"))\n                    using (var openKey = shellKey.CreateSubKey(\"open\"))\n                    using (var commandKey = openKey.CreateSubKey(\"command\"))\n                    {\n                        commandKey.SetValue(\"\", $\"\\\"{applicationPath}\\\" \\\"%1\\\"\");\n                        return true;\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                Console.WriteLine(e);\n            }\n\n            return false;\n        }\n\n        public static bool UnregisterUriScheme(string scheme)\n        {\n            try\n            {\n                Registry.ClassesRoot.DeleteSubKeyTree(scheme);\n                return true;\n            }\n            catch (Exception e)\n            {\n                Console.WriteLine(e);\n            }\n\n            return false;\n        }\n\n        public static void RequireElevated(string cmd)\n        {\n            if (!UACHelper.UACHelper.IsElevated)\n            {\n                string[] arguments = Environment.GetCommandLineArgs();\n                UACHelper.UACHelper.StartElevated(\n                    new ProcessStartInfo(Assembly.GetExecutingAssembly().Location, cmd)\n                );\n                Environment.Exit(0);\n            }\n        }\n\n        private static void DisplayHelp(ParserResult<MyOptions> result, IEnumerable<Error> errs)\n        {\n            var helpText = HelpText.AutoBuild(result, h =>\n            {\n                h.AdditionalNewLineAfterOption = false;\n                h.Copyright = \"\\r\\nUSAGE:\\r\\n\\r\\n  N_m3u8DL-CLI <URL|JSON|FILE> [OPTIONS]\\r\\n\\r\\nOPTIONS:\";\n                return HelpText.DefaultParsingErrorsHandler(result, h);\n            }, e => e);\n            Console.WriteLine(helpText);\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/ProgressReporter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace N_m3u8DL_CLI\n{\n    class ProgressReporter\n    {\n        private static string speed = \"\";\n        private static string progress = \"\";\n\n        static object lockThis = new object();\n        public static void Report(string progress, string speed)\n        {\n            lock (lockThis)\n            {\n                int windowWith = 63;\n                try\n                {\n                    windowWith = Console.WindowWidth;\n                }\n                catch (Exception e)\n                {\n                    // empty\n                }\n                if (!string.IsNullOrEmpty(progress)) ProgressReporter.progress = progress;\n                if (!string.IsNullOrEmpty(speed)) ProgressReporter.speed = speed;\n                string now = DateTime.Now.ToString(\"HH:mm:ss.000\");\n                var sub = windowWith - 4 - ProgressReporter.progress.Length - ProgressReporter.speed.Length - now.Length;\n                if (sub <= 0) sub = 0;\n                string print = now + \" \" + ProgressReporter.progress + \" \" + ProgressReporter.speed + new string(' ', sub);\n                Console.Write(\"\\r\" + print + \"\\r\");\n                //Console.Write(print);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// 有关程序集的一般信息由以下\n// 控制。更改这些特性值可修改\n// 与程序集关联的信息。\n[assembly: AssemblyTitle(\"N_m3u8DL-CLI\")]\n[assembly: AssemblyDescription(\"一款命令行m3u8下载器\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"nilaoda\")]\n[assembly: AssemblyProduct(\"N_m3u8DL-CLI\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2022\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// 将 ComVisible 设置为 false 会使此程序集中的类型\n//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型\n//请将此类型的 ComVisible 特性设置为 true。\n[assembly: ComVisible(false)]\n\n// 如果此项目向 COM 公开，则下列 GUID 用于类型库的 ID\n[assembly: Guid(\"4fb61439-b738-46ac-b3af-2bf72150d057\")]\n\n// 程序集的版本信息由下列四个值组成: \n//\n//      主版本\n//      次版本\n//      生成号\n//      修订号\n//\n// 可以指定所有值，也可以使用以下所示的 \"*\" 预置版本号和修订号\n// 方法是按如下所示使用“*”: :\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"3.0.2.0\")]\n[assembly: AssemblyFileVersion(\"3.0.2.0\")]\n"
  },
  {
    "path": "N_m3u8DL-CLI/Watcher.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Timers;\n\nnamespace N_m3u8DL_CLI\n{\n    class Watcher\n    {\n        private string dir = string.Empty;\n        private int total = 0;\n        private static double totalDuration = 0; //总时长\n        private int now = 0;\n        private int partsCount = 0;\n        FileSystemWatcher watcher = new FileSystemWatcher();\n\n        public int Total { get => total; set => total = value; }\n        public int Now { get => now; set => now = value; }\n        public int PartsCount { get => partsCount; set => partsCount = value; }\n        public static double TotalDuration { get => totalDuration; set => totalDuration = value; }\n\n        public Watcher(string Dir)\n        {\n            this.dir = Dir;\n        }\n\n        public void WatcherStrat()\n        {\n            for (int i = 0; i < PartsCount; i++)\n            {\n                Now += Global.GetFileCount(dir + \"\\\\Part_\" + i.ToString(DownloadManager.partsPadZero), \".ts\");\n            }\n            watcher.Path = dir;\n            watcher.Filter = \"*.ts\";\n            watcher.IncludeSubdirectories = true;  //包括子目录\n            watcher.EnableRaisingEvents = true;    //开启提交事件\n            watcher.Created += new FileSystemEventHandler(OnCreated);\n            watcher.Renamed += new RenamedEventHandler(OnCreated);\n            watcher.Deleted += new FileSystemEventHandler(OnDeleted);\n        }\n\n        public void WatcherStop()\n        {\n            watcher.Dispose();\n        }\n\n        private void OnCreated(object source, FileSystemEventArgs e)\n        {\n            if (Path.GetFileNameWithoutExtension(e.FullPath).StartsWith(\"Part\"))\n                return;\n            Now++;\n            if (Now > Total)\n            {\n                return;\n            }\n            //Console.Title = Now + \"   /   \" + Total;\n            string downloadedSize = Global.FormatFileSize(DownloadManager.DownloadedSize);\n            string estimatedSize = Global.FormatFileSize(DownloadManager.DownloadedSize * total / now);\n            int padding = downloadedSize.Length > estimatedSize.Length ? downloadedSize.Length : estimatedSize.Length;\n            DownloadManager.ToDoSize = (DownloadManager.DownloadedSize * total / now) - DownloadManager.DownloadedSize;\n            string percent = (Convert.ToDouble(now) / Convert.ToDouble(total) * 100).ToString(\"0.00\") + \"%\";\n            var print = \"Progress: \" + Now + \"/\" + Total\n                + $\" ({percent}) -- {downloadedSize.PadLeft(padding)}/{estimatedSize.PadRight(padding)}\";\n            ProgressReporter.Report(print, \"\");\n        }\n\n        private void OnRenamed(object source, RenamedEventArgs e)\n        {\n            if (Path.GetFileNameWithoutExtension(e.FullPath).StartsWith(\"Part\"))\n                return;\n            Now++;\n            if (Now > Total)\n            {\n                return;\n            }\n            //Console.Title = Now + \"   /   \" + Total;\n            string downloadedSize = Global.FormatFileSize(DownloadManager.DownloadedSize);\n            string estimatedSize = Global.FormatFileSize(DownloadManager.DownloadedSize * total / now);\n            int padding = downloadedSize.Length > estimatedSize.Length ? downloadedSize.Length : estimatedSize.Length;\n            DownloadManager.ToDoSize = (DownloadManager.DownloadedSize * total / now) - DownloadManager.DownloadedSize;\n            string percent = (Convert.ToDouble(now) / Convert.ToDouble(total) * 100).ToString(\"0.00\") + \"%\";\n            var print = \"Progress: \" + Now + \"/\" + Total\n                + $\" ({percent}) -- {downloadedSize.PadLeft(padding)}/{estimatedSize.PadRight(padding)}\";\n            ProgressReporter.Report(print, \"\");\n        }\n\n        private void OnDeleted(object source, FileSystemEventArgs e)\n        {\n            if (Path.GetFileNameWithoutExtension(e.FullPath).StartsWith(\"Part\"))\n                return;\n            Now--;\n            if (Now > Total)\n            {\n                return;\n            }\n            //Console.Title = Now + \"   /   \" + Total;\n            string downloadedSize = Global.FormatFileSize(DownloadManager.DownloadedSize);\n            string estimatedSize = Global.FormatFileSize(DownloadManager.DownloadedSize * total / now);\n            int padding = downloadedSize.Length > estimatedSize.Length ? downloadedSize.Length : estimatedSize.Length;\n            DownloadManager.ToDoSize = (DownloadManager.DownloadedSize * total / now) - DownloadManager.DownloadedSize;\n            string percent = (Convert.ToDouble(now) / Convert.ToDouble(total) * 100).ToString(\"0.00\") + \"%\";\n            var print = \"Progress: \" + Now + \"/\" + Total\n                + $\" ({percent}) -- {downloadedSize.PadLeft(padding)}/{estimatedSize.PadRight(padding)}\";\n            ProgressReporter.Report(print, \"\");\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/changelog.txt",
    "content": "﻿2018年12月3日\n  - 通过监控文件夹的更改来营造下载进度\n  - 增加对EXT-X-DISCONTINUITY的处理（分部分处理，分别合并）\n  - 增加对腾讯视频HDR的支持（主要是EXT-X-MAP的处理）\n  - 增加对Master List的支持（默认最高画质）\n  - json文件UpdateTime属性值改为\"o\" 符合国际标准\n  - 按照EXT-X-DISCONTINUITY划分出的视频组采用COPY /B方式合并，最后用ffmpeg concat合并为单一文件\n2018年12月5日\n  - 转换为.Net Core项目(放弃)\n2018年12月10日\n  - 修改M3u8Do中的多线程下载，改为线程局部变量\n2018年12月11日\n  - 修复BUG，处理拼接相对路径中含有冒号的情况\n2018年12月13日\n  - 读写锁机制确保LOG正确写入\n  - 跳过优酷广告分片\n2018年12月14日\n  - 如果Parts不等于1，就强制转换到MPEGTS封装\n  - 如果Parts不等于1，启动新线程合并\n  - 优化点播直播的判断\n  - 修复获取属性的BUG（由','分割字符串，codecs里也有','造成）\n  - baseurl增加冒号的拼接逻辑\n2018年12月17日\n  - 支持本地m3u8+本地ts文件形式\n2018年12月19日\n  - 支持 EXT-X-BYTERANGE 标签（点播）\n2018年12月25日\n  - 修改判断直播与点播的逻辑\n  - 优酷 默认修改为 drm_type=3&drm_device=10\n  - HttpDownloadFileToBytes 支持解压Gzip压缩且不再依赖服务器返回的ContentLength（bug fixed）\n  - CombineURL 改用 Uri 类来拼接baseurl和url，普适性更强，无脑截取丢给它也可以拼接出正确的地址（bug fixed）\n2018年12月26日\n  - 修复Bug，增加变量startIndex，使用 segIndex-startIndex 计算分段总数\n2019年1月23日 \n  - parser规范化，使用Jobject构造Json文件（切记：使用 new 来清空对象，不要用Clear，否则会导致之前加入的对象被同时清空）\n  - 使用WebClient下载，并优化m3u8的Range处理\n2019年1月24日\n  - 修复：在master列表检测时需重置Baseurl\n2019年2月23日\n  - 优化下载\n  - 重试次数增加到5\n  - 完成后不显示进度\n  - 命令行支持自定义MuxFastStart\n2019年3月8日\n  - 重写对linetv的key分析，比对重复\n2019年3月11日\n  - 自动判断音轨决定是否加入-bsf:a aac_adtstoasc参数\n2019年3月18日\n  - 固定几行UI，可显示下载速度以及进度(计算文件夹大小实现)\n  - 混流时寻找ddpAudio.txt里的杜比音轨路径，封装杜比音轨\n2019年3月20日\n  - 通过Global.ShouldStop变量，完成了速度为零3次的自动杀进程功能(HTTP写入流也强行结束)\n2019年3月25日\n  - 优化下载函数\n2019年3月29日\n  - 0:a?\n  - 修复对#EXT-X-BYTERANGE的支持\n2019年3月30日\n  - 删除Remove()函数，改为在Global.HttpDownloadFile()执行该逻辑\n2019年3月31日\n  - Global.HttpDownloadFile()采用using包围\n  - 找不到ffmpeg报异常\n  - Log写入Command Line\n2019年4月11日\n  - 支持爱奇艺杜比视界，并判断如果是杜比视界则采用二进制合并\n  - 暂时去掉分段检测TS封装\n2019年4月12日\n  - 最低16线程 最高32\n  - 修复AAC滤镜识别\n  - 支持腾讯视频杜比视界\n2019年4月13日\n  - 增加downLen和totalLen对比是否下载完全\n2019年4月18日\n  - 命令行模式正式化，发布1.0版本\n2019年4月24日\n  - 增加enableBinaryMerge选项\n  - 修复Bug\n2019年4月30日\n  - 增加仅解析功能 --enableParseOnly\n  - 支持从已解析的meta.json文件中直接进行下载\n2019年5月3日\n  - 可下载纯音频m3u8\n2019年5月6日\n  - 修改速度计算方式（增加BYTE）\n  - 修复ContentLength引发的BUG\n2019年6月5日\n  - 外部ddp逻辑优化\n  - 跳过已存在文件时防止被速度监控程序杀死\n  - 增加过多分片(>1800)合并逻辑\n2019年6月6日\n  - 支持DMM视频网站m3u8下载\n  - 增加全局异常捕获\n  - ffmpeg合并时去掉-map 0:d，因为mp4容器不支持此类数据\n2019年6月7日\n  - 支持删除混流的日期参数\n2019年6月8日\n  - 通过request.ReadWriteTimeout解决不能及时重试的问题\n  - 下载失败后不会卡在按任意键继续\n  - 添加timeout参数\n2019年6月9日\n  - 过滤m3u8内容中的空白行 \n  - 修复BUG(不该验证Status=200)\n  - 增加显示更多信息(百分比/已下载/估计大小/估计时长)\n  - 增加对优酷杜比视界的支持\n  - 优化判断杜比视界的逻辑\n2019年6月10日\n  - 获取文件时排序，防止在网络驱动器中的致命BUG\n  - AllowAutoRedirect = true 去掉Get302函数\n  - 解决XP系统低版本.net框架的一个URL拼接bug\n  - 为兼容XP系统 使用Environment.SetEnvironmentVariable替代了StartInfo.Environment\n  - 修复获取属性值的一个bug\n2019年6月12日\n  - 自动下载m3u8外挂音轨、字幕等\n2019年6月14日\n  - 自动处理芒果TV请求头\n2019年6月16日\n  - 为兼容XP做出调整(https安全协议 SecurityProtocol)\n2019年6月17日\n  - 修复同名覆盖的BUG\n  - LOG写入正确的工作目录\n  - 修复下载额外字幕、音频时未能继承ReqHeaders的问题\n2019年6月18日\n  - 添加图标\n  - 增加程序更新检测\n2019年6月19日\n  - 修复升级BUG\n  - 自动下载更新\n2019年6月23日\n  - LOG写入到程序EXE所在目录\n  - 环境变量检测BUG修复\n2019年7月7日\n  - 芒果自动加Cookie\n  - 支持分段形式伪m3u8的正确合并\n2019年7月8日\n  - 修改默认UA为 VLC/2.2.1 LibVLC/2.2.1 \n2019年7月10日\n  - 支持气球云m3u8\n2019年7月10日\n  - 修复获取属性值的BUG\n2019年7月10日\n  - 支持阿里云大学m3u8\n2019年7月23日\n  - 在TS格式检测中放行杜比视界视频\n  - 自动去除优酷视频的广告(当指定downloadRange时不会启动)\n  - 支持手动指定想要下载的内容(downloadRange)\n2019年7月29日\n  - 自动修改为爱奇艺UA\n2019年8月21日\n  - 增加originalCount属性，修复选取时间段后可能导致的合并顺序错乱问题\n  - 增加noMerge命令行参数\n  - 增加noProxy命令行参数\n2019年8月22日\n  - 增加stopSpeed命令行参数\n  - Invalid Url至多提示20次\n2019年8月28日\n  - 优化腾讯杜比视界的识别\n2019年9月5日\n  - 更改输出信息，输出显示更多下载细节\n  - 可以识别单音轨，自动合并为指定格式\n  - 支持双击后输入命令\n  - 避免重试时再次检测视频\n  - 识别MPEG-TS封装时略过纯音频\n  - 会首先下载第一个分片用以读取信息\n  - 修复302状态码Baseurl错误的问题\n  - 修正流匹配的正则表达式\n2019年9月8日\n  - 修复视频被识别为音频的BUG\n2019年9月9日\n  - 如果Parts大于1，则强制进行MPEG-TS封装\n  - 修改Parts大于1时的下载逻辑，提升下载速度\n2019年9月10日\n  - 修改读取视频信息的逻辑\n  - 优化直播下载的信息输出\n2019年9月16日\n  - 修复下载外挂流时显示异常问题\n2019年9月18日\n  - 每秒计算一次速度\n  - 下载首分片将不触发停速重试\n  - 加入全局限速功能\n2019年9月27日\n  - 支持www.vlive.tv\n2019年10月5日\n  - N_m3u8DL-CLI.args.txt\n  - 细节优化\n2019年10月18日\n  - 去掉了优酷DRM设备参数更改\n2019年10月23日\n  - 增加disableIntegrityCheck选项\n2019年10月24日\n  - 捕获Ctrl+C退出，移动光标到正确位置\n2019年11月30日\n  - 完善芒果TV请求头的自动添加\n2019年12月16日\n  - 处理文件名特殊字符\n2019年12月18日\n  - 修复m3u8解析bug导致的无法合并问题\n  - 增加杜比视界识别场景\n  - 修复part大于1时读取json混流文件的严重错误\n  - 自动去除优酷的广告分片及前情提要\n  - 修复腾讯视频HDR10视频下载合并异常问题\n2020年1月26日\n  - 在央视频回看链接且有endtime参数的情况下，不识别为直播流\n2020年1月29日\n  - 修复识别大师列表的bug (多个字幕同一个GROUP-ID)\n  - 修复vtt字幕无法正常合并的bug\n2020年1月31日\n  - ?__gda__行为优化\n2020年2月1日\n  - 修复bug\n  - 支援twitcasting下载\n2020年2月3日\n  - 解密异常则退出程序\n  - 通过json下载时若已存在文件则覆盖\n2020年2月18日\n  - 修正获取BaseUrl的BUG\n  - 重新打包dll\n2020年2月23日\n  - 不支持的加密方式将标记为NOTSUPPORTED并强制启用二进制合并\n  - 启用二进制合并的情况下，如果m3u8文件中存在map文件，则合并为mp4格式\n2020年2月24日\n  - 直播流录制优化逻辑，避免忙等待\n  - 直播Waiting时，不再输出Parser内容\n  - 直播录制的日志记录\n  - 增加新的选项--liveRecDur限制直播录制时长\n2020年2月27日\n  - 细节bug修复\n2020年2月28日\n  - 修复本地masterList的读取问题\n  - 在程序目录下创建NO_UPDATE文件可以禁止启动时检测更新\n2020年2月29日\n  - 识别#EXT-X-TARGETDURATION时，支持非整数\n2020年3月2日\n  - 支持51cto的key自动解密\n  - 请求m3u8内容时，有10次自动重试\n  - 直播下载自动设置请求分段文件时间间隔\n  - 修复网络断线一直Downloading及cpu 100%\n  - 加入savename参数仍可读取N_m3u8DL-CLI.args.txt\n  - 直播下载跳过响应码为400的片段\n2020年3月3日\n  - 修复输出太长只在最后一行显示的问题\n2020年3月4日\n  - 只认第一个\"#EXT-X-MAP\", 其余的全部丢弃\n  - 逻辑优化\n2020年3月5日\n  - 增加同名文件合并时共存策略\n2020年4月17日\n  - 优化异常捕获\n  - 细节优化\n2020年4月22日\n  - 51cto getsign\n2020年5月23日\n  - 优酷杜比视界下载逻辑优化\n2020年6月15日\n  - 支持IMOCO m3u8/key解密\n2020年7月18日\n  - 从当前路径和exe路径同时寻找ffmpeg\n  - 支持多语言本地化(简繁英)\n2020年8月4日\n  - 修复外挂字幕命名问题\n  - 修复外挂字幕识别问题\n  - 修复外挂轨道的一些逻辑问题\n  - 优化多语言识别逻辑\n2020年8月5日\n  - 支持相对时间的vtt合并(还存在问题)\n2020年8月9日\n  - 修复IV错误导致的AES-128解密异常问题\n  - 支持自定义IV(--useKeyIV)\n2020年9月12日\n  - 支持nfmovies m3u8解密\n  - 支持自动去除PNG Header(https://puui.qpic.cn/newsapp_ls/0/12418116195/0)\n  - 修复相对时间的vtt合并的一些错误逻辑(还存在问题)\n2020年9月19日\n  - 在自定义KEY且未自定义IV情况下，自动读取m3u8中存在的IV\n  - 支持阿房影视等ddyun m3u8解密\n2020年10月14日\n  - 咪咕分片链接后拼接m3u8_url参数\n  - 修复文件名过长导致的BUG\n  - 优化ffmpeg调用逻辑\n2020年11月17日\n  - 将默认UA修改为 Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; 15 Plus Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/9.4 Mobile Safari/537.36\n  - m3u8响应长度大于50M则丢弃 \n  - 修正使用AAC滤镜的逻辑\n  - 识别EXT-X-PROGRAM-DATE-TIME\n2020年11月20日\n  - 识别大部分mpd地址，自动转换为m3u8并下载\n  - GIF HEADER检测\n  - 修复BUG\n2020年11月22日\n  - 解决HTTPS协议自动重定向后，Referer丢失问题\n  - 新的任务速度监控逻辑\n2020年11月23日\n  - 将默认UA修改为 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36\n  - 修改芒果TV请求头\n2020年11月25日\n  - 修正MPD判断最高清晰度的逻辑\n  - 在MPD输入下支持选择音轨\n  - 修复BUG\n2020年11月26日\n  - 优化MPD识别方案\n  - 修复MPD情况下时间戳溢出问题\n2020年12月2日\n  - FIX Language Bug\n2020年12月6日\n  - 使用手机UA请求气球云密钥服务器\n2020年12月12日\n  - 修复MPD下同一个ID分散在不同Period导致下载不完全问题\n2020年12月20日\n  - 支持解密虎课网\n2021年1月18日\n  - 完善MPD下载相关\n  - 重新打包多语言资源\n2021年1月24日\n  - 适配Disney+资源\n  - MPD选择流行为优化\n  - 修复二进制合并时vtt字幕被合并为ts后缀问题\n2021年2月1日\n  - 修正自定义KEY且存在IV时的隐患\n  - 优化跳过PNG Header的算法\n2021年2月2日\n  - 独播库自动加入referer\n  - 修复气球云\n2021年2月10日\n  - 修正MPD拼接BaseUrl逻辑\n2021年2月11日\n  - 将CNTV视频修改为未加密链接\n2021年2月21日\n  - MPD检测最后一个分片是否有效\n2021年2月22日\n  - 添加用户网络代理支持，使用--proxyAddress指定代理地址。（@evanlabs）\n2021年3月3日\n  - 修复M3U8选择音轨/字幕不生效问题\n  - 外挂音轨时enableAudioOnly可仅下载音频\n  - 移除气球云支持\n2021年3月15日\n  - 修复enableAudioOnly且下载MPD文件时留下冗余(Audio)文件夹的情况\n2021年3月22日\n  - 适配AppleTv资源\n2021年3月25日\n  - 优化下载监控\n  - 为下载分片增加了自动重试机制(3次)\n2021年3月27日\n  - 优化显示输出\n  - 增加ETA显示\n2021年6月27日\n  - 修正判断png图片时可能出现的数组越界bug\n  - 支持解压brotli（测试地址 https://www.baobuzz.com/m3u8/236963.m3u8?sign=811ae52382b7dd1d247f705e1bcaddf4）\n2021年7月4日\n  - 优化master选择最高清晰度逻辑（大于改为大于等于）\n  - 支持爱奇艺DRM-JSON自动转换为m3u8\n2021年8月15日\n  - 优化显示输出\n  - 强校验MAP下载成功\n2021年9月5日\n  - 修复MPD节点选择BUG\n  - 修复速度输出padding负值问题\n  - 修复同一个period且同id导致被重复添加分片\n  - 优化AppleTV判断\n2021年10月19日\n  - 修复选择清晰度在输入选项后界面异常问题\n  - 修复日志冲突问题\n2021年11月12日\n  - 修复init url缺失baseurl问题"
  },
  {
    "path": "N_m3u8DL-CLI/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"BrotliSharpLib\" version=\"0.3.3\" targetFramework=\"net46\" />\n  <package id=\"CommandLineParser\" version=\"2.8.0\" targetFramework=\"net46\" />\n  <package id=\"Costura.Fody\" version=\"4.1.0\" targetFramework=\"net46\" />\n  <package id=\"Fody\" version=\"6.0.0\" targetFramework=\"net46\" developmentDependency=\"true\" />\n  <package id=\"HttpToSocks5Proxy\" version=\"1.4.0\" targetFramework=\"net46\" />\n  <package id=\"Newtonsoft.Json\" version=\"13.0.1\" targetFramework=\"net46\" />\n  <package id=\"NiL.JS\" version=\"2.5.1428\" targetFramework=\"net46\" />\n  <package id=\"Resource.Embedder\" version=\"2.1.1\" targetFramework=\"net46\" />\n  <package id=\"System.Runtime.CompilerServices.Unsafe\" version=\"4.5.2\" targetFramework=\"net46\" />\n  <package id=\"TaskScheduler\" version=\"2.8.7\" targetFramework=\"net46\" />\n  <package id=\"UACHelper\" version=\"1.3.0.5\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "N_m3u8DL-CLI/strings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace N_m3u8DL_CLI {\n    using System;\n    \n    \n    /// <summary>\n    ///   一个强类型的资源类，用于查找本地化的字符串等。\n    /// </summary>\n    // 此类是由 StronglyTypedResourceBuilder\n    // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。\n    // 若要添加或移除成员，请编辑 .ResX 文件，然后重新运行 ResGen\n    // (以 /str 作为命令选项)，或重新生成 VS 项目。\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class strings {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal strings() {\n        }\n        \n        /// <summary>\n        ///   返回此类使用的缓存的 ResourceManager 实例。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"N_m3u8DL_CLI.strings\", typeof(strings).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   重写当前线程的 CurrentUICulture 属性，对\n        ///   使用此强类型资源类的所有资源查找执行重写。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 二进制合并...请耐心等待 的本地化字符串。\n        /// </summary>\n        public static string binaryMergingPleaseWait {\n            get {\n                return ResourceManager.GetString(\"binaryMergingPleaseWait\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 正在判断尾分片是否有效... 的本地化字符串。\n        /// </summary>\n        public static string checkingLast {\n            get {\n                return ResourceManager.GetString(\"checkingLast\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 已关闭完整性检查 的本地化字符串。\n        /// </summary>\n        public static string disableIntegrityCheck {\n            get {\n                return ResourceManager.GetString(\"disableIntegrityCheck\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 杜比视界内容，使用二进制合并...请耐心等待 的本地化字符串。\n        /// </summary>\n        public static string dolbyVisionContentMerging {\n            get {\n                return ResourceManager.GetString(\"dolbyVisionContentMerging\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 已下载完毕 的本地化字符串。\n        /// </summary>\n        public static string downloadComplete {\n            get {\n                return ResourceManager.GetString(\"downloadComplete\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 完成数量  的本地化字符串。\n        /// </summary>\n        public static string downloadedCount {\n            get {\n                return ResourceManager.GetString(\"downloadedCount\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 下载失败, 程序退出 的本地化字符串。\n        /// </summary>\n        public static string downloadFailed {\n            get {\n                return ResourceManager.GetString(\"downloadFailed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 开始下载外挂音频... 的本地化字符串。\n        /// </summary>\n        public static string downloadingExternalAudioTrack {\n            get {\n                return ResourceManager.GetString(\"downloadingExternalAudioTrack\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 开始下载外挂字幕... 的本地化字符串。\n        /// </summary>\n        public static string downloadingExternalSubtitleTrack {\n            get {\n                return ResourceManager.GetString(\"downloadingExternalSubtitleTrack\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 下载首分片... 的本地化字符串。\n        /// </summary>\n        public static string downloadingFirstSegement {\n            get {\n                return ResourceManager.GetString(\"downloadingFirstSegement\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 获取m3u8内容 的本地化字符串。\n        /// </summary>\n        public static string downloadingM3u8 {\n            get {\n                return ResourceManager.GetString(\"downloadingM3u8\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 获取m3u8 key... 的本地化字符串。\n        /// </summary>\n        public static string downloadingM3u8Key {\n            get {\n                return ResourceManager.GetString(\"downloadingM3u8Key\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 下载MAP文件... 的本地化字符串。\n        /// </summary>\n        public static string downloadingMapFile {\n            get {\n                return ResourceManager.GetString(\"downloadingMapFile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 强制退出: Ctrl+C 的本地化字符串。\n        /// </summary>\n        public static string ExitedCtrlC {\n            get {\n                return ResourceManager.GetString(\"ExitedCtrlC\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 强制退出: 强制 的本地化字符串。\n        /// </summary>\n        public static string ExitedForce {\n            get {\n                return ResourceManager.GetString(\"ExitedForce\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 结果输出至 [ffreport.log] 的本地化字符串。\n        /// </summary>\n        public static string ffmpegDone {\n            get {\n                return ResourceManager.GetString(\"ffmpegDone\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 在PATH和程序路径下找不到 ffmpeg 的本地化字符串。\n        /// </summary>\n        public static string ffmpegLost {\n            get {\n                return ResourceManager.GetString(\"ffmpegLost\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 使用ffmpeg合并...请耐心等待 的本地化字符串。\n        /// </summary>\n        public static string ffmpegMergingPleaseWait {\n            get {\n                return ResourceManager.GetString(\"ffmpegMergingPleaseWait\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 请下载ffmpeg.exe并把他放到程序同目录. 的本地化字符串。\n        /// </summary>\n        public static string ffmpegTip {\n            get {\n                return ResourceManager.GetString(\"ffmpegTip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 文件时长： 的本地化字符串。\n        /// </summary>\n        public static string fileDuration {\n            get {\n                return ResourceManager.GetString(\"fileDuration\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 文件名称： 的本地化字符串。\n        /// </summary>\n        public static string fileName {\n            get {\n                return ResourceManager.GetString(\"fileName\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 识别到外挂音频轨道 的本地化字符串。\n        /// </summary>\n        public static string hasExternalAudioTrack {\n            get {\n                return ResourceManager.GetString(\"hasExternalAudioTrack\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 识别到外挂字幕轨道 的本地化字符串。\n        /// </summary>\n        public static string hasExternalSubtitleTrack {\n            get {\n                return ResourceManager.GetString(\"hasExternalSubtitleTrack\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 设定Baseurl 的本地化字符串。\n        /// </summary>\n        public static string Help_baseUrl {\n            get {\n                return ResourceManager.GetString(\"Help_baseUrl\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 关闭混流中的日期写入 的本地化字符串。\n        /// </summary>\n        public static string Help_disableDateInfo {\n            get {\n                return ResourceManager.GetString(\"Help_disableDateInfo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 不检测分片数量是否完整 的本地化字符串。\n        /// </summary>\n        public static string Help_disableIntegrityCheck {\n            get {\n                return ResourceManager.GetString(\"Help_disableIntegrityCheck\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 仅下载视频的一部分分片或长度 的本地化字符串。\n        /// </summary>\n        public static string Help_downloadRange {\n            get {\n                return ResourceManager.GetString(\"Help_downloadRange\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 合并时仅封装音频轨道 的本地化字符串。\n        /// </summary>\n        public static string Help_enableAudioOnly {\n            get {\n                return ResourceManager.GetString(\"Help_enableAudioOnly\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 开启二进制合并分片 的本地化字符串。\n        /// </summary>\n        public static string Help_enableBinaryMerge {\n            get {\n                return ResourceManager.GetString(\"Help_enableBinaryMerge\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 开启下载后删除临时文件夹的功能 的本地化字符串。\n        /// </summary>\n        public static string Help_enableDelAfterDone {\n            get {\n                return ResourceManager.GetString(\"Help_enableDelAfterDone\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 开启混流mp4的FastStart特性 的本地化字符串。\n        /// </summary>\n        public static string Help_enableMuxFastStart {\n            get {\n                return ResourceManager.GetString(\"Help_enableMuxFastStart\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 开启仅解析模式(程序只进行到meta.json) 的本地化字符串。\n        /// </summary>\n        public static string Help_enableParseOnly {\n            get {\n                return ResourceManager.GetString(\"Help_enableParseOnly\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 设定请求头，格式 key:value 使用|分割不同的key&amp;value 的本地化字符串。\n        /// </summary>\n        public static string Help_headers {\n            get {\n                return ResourceManager.GetString(\"Help_headers\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 链接或文件 的本地化字符串。\n        /// </summary>\n        public static string Help_input {\n            get {\n                return ResourceManager.GetString(\"Help_input\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 直播录制时，达到此长度自动退出软件(HH:MM:SS) 的本地化字符串。\n        /// </summary>\n        public static string Help_liveRecDur {\n            get {\n                return ResourceManager.GetString(\"Help_liveRecDur\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 设置下载速度上限(单位为KB/s) 的本地化字符串。\n        /// </summary>\n        public static string Help_maxSpeed {\n            get {\n                return ResourceManager.GetString(\"Help_maxSpeed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 设定程序的最大线程数 的本地化字符串。\n        /// </summary>\n        public static string Help_maxThreads {\n            get {\n                return ResourceManager.GetString(\"Help_maxThreads\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 设定程序的最小线程数 的本地化字符串。\n        /// </summary>\n        public static string Help_minThreads {\n            get {\n                return ResourceManager.GetString(\"Help_minThreads\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 使用外部json文件定义混流选项 的本地化字符串。\n        /// </summary>\n        public static string Help_muxSetJson {\n            get {\n                return ResourceManager.GetString(\"Help_muxSetJson\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 禁用自动合并 的本地化字符串。\n        /// </summary>\n        public static string Help_noMerge {\n            get {\n                return ResourceManager.GetString(\"Help_noMerge\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 不自动使用系统代理 的本地化字符串。\n        /// </summary>\n        public static string Help_noProxy {\n            get {\n                return ResourceManager.GetString(\"Help_noProxy\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 设置HTTP/SOCKS5代理, 如 http://127.0.0.1:8080 的本地化字符串。\n        /// </summary>\n        public static string Help_proxyAddress {\n            get {\n                return ResourceManager.GetString(\"Help_proxyAddress\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 注册m3u8dl链接协议 的本地化字符串。\n        /// </summary>\n        public static string Help_registerUrlProtocol {\n            get {\n                return ResourceManager.GetString(\"Help_registerUrlProtocol\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 设定程序的重试次数 的本地化字符串。\n        /// </summary>\n        public static string Help_retryCount {\n            get {\n                return ResourceManager.GetString(\"Help_retryCount\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 设定存储文件名(不包括后缀) 的本地化字符串。\n        /// </summary>\n        public static string Help_saveName {\n            get {\n                return ResourceManager.GetString(\"Help_saveName\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 当速度低于此值时，重试(单位为KB/s) 的本地化字符串。\n        /// </summary>\n        public static string Help_stopSpeed {\n            get {\n                return ResourceManager.GetString(\"Help_stopSpeed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 设定程序网络请求的超时时间(单位为秒) 的本地化字符串。\n        /// </summary>\n        public static string Help_timeOut {\n            get {\n                return ResourceManager.GetString(\"Help_timeOut\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 取消注册m3u8dl链接协议 的本地化字符串。\n        /// </summary>\n        public static string Help_unregisterUrlProtocol {\n            get {\n                return ResourceManager.GetString(\"Help_unregisterUrlProtocol\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 使用Base64字符串定义AES-128解密KEY 的本地化字符串。\n        /// </summary>\n        public static string Help_useKeyBase64 {\n            get {\n                return ResourceManager.GetString(\"Help_useKeyBase64\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 使用外部16字节文件定义AES-128解密KEY 的本地化字符串。\n        /// </summary>\n        public static string Help_useKeyFile {\n            get {\n                return ResourceManager.GetString(\"Help_useKeyFile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 使用HEX字符串定义AES-128解密IV 的本地化字符串。\n        /// </summary>\n        public static string Help_useKeyIV {\n            get {\n                return ResourceManager.GetString(\"Help_useKeyIV\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 设定程序工作目录 的本地化字符串。\n        /// </summary>\n        public static string Help_workDir {\n            get {\n                return ResourceManager.GetString(\"Help_workDir\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 无效的m3u8 的本地化字符串。\n        /// </summary>\n        public static string invalidM3u8 {\n            get {\n                return ResourceManager.GetString(\"invalidM3u8\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 地址无效 的本地化字符串。\n        /// </summary>\n        public static string InvalidUri {\n            get {\n                return ResourceManager.GetString(\"InvalidUri\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 识别为直播流, 开始录制... 的本地化字符串。\n        /// </summary>\n        public static string liveStreamFoundAndRecoding {\n            get {\n                return ResourceManager.GetString(\"liveStreamFoundAndRecoding\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 识别到大师列表 的本地化字符串。\n        /// </summary>\n        public static string masterListFound {\n            get {\n                return ResourceManager.GetString(\"masterListFound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 检测到更新，版本：{0}! 新版下载成功，请您自行替换 的本地化字符串。\n        /// </summary>\n        public static string newerVerisonDownloaded {\n            get {\n                return ResourceManager.GetString(\"newerVerisonDownloaded\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 检测到更新，版本：{0}! 新版下载失败，请您自行下载 的本地化字符串。\n        /// </summary>\n        public static string newerVerisonDownloadFailed {\n            get {\n                return ResourceManager.GetString(\"newerVerisonDownloadFailed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 检测到更新，版本：{0}! 正在尝试自动下载新版 的本地化字符串。\n        /// </summary>\n        public static string newerVisionDetected {\n            get {\n                return ResourceManager.GetString(\"newerVisionDetected\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 不支持{0}加密方式,将不被处理,且强制开启二进制合并 的本地化字符串。\n        /// </summary>\n        public static string notSupportMethod {\n            get {\n                return ResourceManager.GetString(\"notSupportMethod\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 解析m3u8成功, 程序退出 的本地化字符串。\n        /// </summary>\n        public static string parseExit {\n            get {\n                return ResourceManager.GetString(\"parseExit\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 解析m3u8内容 的本地化字符串。\n        /// </summary>\n        public static string parsingM3u8 {\n            get {\n                return ResourceManager.GetString(\"parsingM3u8\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 分片大于1800个，执行分部合并中... 的本地化字符串。\n        /// </summary>\n        public static string partialMergingPleaseWait {\n            get {\n                return ResourceManager.GetString(\"partialMergingPleaseWait\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 按任意键退出. 的本地化字符串。\n        /// </summary>\n        public static string pressAnyKeyExit {\n            get {\n                return ResourceManager.GetString(\"pressAnyKeyExit\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 读取文件信息... 的本地化字符串。\n        /// </summary>\n        public static string readingFileInfo {\n            get {\n                return ResourceManager.GetString(\"readingFileInfo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 录制已到达限定长度 的本地化字符串。\n        /// </summary>\n        public static string recordLimitReached {\n            get {\n                return ResourceManager.GetString(\"recordLimitReached\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 注册m3u8dl链接协议失败！ 的本地化字符串。\n        /// </summary>\n        public static string registerUrlProtocolFailed {\n            get {\n                return ResourceManager.GetString(\"registerUrlProtocolFailed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 注册m3u8dl链接协议成功！ 的本地化字符串。\n        /// </summary>\n        public static string registerUrlProtocolSuccessful {\n            get {\n                return ResourceManager.GetString(\"registerUrlProtocolSuccessful\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 将文件转换到 MPEG-TS 封装： 的本地化字符串。\n        /// </summary>\n        public static string remuxToMPEGTS {\n            get {\n                return ResourceManager.GetString(\"remuxToMPEGTS\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 重试次数  的本地化字符串。\n        /// </summary>\n        public static string retryCount {\n            get {\n                return ResourceManager.GetString(\"retryCount\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 存储路径： 的本地化字符串。\n        /// </summary>\n        public static string savePath {\n            get {\n                return ResourceManager.GetString(\"savePath\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 总分片： 的本地化字符串。\n        /// </summary>\n        public static string segCount {\n            get {\n                return ResourceManager.GetString(\"segCount\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 已选择分片： 的本地化字符串。\n        /// </summary>\n        public static string selectedCount {\n            get {\n                return ResourceManager.GetString(\"selectedCount\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 已自动选择最高清晰度 的本地化字符串。\n        /// </summary>\n        public static string selectPlaylist {\n            get {\n                return ResourceManager.GetString(\"selectPlaylist\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 遇到了某些错误! 的本地化字符串。\n        /// </summary>\n        public static string SomethingWasWrong {\n            get {\n                return ResourceManager.GetString(\"SomethingWasWrong\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 开始下载文件 的本地化字符串。\n        /// </summary>\n        public static string startDownloading {\n            get {\n                return ResourceManager.GetString(\"startDownloading\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 开始合并分片... 的本地化字符串。\n        /// </summary>\n        public static string startMerging {\n            get {\n                return ResourceManager.GetString(\"startMerging\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 开始解析  的本地化字符串。\n        /// </summary>\n        public static string startParsing {\n            get {\n                return ResourceManager.GetString(\"startParsing\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 开始解析MPD内容... 的本地化字符串。\n        /// </summary>\n        public static string startParsingMpd {\n            get {\n                return ResourceManager.GetString(\"startParsingMpd\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 重新解析m3u8... 的本地化字符串。\n        /// </summary>\n        public static string startReParsing {\n            get {\n                return ResourceManager.GetString(\"startReParsing\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 任务结束 的本地化字符串。\n        /// </summary>\n        public static string taskDone {\n            get {\n                return ResourceManager.GetString(\"taskDone\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 取消注册m3u8dl链接协议失败！ 的本地化字符串。\n        /// </summary>\n        public static string unregisterUrlProtocolFailed {\n            get {\n                return ResourceManager.GetString(\"unregisterUrlProtocolFailed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 取消注册m3u8dl链接协议成功！ 的本地化字符串。\n        /// </summary>\n        public static string unregisterUrlProtocolSuccessful {\n            get {\n                return ResourceManager.GetString(\"unregisterUrlProtocolSuccessful\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 等待下载完成... 的本地化字符串。\n        /// </summary>\n        public static string waitForCompletion {\n            get {\n                return ResourceManager.GetString(\"waitForCompletion\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 写出playLists.json 的本地化字符串。\n        /// </summary>\n        public static string wrtingMasterMeta {\n            get {\n                return ResourceManager.GetString(\"wrtingMasterMeta\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 写出meta.json 的本地化字符串。\n        /// </summary>\n        public static string wrtingMeta {\n            get {\n                return ResourceManager.GetString(\"wrtingMeta\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "N_m3u8DL-CLI/strings.en-US.Designer.cs",
    "content": ""
  },
  {
    "path": "N_m3u8DL-CLI/strings.en-US.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"binaryMergingPleaseWait\" xml:space=\"preserve\">\n    <value>Binary Merging... Please Wait...</value>\n  </data>\n  <data name=\"disableIntegrityCheck\" xml:space=\"preserve\">\n    <value>Integrity Check Is Disable</value>\n  </data>\n  <data name=\"dolbyVisionContentMerging\" xml:space=\"preserve\">\n    <value>Dolby Vison Content Detected, Binary Merging...</value>\n  </data>\n  <data name=\"downloadComplete\" xml:space=\"preserve\">\n    <value>Download Complete</value>\n  </data>\n  <data name=\"downloadedCount\" xml:space=\"preserve\">\n    <value>Downloaded </value>\n  </data>\n  <data name=\"downloadFailed\" xml:space=\"preserve\">\n    <value>Download Failed, Exit.</value>\n  </data>\n  <data name=\"downloadingExternalAudioTrack\" xml:space=\"preserve\">\n    <value>Start Downloading External Audio Track...</value>\n  </data>\n  <data name=\"downloadingExternalSubtitleTrack\" xml:space=\"preserve\">\n    <value>Start Downloading External Subtitle Track...</value>\n  </data>\n  <data name=\"downloadingFirstSegement\" xml:space=\"preserve\">\n    <value>Downloading First Segement...</value>\n  </data>\n  <data name=\"downloadingM3u8\" xml:space=\"preserve\">\n    <value>Downloading M3u8 Content</value>\n  </data>\n  <data name=\"downloadingM3u8Key\" xml:space=\"preserve\">\n    <value>Downloading M3u8 Key...</value>\n  </data>\n  <data name=\"downloadingMapFile\" xml:space=\"preserve\">\n    <value>Downloading Map File...</value>\n  </data>\n  <data name=\"ExitedCtrlC\" xml:space=\"preserve\">\n    <value>Exited: Ctrl + C</value>\n  </data>\n  <data name=\"ExitedForce\" xml:space=\"preserve\">\n    <value>Exited: Forcec</value>\n  </data>\n  <data name=\"ffmpegDone\" xml:space=\"preserve\">\n    <value>Result in [ffreport.log]</value>\n  </data>\n  <data name=\"ffmpegLost\" xml:space=\"preserve\">\n    <value>Can Not Find ffmpeg In Current DIr or PATH</value>\n  </data>\n  <data name=\"ffmpegMergingPleaseWait\" xml:space=\"preserve\">\n    <value>Merging with ffmpeg...</value>\n  </data>\n  <data name=\"ffmpegTip\" xml:space=\"preserve\">\n    <value>Please Download ffmpeg And Put It In The Same Directory As The Program.</value>\n  </data>\n  <data name=\"fileDuration\" xml:space=\"preserve\">\n    <value>File Duration: </value>\n  </data>\n  <data name=\"fileName\" xml:space=\"preserve\">\n    <value>File Name: </value>\n  </data>\n  <data name=\"hasExternalAudioTrack\" xml:space=\"preserve\">\n    <value>Has External Audio Track</value>\n  </data>\n  <data name=\"hasExternalSubtitleTrack\" xml:space=\"preserve\">\n    <value>Has External Subtitle Track</value>\n  </data>\n  <data name=\"invalidM3u8\" xml:space=\"preserve\">\n    <value>Invalid M3u8 (NOT Contain #EXTM3U)</value>\n  </data>\n  <data name=\"InvalidUri\" xml:space=\"preserve\">\n    <value>Invalid Uri</value>\n  </data>\n  <data name=\"liveStreamFoundAndRecoding\" xml:space=\"preserve\">\n    <value>Live Stream Found, Recoding...</value>\n  </data>\n  <data name=\"masterListFound\" xml:space=\"preserve\">\n    <value>Master List Found</value>\n  </data>\n  <data name=\"newerVerisonDownloaded\" xml:space=\"preserve\">\n    <value>Newer Found! Version: {0}! Downloaded, Please Replace Manually.</value>\n  </data>\n  <data name=\"newerVerisonDownloadFailed\" xml:space=\"preserve\">\n    <value>Newer Found! Version: {0}! Download Failed, Please Download Manually.</value>\n  </data>\n  <data name=\"newerVisionDetected\" xml:space=\"preserve\">\n    <value>Newer Found! Version: {0}! Try Downloading...</value>\n  </data>\n  <data name=\"notSupportMethod\" xml:space=\"preserve\">\n    <value>{0} Is Not Supported Yet, Ignore Decrypt, And Use Binary Merge</value>\n  </data>\n  <data name=\"parseExit\" xml:space=\"preserve\">\n    <value>Parse Only, Exit...</value>\n  </data>\n  <data name=\"parsingM3u8\" xml:space=\"preserve\">\n    <value>Parsing M3u8 Content</value>\n  </data>\n  <data name=\"partialMergingPleaseWait\" xml:space=\"preserve\">\n    <value>Segs Count &gt; 1800, Partial Merging...</value>\n  </data>\n  <data name=\"pressAnyKeyExit\" xml:space=\"preserve\">\n    <value>Press Any Key Exit.</value>\n  </data>\n  <data name=\"readingFileInfo\" xml:space=\"preserve\">\n    <value>Reading File Info...</value>\n  </data>\n  <data name=\"recordLimitReached\" xml:space=\"preserve\">\n    <value>Record Limit Reached!</value>\n  </data>\n  <data name=\"remuxToMPEGTS\" xml:space=\"preserve\">\n    <value>Re-Mux file to MPEG-TS：</value>\n  </data>\n  <data name=\"retryCount\" xml:space=\"preserve\">\n    <value>Retry Count </value>\n  </data>\n  <data name=\"savePath\" xml:space=\"preserve\">\n    <value>Save Path: </value>\n  </data>\n  <data name=\"segCount\" xml:space=\"preserve\">\n    <value>Original Count: </value>\n  </data>\n  <data name=\"selectedCount\" xml:space=\"preserve\">\n    <value>Selected Count: </value>\n  </data>\n  <data name=\"selectPlaylist\" xml:space=\"preserve\">\n    <value>Auto Selected Best Definition</value>\n  </data>\n  <data name=\"SomethingWasWrong\" xml:space=\"preserve\">\n    <value>Something Was Wrong!</value>\n  </data>\n  <data name=\"startDownloading\" xml:space=\"preserve\">\n    <value>Start Downloading</value>\n  </data>\n  <data name=\"startMerging\" xml:space=\"preserve\">\n    <value>Start Merging...</value>\n  </data>\n  <data name=\"startParsing\" xml:space=\"preserve\">\n    <value>Start Parsing </value>\n  </data>\n  <data name=\"startReParsing\" xml:space=\"preserve\">\n    <value>Start Re-Parsing...</value>\n  </data>\n  <data name=\"taskDone\" xml:space=\"preserve\">\n    <value>Task Done</value>\n  </data>\n  <data name=\"waitForCompletion\" xml:space=\"preserve\">\n    <value>Waiting For Completion...</value>\n  </data>\n  <data name=\"wrtingMasterMeta\" xml:space=\"preserve\">\n    <value>Writing Master List Json: [playLists.json]</value>\n  </data>\n  <data name=\"wrtingMeta\" xml:space=\"preserve\">\n    <value>Writing Json: [meta.json]</value>\n  </data>\n  <data name=\"startParsingMpd\" xml:space=\"preserve\">\n    <value>Start Parsing MPD Content...</value>\n  </data>\n  <data name=\"checkingLast\" xml:space=\"preserve\">\n    <value>Checking Whether The Last Fragment Is Valid...</value>\n  </data>\n  <data name=\"Help_workDir\" xml:space=\"preserve\">\n    <value>Set work dir (Video will be here)</value>\n  </data>\n  <data name=\"Help_saveName\" xml:space=\"preserve\">\n    <value>Set save name(Exclude extention)</value>\n  </data>\n  <data name=\"Help_input\" xml:space=\"preserve\">\n    <value>URL|File|JSON</value>\n  </data>\n  <data name=\"Help_baseUrl\" xml:space=\"preserve\">\n    <value>Set Baseurl</value>\n  </data>\n  <data name=\"Help_headers\" xml:space=\"preserve\">\n    <value>Set HTTP headers，format: key:value use | split all key&amp;value</value>\n  </data>\n  <data name=\"Help_maxThreads\" xml:space=\"preserve\">\n    <value>Set max thread</value>\n  </data>\n  <data name=\"Help_minThreads\" xml:space=\"preserve\">\n    <value>Set min thread</value>\n  </data>\n  <data name=\"Help_retryCount\" xml:space=\"preserve\">\n    <value>Set retry times</value>\n  </data>\n  <data name=\"Help_timeOut\" xml:space=\"preserve\">\n    <value>Set timeout for http request(second)</value>\n  </data>\n  <data name=\"Help_muxSetJson\" xml:space=\"preserve\">\n    <value>Set a json file for mux</value>\n  </data>\n  <data name=\"Help_useKeyFile\" xml:space=\"preserve\">\n    <value>Use 16 bytes file as KEY for AES-128 decryption</value>\n  </data>\n  <data name=\"Help_useKeyBase64\" xml:space=\"preserve\">\n    <value>Use Base64 String as KEY for AES-128 decryption</value>\n  </data>\n  <data name=\"Help_useKeyIV\" xml:space=\"preserve\">\n    <value>Use HEX String as IV for AES-128 decryption</value>\n  </data>\n  <data name=\"Help_downloadRange\" xml:space=\"preserve\">\n    <value>Set range for a video</value>\n  </data>\n  <data name=\"Help_liveRecDur\" xml:space=\"preserve\">\n    <value>When the live recording reaches this length, the software will exit automatically(HH:MM:SS)</value>\n  </data>\n  <data name=\"Help_stopSpeed\" xml:space=\"preserve\">\n    <value>Speed below this, retry(KB/s)</value>\n  </data>\n  <data name=\"Help_maxSpeed\" xml:space=\"preserve\">\n    <value>Set max download speed(KB/s)</value>\n  </data>\n  <data name=\"Help_proxyAddress\" xml:space=\"preserve\">\n    <value>Set HTTP/SOCKS5 Proxy, like http://127.0.0.1:8080</value>\n  </data>\n  <data name=\"Help_enableDelAfterDone\" xml:space=\"preserve\">\n    <value>Enable delete clips after download completed</value>\n  </data>\n  <data name=\"Help_enableMuxFastStart\" xml:space=\"preserve\">\n    <value>Enable fast start for mp4</value>\n  </data>\n  <data name=\"Help_enableBinaryMerge\" xml:space=\"preserve\">\n    <value>Enable use binary merge instead of ffmpeg</value>\n  </data>\n  <data name=\"Help_enableParseOnly\" xml:space=\"preserve\">\n    <value>Enable parse only mode</value>\n  </data>\n  <data name=\"Help_enableAudioOnly\" xml:space=\"preserve\">\n    <value>Enable only audio track when mux use ffmpeg</value>\n  </data>\n  <data name=\"Help_disableDateInfo\" xml:space=\"preserve\">\n    <value>Disable write date info when mux use ffmpeg</value>\n  </data>\n  <data name=\"Help_noMerge\" xml:space=\"preserve\">\n    <value>Disable auto merge</value>\n  </data>\n  <data name=\"Help_noProxy\" xml:space=\"preserve\">\n    <value>Disable use system proxy</value>\n  </data>\n  <data name=\"Help_disableIntegrityCheck\" xml:space=\"preserve\">\n    <value>Disable integrity check</value>\n  </data>\n  <data name=\"Help_registerUrlProtocol\" xml:space=\"preserve\">\n    <value>Register m3u8dl URL protocol</value>\n  </data>\n  <data name=\"Help_unregisterUrlProtocol\" xml:space=\"preserve\">\n    <value>Unregister m3u8dl URL protocol</value>\n  </data>\n  <data name=\"registerUrlProtocolFailed\" xml:space=\"preserve\">\n    <value>Register m3u8dl URL protocol failed!</value>\n  </data>\n  <data name=\"registerUrlProtocolSuccessful\" xml:space=\"preserve\">\n    <value>Register m3u8dl URL protocol successfully!</value>\n  </data>\n  <data name=\"unregisterUrlProtocolFailed\" xml:space=\"preserve\">\n    <value>Unregister m3u8dl URL protocol failed!</value>\n  </data>\n  <data name=\"unregisterUrlProtocolSuccessful\" xml:space=\"preserve\">\n    <value>Unregister m3u8dl URL protocol successfully!</value>\n  </data>\n</root>"
  },
  {
    "path": "N_m3u8DL-CLI/strings.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"binaryMergingPleaseWait\" xml:space=\"preserve\">\n    <value>二进制合并...请耐心等待</value>\n  </data>\n  <data name=\"disableIntegrityCheck\" xml:space=\"preserve\">\n    <value>已关闭完整性检查</value>\n  </data>\n  <data name=\"dolbyVisionContentMerging\" xml:space=\"preserve\">\n    <value>杜比视界内容，使用二进制合并...请耐心等待</value>\n  </data>\n  <data name=\"downloadComplete\" xml:space=\"preserve\">\n    <value>已下载完毕</value>\n  </data>\n  <data name=\"downloadedCount\" xml:space=\"preserve\">\n    <value>完成数量 </value>\n  </data>\n  <data name=\"downloadFailed\" xml:space=\"preserve\">\n    <value>下载失败, 程序退出</value>\n  </data>\n  <data name=\"downloadingExternalAudioTrack\" xml:space=\"preserve\">\n    <value>开始下载外挂音频...</value>\n  </data>\n  <data name=\"downloadingExternalSubtitleTrack\" xml:space=\"preserve\">\n    <value>开始下载外挂字幕...</value>\n  </data>\n  <data name=\"downloadingFirstSegement\" xml:space=\"preserve\">\n    <value>下载首分片...</value>\n  </data>\n  <data name=\"downloadingM3u8\" xml:space=\"preserve\">\n    <value>获取m3u8内容</value>\n  </data>\n  <data name=\"downloadingM3u8Key\" xml:space=\"preserve\">\n    <value>获取m3u8 key...</value>\n  </data>\n  <data name=\"downloadingMapFile\" xml:space=\"preserve\">\n    <value>下载MAP文件...</value>\n  </data>\n  <data name=\"ExitedCtrlC\" xml:space=\"preserve\">\n    <value>强制退出: Ctrl+C</value>\n  </data>\n  <data name=\"ExitedForce\" xml:space=\"preserve\">\n    <value>强制退出: 强制</value>\n  </data>\n  <data name=\"ffmpegDone\" xml:space=\"preserve\">\n    <value>结果输出至 [ffreport.log]</value>\n  </data>\n  <data name=\"ffmpegLost\" xml:space=\"preserve\">\n    <value>在PATH和程序路径下找不到 ffmpeg</value>\n  </data>\n  <data name=\"ffmpegMergingPleaseWait\" xml:space=\"preserve\">\n    <value>使用ffmpeg合并...请耐心等待</value>\n  </data>\n  <data name=\"ffmpegTip\" xml:space=\"preserve\">\n    <value>请下载ffmpeg.exe并把他放到程序同目录.</value>\n  </data>\n  <data name=\"fileDuration\" xml:space=\"preserve\">\n    <value>文件时长：</value>\n  </data>\n  <data name=\"fileName\" xml:space=\"preserve\">\n    <value>文件名称：</value>\n  </data>\n  <data name=\"hasExternalAudioTrack\" xml:space=\"preserve\">\n    <value>识别到外挂音频轨道</value>\n  </data>\n  <data name=\"hasExternalSubtitleTrack\" xml:space=\"preserve\">\n    <value>识别到外挂字幕轨道</value>\n  </data>\n  <data name=\"invalidM3u8\" xml:space=\"preserve\">\n    <value>无效的m3u8</value>\n  </data>\n  <data name=\"InvalidUri\" xml:space=\"preserve\">\n    <value>地址无效</value>\n  </data>\n  <data name=\"liveStreamFoundAndRecoding\" xml:space=\"preserve\">\n    <value>识别为直播流, 开始录制...</value>\n  </data>\n  <data name=\"masterListFound\" xml:space=\"preserve\">\n    <value>识别到大师列表</value>\n  </data>\n  <data name=\"newerVerisonDownloaded\" xml:space=\"preserve\">\n    <value>检测到更新，版本：{0}! 新版下载成功，请您自行替换</value>\n  </data>\n  <data name=\"newerVerisonDownloadFailed\" xml:space=\"preserve\">\n    <value>检测到更新，版本：{0}! 新版下载失败，请您自行下载</value>\n  </data>\n  <data name=\"newerVisionDetected\" xml:space=\"preserve\">\n    <value>检测到更新，版本：{0}! 正在尝试自动下载新版</value>\n  </data>\n  <data name=\"notSupportMethod\" xml:space=\"preserve\">\n    <value>不支持{0}加密方式,将不被处理,且强制开启二进制合并</value>\n  </data>\n  <data name=\"parseExit\" xml:space=\"preserve\">\n    <value>解析m3u8成功, 程序退出</value>\n  </data>\n  <data name=\"parsingM3u8\" xml:space=\"preserve\">\n    <value>解析m3u8内容</value>\n  </data>\n  <data name=\"partialMergingPleaseWait\" xml:space=\"preserve\">\n    <value>分片大于1800个，执行分部合并中...</value>\n  </data>\n  <data name=\"pressAnyKeyExit\" xml:space=\"preserve\">\n    <value>按任意键退出.</value>\n  </data>\n  <data name=\"readingFileInfo\" xml:space=\"preserve\">\n    <value>读取文件信息...</value>\n  </data>\n  <data name=\"recordLimitReached\" xml:space=\"preserve\">\n    <value>录制已到达限定长度</value>\n  </data>\n  <data name=\"remuxToMPEGTS\" xml:space=\"preserve\">\n    <value>将文件转换到 MPEG-TS 封装：</value>\n  </data>\n  <data name=\"retryCount\" xml:space=\"preserve\">\n    <value>重试次数 </value>\n  </data>\n  <data name=\"savePath\" xml:space=\"preserve\">\n    <value>存储路径：</value>\n  </data>\n  <data name=\"segCount\" xml:space=\"preserve\">\n    <value>总分片：</value>\n  </data>\n  <data name=\"selectedCount\" xml:space=\"preserve\">\n    <value>已选择分片：</value>\n  </data>\n  <data name=\"selectPlaylist\" xml:space=\"preserve\">\n    <value>已自动选择最高清晰度</value>\n  </data>\n  <data name=\"SomethingWasWrong\" xml:space=\"preserve\">\n    <value>遇到了某些错误!</value>\n  </data>\n  <data name=\"startDownloading\" xml:space=\"preserve\">\n    <value>开始下载文件</value>\n  </data>\n  <data name=\"startMerging\" xml:space=\"preserve\">\n    <value>开始合并分片...</value>\n  </data>\n  <data name=\"startParsing\" xml:space=\"preserve\">\n    <value>开始解析 </value>\n  </data>\n  <data name=\"startReParsing\" xml:space=\"preserve\">\n    <value>重新解析m3u8...</value>\n  </data>\n  <data name=\"taskDone\" xml:space=\"preserve\">\n    <value>任务结束</value>\n  </data>\n  <data name=\"waitForCompletion\" xml:space=\"preserve\">\n    <value>等待下载完成...</value>\n  </data>\n  <data name=\"wrtingMasterMeta\" xml:space=\"preserve\">\n    <value>写出playLists.json</value>\n  </data>\n  <data name=\"wrtingMeta\" xml:space=\"preserve\">\n    <value>写出meta.json</value>\n  </data>\n  <data name=\"startParsingMpd\" xml:space=\"preserve\">\n    <value>开始解析MPD内容...</value>\n  </data>\n  <data name=\"checkingLast\" xml:space=\"preserve\">\n    <value>正在判断尾分片是否有效...</value>\n  </data>\n  <data name=\"Help_workDir\" xml:space=\"preserve\">\n    <value>设定程序工作目录</value>\n  </data>\n  <data name=\"Help_saveName\" xml:space=\"preserve\">\n    <value>设定存储文件名(不包括后缀)</value>\n  </data>\n  <data name=\"Help_input\" xml:space=\"preserve\">\n    <value>链接或文件</value>\n  </data>\n  <data name=\"Help_baseUrl\" xml:space=\"preserve\">\n    <value>设定Baseurl</value>\n  </data>\n  <data name=\"Help_headers\" xml:space=\"preserve\">\n    <value>设定请求头，格式 key:value 使用|分割不同的key&amp;value</value>\n  </data>\n  <data name=\"Help_maxThreads\" xml:space=\"preserve\">\n    <value>设定程序的最大线程数</value>\n  </data>\n  <data name=\"Help_minThreads\" xml:space=\"preserve\">\n    <value>设定程序的最小线程数</value>\n  </data>\n  <data name=\"Help_retryCount\" xml:space=\"preserve\">\n    <value>设定程序的重试次数</value>\n  </data>\n  <data name=\"Help_timeOut\" xml:space=\"preserve\">\n    <value>设定程序网络请求的超时时间(单位为秒)</value>\n  </data>\n  <data name=\"Help_muxSetJson\" xml:space=\"preserve\">\n    <value>使用外部json文件定义混流选项</value>\n  </data>\n  <data name=\"Help_useKeyFile\" xml:space=\"preserve\">\n    <value>使用外部16字节文件定义AES-128解密KEY</value>\n  </data>\n  <data name=\"Help_useKeyBase64\" xml:space=\"preserve\">\n    <value>使用Base64字符串定义AES-128解密KEY</value>\n  </data>\n  <data name=\"Help_useKeyIV\" xml:space=\"preserve\">\n    <value>使用HEX字符串定义AES-128解密IV</value>\n  </data>\n  <data name=\"Help_downloadRange\" xml:space=\"preserve\">\n    <value>仅下载视频的一部分分片或长度</value>\n  </data>\n  <data name=\"Help_liveRecDur\" xml:space=\"preserve\">\n    <value>直播录制时，达到此长度自动退出软件(HH:MM:SS)</value>\n  </data>\n  <data name=\"Help_stopSpeed\" xml:space=\"preserve\">\n    <value>当速度低于此值时，重试(单位为KB/s)</value>\n  </data>\n  <data name=\"Help_maxSpeed\" xml:space=\"preserve\">\n    <value>设置下载速度上限(单位为KB/s)</value>\n  </data>\n  <data name=\"Help_proxyAddress\" xml:space=\"preserve\">\n    <value>设置HTTP/SOCKS5代理, 如 http://127.0.0.1:8080</value>\n  </data>\n  <data name=\"Help_enableDelAfterDone\" xml:space=\"preserve\">\n    <value>开启下载后删除临时文件夹的功能</value>\n  </data>\n  <data name=\"Help_enableMuxFastStart\" xml:space=\"preserve\">\n    <value>开启混流mp4的FastStart特性</value>\n  </data>\n  <data name=\"Help_enableBinaryMerge\" xml:space=\"preserve\">\n    <value>开启二进制合并分片</value>\n  </data>\n  <data name=\"Help_enableParseOnly\" xml:space=\"preserve\">\n    <value>开启仅解析模式(程序只进行到meta.json)</value>\n  </data>\n  <data name=\"Help_enableAudioOnly\" xml:space=\"preserve\">\n    <value>合并时仅封装音频轨道</value>\n  </data>\n  <data name=\"Help_disableDateInfo\" xml:space=\"preserve\">\n    <value>关闭混流中的日期写入</value>\n  </data>\n  <data name=\"Help_noMerge\" xml:space=\"preserve\">\n    <value>禁用自动合并</value>\n  </data>\n  <data name=\"Help_noProxy\" xml:space=\"preserve\">\n    <value>不自动使用系统代理</value>\n  </data>\n  <data name=\"Help_disableIntegrityCheck\" xml:space=\"preserve\">\n    <value>不检测分片数量是否完整</value>\n  </data>\n  <data name=\"Help_registerUrlProtocol\" xml:space=\"preserve\">\n    <value>注册m3u8dl链接协议</value>\n  </data>\n  <data name=\"Help_unregisterUrlProtocol\" xml:space=\"preserve\">\n    <value>取消注册m3u8dl链接协议</value>\n  </data>\n  <data name=\"registerUrlProtocolFailed\" xml:space=\"preserve\">\n    <value>注册m3u8dl链接协议失败！</value>\n  </data>\n  <data name=\"registerUrlProtocolSuccessful\" xml:space=\"preserve\">\n    <value>注册m3u8dl链接协议成功！</value>\n  </data>\n  <data name=\"unregisterUrlProtocolFailed\" xml:space=\"preserve\">\n    <value>取消注册m3u8dl链接协议失败！</value>\n  </data>\n  <data name=\"unregisterUrlProtocolSuccessful\" xml:space=\"preserve\">\n    <value>取消注册m3u8dl链接协议成功！</value>\n  </data>\n</root>"
  },
  {
    "path": "N_m3u8DL-CLI/strings.zh-TW.Designer.cs",
    "content": ""
  },
  {
    "path": "N_m3u8DL-CLI/strings.zh-TW.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"binaryMergingPleaseWait\" xml:space=\"preserve\">\n    <value>二進制合並...請耐心等待</value>\n  </data>\n  <data name=\"disableIntegrityCheck\" xml:space=\"preserve\">\n    <value>已關閉完整性檢查</value>\n  </data>\n  <data name=\"dolbyVisionContentMerging\" xml:space=\"preserve\">\n    <value>杜比視界內容，使用二進制合並...請耐心等待</value>\n  </data>\n  <data name=\"downloadComplete\" xml:space=\"preserve\">\n    <value>已下載完畢</value>\n  </data>\n  <data name=\"downloadedCount\" xml:space=\"preserve\">\n    <value>完成數量 </value>\n  </data>\n  <data name=\"downloadFailed\" xml:space=\"preserve\">\n    <value>下載失敗, 程序退出</value>\n  </data>\n  <data name=\"downloadingExternalAudioTrack\" xml:space=\"preserve\">\n    <value>開始下載外掛音頻...</value>\n  </data>\n  <data name=\"downloadingExternalSubtitleTrack\" xml:space=\"preserve\">\n    <value>開始下載外掛字幕...</value>\n  </data>\n  <data name=\"downloadingFirstSegement\" xml:space=\"preserve\">\n    <value>下載首分片...</value>\n  </data>\n  <data name=\"downloadingM3u8\" xml:space=\"preserve\">\n    <value>獲取m3u8內容</value>\n  </data>\n  <data name=\"downloadingM3u8Key\" xml:space=\"preserve\">\n    <value>獲取m3u8 key...</value>\n  </data>\n  <data name=\"downloadingMapFile\" xml:space=\"preserve\">\n    <value>下載MAP文件...</value>\n  </data>\n  <data name=\"ExitedCtrlC\" xml:space=\"preserve\">\n    <value>強制退出: Ctrl+C</value>\n  </data>\n  <data name=\"ExitedForce\" xml:space=\"preserve\">\n    <value>強制退出: 強制</value>\n  </data>\n  <data name=\"ffmpegDone\" xml:space=\"preserve\">\n    <value>結果輸出至 [ffreport.log]</value>\n  </data>\n  <data name=\"ffmpegLost\" xml:space=\"preserve\">\n    <value>在PATH和程序路徑下找不到 ffmpeg</value>\n  </data>\n  <data name=\"ffmpegMergingPleaseWait\" xml:space=\"preserve\">\n    <value>使用ffmpeg合並...請耐心等待</value>\n  </data>\n  <data name=\"ffmpegTip\" xml:space=\"preserve\">\n    <value>請下載ffmpeg.exe並把他放到程序同目錄.</value>\n  </data>\n  <data name=\"fileDuration\" xml:space=\"preserve\">\n    <value>文件時長：</value>\n  </data>\n  <data name=\"fileName\" xml:space=\"preserve\">\n    <value>文件名稱：</value>\n  </data>\n  <data name=\"hasExternalAudioTrack\" xml:space=\"preserve\">\n    <value>識別到外掛音頻軌道</value>\n  </data>\n  <data name=\"hasExternalSubtitleTrack\" xml:space=\"preserve\">\n    <value>識別到外掛字幕軌道</value>\n  </data>\n  <data name=\"invalidM3u8\" xml:space=\"preserve\">\n    <value>無效的m3u8</value>\n  </data>\n  <data name=\"InvalidUri\" xml:space=\"preserve\">\n    <value>地址無效</value>\n  </data>\n  <data name=\"liveStreamFoundAndRecoding\" xml:space=\"preserve\">\n    <value>識別為直播流, 開始錄制...</value>\n  </data>\n  <data name=\"masterListFound\" xml:space=\"preserve\">\n    <value>識別到大師列表</value>\n  </data>\n  <data name=\"newerVerisonDownloaded\" xml:space=\"preserve\">\n    <value>檢測到更新，版本：{0}! 新版下載成功，請您自行替換</value>\n  </data>\n  <data name=\"newerVerisonDownloadFailed\" xml:space=\"preserve\">\n    <value>檢測到更新，版本：{0}! 新版下載失敗，請您自行下載</value>\n  </data>\n  <data name=\"newerVisionDetected\" xml:space=\"preserve\">\n    <value>檢測到更新，版本：{0}! 正在嘗試自動下載新版</value>\n  </data>\n  <data name=\"notSupportMethod\" xml:space=\"preserve\">\n    <value>不支持{0}加密方式,將不被處理,且強制開啟二進制合並</value>\n  </data>\n  <data name=\"parseExit\" xml:space=\"preserve\">\n    <value>解析m3u8成功, 程序退出</value>\n  </data>\n  <data name=\"parsingM3u8\" xml:space=\"preserve\">\n    <value>解析m3u8內容</value>\n  </data>\n  <data name=\"partialMergingPleaseWait\" xml:space=\"preserve\">\n    <value>分片大於1800個，執行分部合並中...</value>\n  </data>\n  <data name=\"pressAnyKeyExit\" xml:space=\"preserve\">\n    <value>按任意鍵退出.</value>\n  </data>\n  <data name=\"readingFileInfo\" xml:space=\"preserve\">\n    <value>讀取文件信息...</value>\n  </data>\n  <data name=\"recordLimitReached\" xml:space=\"preserve\">\n    <value>錄制已到達限定長度</value>\n  </data>\n  <data name=\"remuxToMPEGTS\" xml:space=\"preserve\">\n    <value>將文件轉換到 MPEG-TS 封裝：</value>\n  </data>\n  <data name=\"retryCount\" xml:space=\"preserve\">\n    <value>重試次數 </value>\n  </data>\n  <data name=\"savePath\" xml:space=\"preserve\">\n    <value>存儲路徑：</value>\n  </data>\n  <data name=\"segCount\" xml:space=\"preserve\">\n    <value>總分片：</value>\n  </data>\n  <data name=\"selectedCount\" xml:space=\"preserve\">\n    <value>已選擇分片：</value>\n  </data>\n  <data name=\"selectPlaylist\" xml:space=\"preserve\">\n    <value>已自動選擇最高清晰度</value>\n  </data>\n  <data name=\"SomethingWasWrong\" xml:space=\"preserve\">\n    <value>遇到了某些錯誤!</value>\n  </data>\n  <data name=\"startDownloading\" xml:space=\"preserve\">\n    <value>開始下載文件</value>\n  </data>\n  <data name=\"startMerging\" xml:space=\"preserve\">\n    <value>開始合並分片...</value>\n  </data>\n  <data name=\"startParsing\" xml:space=\"preserve\">\n    <value>開始解析 </value>\n  </data>\n  <data name=\"startReParsing\" xml:space=\"preserve\">\n    <value>重新解析m3u8...</value>\n  </data>\n  <data name=\"taskDone\" xml:space=\"preserve\">\n    <value>任務結束</value>\n  </data>\n  <data name=\"waitForCompletion\" xml:space=\"preserve\">\n    <value>等待下載完成...</value>\n  </data>\n  <data name=\"wrtingMasterMeta\" xml:space=\"preserve\">\n    <value>寫出playLists.json</value>\n  </data>\n  <data name=\"wrtingMeta\" xml:space=\"preserve\">\n    <value>寫出meta.json</value>\n  </data>\n  <data name=\"startParsingMpd\" xml:space=\"preserve\">\n    <value>開始解析MPD內容...</value>\n  </data>\n  <data name=\"checkingLast\" xml:space=\"preserve\">\n    <value>正在判斷尾分片是否有效...</value>\n  </data>\n  <data name=\"Help_workDir\" xml:space=\"preserve\">\n    <value>設定程式工作目錄</value>\n  </data>\n  <data name=\"Help_saveName\" xml:space=\"preserve\">\n    <value>設定存儲文件名(不包括後綴)</value>\n  </data>\n  <data name=\"Help_input\" xml:space=\"preserve\">\n    <value>連結或檔案</value>\n  </data>\n  <data name=\"Help_baseUrl\" xml:space=\"preserve\">\n    <value>設定Baseurl</value>\n  </data>\n  <data name=\"Help_headers\" xml:space=\"preserve\">\n    <value>設定請求頭，格式 key:value 使用|分割不同的key&amp;value</value>\n  </data>\n  <data name=\"Help_maxThreads\" xml:space=\"preserve\">\n    <value>設定程式的最大線程數</value>\n  </data>\n  <data name=\"Help_minThreads\" xml:space=\"preserve\">\n    <value>設定程式的最小線程數</value>\n  </data>\n  <data name=\"Help_retryCount\" xml:space=\"preserve\">\n    <value>設定程式的重試次數</value>\n  </data>\n  <data name=\"Help_timeOut\" xml:space=\"preserve\">\n    <value>設定程式網絡請求的超時時間(單位為秒)</value>\n  </data>\n  <data name=\"Help_muxSetJson\" xml:space=\"preserve\">\n    <value>使用外部json文件定義混流選項</value>\n  </data>\n  <data name=\"Help_useKeyFile\" xml:space=\"preserve\">\n    <value>使用外部16字節文件定義AES-128解密KEY</value>\n  </data>\n  <data name=\"Help_useKeyBase64\" xml:space=\"preserve\">\n    <value>使用Base64字符串定義AES-128解密KEY</value>\n  </data>\n  <data name=\"Help_useKeyIV\" xml:space=\"preserve\">\n    <value>使用HEX字符串定義AES-128解密IV</value>\n  </data>\n  <data name=\"Help_downloadRange\" xml:space=\"preserve\">\n    <value>僅下載視頻的壹部分分片或長度</value>\n  </data>\n  <data name=\"Help_liveRecDur\" xml:space=\"preserve\">\n    <value>直播錄制時，達到此長度自動退出軟件(HH:MM:SS)</value>\n  </data>\n  <data name=\"Help_stopSpeed\" xml:space=\"preserve\">\n    <value>當速度低於此值時，重試(單位為KB/s)</value>\n  </data>\n  <data name=\"Help_maxSpeed\" xml:space=\"preserve\">\n    <value>設置下載速度上限(單位為KB/s)</value>\n  </data>\n  <data name=\"Help_proxyAddress\" xml:space=\"preserve\">\n    <value>設置HTTP/SOCKS5代理, 如 http://127.0.0.1:8080</value>\n  </data>\n  <data name=\"Help_enableDelAfterDone\" xml:space=\"preserve\">\n    <value>開啟下載後刪除臨時文件夾的功能</value>\n  </data>\n  <data name=\"Help_enableMuxFastStart\" xml:space=\"preserve\">\n    <value>開啟混流mp4的FastStart特性</value>\n  </data>\n  <data name=\"Help_enableBinaryMerge\" xml:space=\"preserve\">\n    <value>開啟二進制合並分片</value>\n  </data>\n  <data name=\"Help_enableParseOnly\" xml:space=\"preserve\">\n    <value>開啟僅解析模式(程式只進行到meta.json)</value>\n  </data>\n  <data name=\"Help_enableAudioOnly\" xml:space=\"preserve\">\n    <value>合並時僅封裝音頻軌道</value>\n  </data>\n  <data name=\"Help_disableDateInfo\" xml:space=\"preserve\">\n    <value>關閉混流中的日期寫入</value>\n  </data>\n  <data name=\"Help_noMerge\" xml:space=\"preserve\">\n    <value>禁用自動合並</value>\n  </data>\n  <data name=\"Help_noProxy\" xml:space=\"preserve\">\n    <value>不自動使用系統代理</value>\n  </data>\n  <data name=\"Help_disableIntegrityCheck\" xml:space=\"preserve\">\n    <value>不檢測分片數量是否完整</value>\n  </data>\n  <data name=\"Help_registerUrlProtocol\" xml:space=\"preserve\">\n    <value>注册m3u8dl連結協定</value>\n  </data>\n  <data name=\"Help_unregisterUrlProtocol\" xml:space=\"preserve\">\n    <value>取消注册m3u8dl連結協定</value>\n  </data>\n  <data name=\"registerUrlProtocolFailed\" xml:space=\"preserve\">\n    <value>注册m3u8dl連結協定失敗！</value>\n  </data>\n  <data name=\"registerUrlProtocolSuccessful\" xml:space=\"preserve\">\n    <value>注册m3u8dl連結協定成功！</value>\n  </data>\n  <data name=\"unregisterUrlProtocolFailed\" xml:space=\"preserve\">\n    <value>取消注册m3u8dl連結協定失敗！</value>\n  </data>\n  <data name=\"unregisterUrlProtocolSuccessful\" xml:space=\"preserve\">\n    <value>取消注册m3u8dl連結協定成功！</value>\n  </data>\n</root>"
  },
  {
    "path": "N_m3u8DL-CLI.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.29215.179\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"N_m3u8DL-CLI\", \"N_m3u8DL-CLI\\N_m3u8DL-CLI.csproj\", \"{4FB61439-B738-46AC-B3AF-2BF72150D057}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{4FB61439-B738-46AC-B3AF-2BF72150D057}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4FB61439-B738-46AC-B3AF-2BF72150D057}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4FB61439-B738-46AC-B3AF-2BF72150D057}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4FB61439-B738-46AC-B3AF-2BF72150D057}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {82B9270D-B7B2-4591-BF8A-5B4EBCD0EA8A}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "README.md",
    "content": "```\n\n███╗   ██╗        ███╗   ███╗██████╗ ██╗   ██╗ █████╗ ██████╗ ██╗       ██████╗██╗     ██╗\n████╗  ██║        ████╗ ████║╚════██╗██║   ██║██╔══██╗██╔══██╗██║      ██╔════╝██║     ██║\n██╔██╗ ██║        ██╔████╔██║ █████╔╝██║   ██║╚█████╔╝██║  ██║██║█████╗██║     ██║     ██║\n██║╚██╗██║        ██║╚██╔╝██║ ╚═══██╗██║   ██║██╔══██╗██║  ██║██║╚════╝██║     ██║     ██║\n██║ ╚████║███████╗██║ ╚═╝ ██║██████╔╝╚██████╔╝╚█████╔╝██████╔╝███████╗ ╚██████╗███████╗██║\n╚═╝  ╚═══╝╚══════╝╚═╝     ╚═╝╚═════╝  ╚═════╝  ╚════╝ ╚═════╝ ╚══════╝  ╚═════╝╚══════╝╚═╝\n                                                                                          \n```\n---\n[![img](https://img.shields.io/github/stars/nilaoda/N_m3u8DL-CLI?label=%E7%82%B9%E8%B5%9E)](https://github.com/nilaoda/N_m3u8DL-CLI)  [![img](https://img.shields.io/github/last-commit/nilaoda/N_m3u8DL-CLI?label=%E6%9C%80%E8%BF%91%E6%8F%90%E4%BA%A4)](https://github.com/nilaoda/N_m3u8DL-CLI)  [![img](https://img.shields.io/github/release/nilaoda/N_m3u8DL-CLI?label=%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC)](https://github.com/nilaoda/N_m3u8DL-CLI/releases)  [![img](https://img.shields.io/github/license/nilaoda/N_m3u8DL-CLI?label=%E8%AE%B8%E5%8F%AF%E8%AF%81)](https://github.com/nilaoda/N_m3u8DL-CLI)  [![img](https://img.shields.io/badge/URL-%E7%94%A8%E6%88%B7%E6%96%87%E6%A1%A3-blue)](https://nilaoda.github.io/N_m3u8DL-CLI/)\n\n\n# [ENGLISH VERSION](https://github.com/nilaoda/N_m3u8DL-CLI/blob/master/README_ENG.md)\n\n# 下载使用\n* 发行版: https://github.com/nilaoda/N_m3u8DL-CLI/releases\n* 自动构建版`(供测试)`: https://github.com/nilaoda/N_m3u8DL-CLI/actions\n \n# 关于开源\n本项目已于2019年10月9日开源，采用MIT许可证，各取所需。\n\n# 关于跨平台\n* N_m3u8DL-CLI `(本项目)`: 基于 .NET Framework, 不具备跨平台能力. 目前已进入维护阶段.\n\n* [N_m3u8DL-RE](https://github.com/nilaoda/N_m3u8DL-RE) : 抛弃历史包袱从零做起, 支持Win/Linux/Mac, 更丰富的功能会在这里出现 ...\n\n# N_m3u8DL-CLI\n一个**简单易用的**m3u8下载器，下载地址：https://github.com/nilaoda/N_m3u8DL-CLI/releases  \n\n支持下载m3u8链接或文件为`mp4`或`ts`格式，并提供丰富的命令行选项。\n  * **不支持**优酷视频解密\n  * **不支持**气球云视频解密\n  * 支持`AES-128-CBC`加密自动解密\n  * 支持多线程下载\n  * 支持下载限速\n  * 支持断点续传\n  * 支持`Master List`\n  * 支持直播流录制(`BETA`)\n  * 支持自定义`HTTP Headers`\n  * 支持自动合并 (二进制合并或使用ffmpeg合并)\n  * 支持选择下载`m3u8`中的指定时间段/分片内容\n  * 支持下载路径为网络驱动器的情况\n  * 支持下载外挂字幕轨道、音频轨道\n  * 支持仅合并为音频\n  * 支持设置特定http代理\n  * 支持自动使用系统代理（默认行为, 可禁止）\n  * 支持m3u8dl链接协议（通过web链接调用本机客户端）\n  * 提供SimpleG简易的`GUI`生成常用参数\n\n\n\n![运行截图](https://nilaoda.github.io/N_m3u8DL-CLI/source/images/%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8.gif)  \n\n# 命令行选项\n```\nN_m3u8DL-CLI\n\nUSAGE:\n\n  N_m3u8DL-CLI <URL|JSON|FILE> [OPTIONS]\n\nOPTIONS:\n\n  --workDir                  设定程序工作目录\n  --saveName                 设定存储文件名(不包括后缀)\n  --baseUrl                  设定Baseurl\n  --headers                  设定请求头，格式 key:value 使用|分割不同的key&value\n  --maxThreads               (Default: 32) 设定程序的最大线程数\n  --minThreads               (Default: 16) 设定程序的最小线程数\n  --retryCount               (Default: 15) 设定程序的重试次数\n  --timeOut                  (Default: 10) 设定程序网络请求的超时时间(单位为秒)\n  --muxSetJson               使用外部json文件定义混流选项\n  --useKeyFile               使用外部16字节文件定义AES-128解密KEY\n  --useKeyBase64             使用Base64字符串定义AES-128解密KEY\n  --useKeyIV                 使用HEX字符串定义AES-128解密IV\n  --downloadRange            仅下载视频的一部分分片或长度\n  --liveRecDur               直播录制时，达到此长度自动退出软件(HH:MM:SS)\n  --stopSpeed                当速度低于此值时，重试(单位为KB/s)\n  --maxSpeed                 设置下载速度上限(单位为KB/s)\n  --proxyAddress             设置HTTP/SOCKS5代理, 如 http://127.0.0.1:8080\n  --enableDelAfterDone       开启下载后删除临时文件夹的功能\n  --enableMuxFastStart       开启混流mp4的FastStart特性\n  --enableBinaryMerge        开启二进制合并分片\n  --enableParseOnly          开启仅解析模式(程序只进行到meta.json)\n  --enableAudioOnly          合并时仅封装音频轨道\n  --disableDateInfo          关闭混流中的日期写入\n  --disableIntegrityCheck    不检测分片数量是否完整\n  --noMerge                  禁用自动合并\n  --noProxy                  不自动使用系统代理\n  --registerUrlProtocol      注册m3u8dl链接协议\n  --unregisterUrlProtocol    取消注册m3u8dl链接协议\n  --enableChaCha20           enableChaCha20\n  --chaCha20KeyBase64        ChaCha20KeyBase64\n  --chaCha20NonceBase64      ChaCha20NonceBase64\n  --help                     Display this help screen.\n  --version                  Display version information.\n```\n\n# 关于`m3u8dl://`协议\n新增命令行参数：\n```\n--registerUrlProtocol          注册m3u8dl链接协议\n--unregisterUrlProtocol     取消注册m3u8dl链接协议\n```\n\nURI格式：\n```\nm3u8dl://<base64编码的客户端命令行文本>\n```\n\nURI示例：\n```\nm3u8dl://Imh0dHBzOi8vZXhhbXBsZS5jb20vYWJjLm0zdTgiIC0td29ya0RpciAiJVVTRVJQUk9GSUxFJVxEb3dubG9hZHNcbTN1OGRsIiAtLXNhdmVOYW1lICJhYmMiIC0tZW5hYmxlRGVsQWZ0ZXJEb25lIC0tZGlzYWJsZURhdGVJbmZvIC0tbm9Qcm94eQ==\n```\n\nURI解码结果：\n```\n\"https://example.com/abc.m3u8\" --workDir \"%USERPROFILE%\\Downloads\\m3u8dl\" --saveName \"abc\" --enableDelAfterDone --disableDateInfo --noProxy\n```\n\n# 用户文档\nhttps://nilaoda.github.io/N_m3u8DL-CLI/\n\n# 聊聊\nhttps://discord.gg/SSGwKrjC44\n\n# 赞赏\n![Wow](https://nilaoda.github.io/N_m3u8DL-CLI/source/images/alipay.png)\n"
  },
  {
    "path": "README_ENG.md",
    "content": "```\n\n███╗   ██╗        ███╗   ███╗██████╗ ██╗   ██╗ █████╗ ██████╗ ██╗       ██████╗██╗     ██╗\n████╗  ██║        ████╗ ████║╚════██╗██║   ██║██╔══██╗██╔══██╗██║      ██╔════╝██║     ██║\n██╔██╗ ██║        ██╔████╔██║ █████╔╝██║   ██║╚█████╔╝██║  ██║██║█████╗██║     ██║     ██║\n██║╚██╗██║        ██║╚██╔╝██║ ╚═══██╗██║   ██║██╔══██╗██║  ██║██║╚════╝██║     ██║     ██║\n██║ ╚████║███████╗██║ ╚═╝ ██║██████╔╝╚██████╔╝╚█████╔╝██████╔╝███████╗ ╚██████╗███████╗██║\n╚═╝  ╚═══╝╚══════╝╚═╝     ╚═╝╚═════╝  ╚═════╝  ╚════╝ ╚═════╝ ╚══════╝  ╚═════╝╚══════╝╚═╝\n                                                                                          \n```\nThis is an m3u8 downloader.  \n## Summary\nSupports: \n  * Auto decrypt for `AES-128-CBC`\n  * `Master List`\n  * Live stream recording(`BETA`)\n  * Customize HTTP headers\n  * Auto merge clips(Binary or ffmpeg)\n  * Select save clip by `time code` or `index`\n  * Network driver on Windows OS\n  * Alternative audio/video track\n  * Mux without video track\n  * Custom HTTP proxy or Use system proxy\n  * Optimization for Chinese streaming platforms\n  \n  ![ScreenShot](https://nilaoda.github.io/N_m3u8DL-CLI/source/images/%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8.gif)  \n  \n## GUI\n  * Easy-to-use `GUI`\n  \n## Options\n```\nN_m3u8DL-CLI\n\nUSAGE:\n\n  N_m3u8DL-CLI <URL|JSON|FILE> [OPTIONS]\n\nOPTIONS:\n\n  --workDir                  Set work dir (Video will be here)\n  --saveName                 Set save name(Exclude extention)\n  --baseUrl                  Set Baseurl\n  --headers                  Set HTTP headers，format: key:value use | split all\n                             key&value\n  --maxThreads               (Default: 32) Set max thread\n  --minThreads               (Default: 16) Set min thread\n  --retryCount               (Default: 15) Set retry times\n  --timeOut                  (Default: 10) Set timeout for http request(second)\n  --muxSetJson               Set a json file for mux\n  --useKeyFile               Use 16 bytes file as KEY for AES-128 decryption\n  --useKeyBase64             Use Base64 String as KEY for AES-128 decryption\n  --useKeyIV                 Use HEX String as IV for AES-128 decryption\n  --downloadRange            Set range for a video\n  --liveRecDur               When the live recording reaches this length, the\n                             software will exit automatically(HH:MM:SS)\n  --stopSpeed                Speed below this, retry(KB/s)\n  --maxSpeed                 Set max download speed(KB/s)\n  --proxyAddress             Set HTTP/SOCKS5 Proxy, like http://127.0.0.1:8080\n  --enableDelAfterDone       Enable delete clips after download completed\n  --enableMuxFastStart       Enable fast start for mp4\n  --enableBinaryMerge        Enable use binary merge instead of ffmpeg\n  --enableParseOnly          Enable parse only mode\n  --enableAudioOnly          Enable only audio track when mux use ffmpeg\n  --disableDateInfo          Disable write date info when mux use ffmpeg\n  --disableIntegrityCheck    Disable integrity check\n  --noMerge                  Disable auto merge\n  --noProxy                  Disable use system proxy\n  --registerUrlProtocol      Register m3u8dl URL protocol\n  --unregisterUrlProtocol    Unregister m3u8dl URL protocol\n  --enableChaCha20           enableChaCha20\n  --chaCha20KeyBase64        ChaCha20KeyBase64\n  --chaCha20NonceBase64      ChaCha20NonceBase64\n  --help                     Display this help screen.\n  --version                  Display version information.\n```\n\n## About `m3u8dl://`\nNew commandline options：\n```\n--registerUrlProtocol          Register m3u8dl URL protocol\n--unregisterUrlProtocol        Unregister m3u8dl URL protocol\n```\n\nURI Format：\n```\nm3u8dl://<base64 encoded params>\n```\n\nURI Example：\n```\nm3u8dl://Imh0dHBzOi8vZXhhbXBsZS5jb20vYWJjLm0zdTgiIC0td29ya0RpciAiJVVTRVJQUk9GSUxFJVxEb3dubG9hZHNcbTN1OGRsIiAtLXNhdmVOYW1lICJhYmMiIC0tZW5hYmxlRGVsQWZ0ZXJEb25lIC0tZGlzYWJsZURhdGVJbmZvIC0tbm9Qcm94eQ==\n```\n\nURI Decode Result：\n```\n\"https://example.com/abc.m3u8\" --workDir \"%USERPROFILE%\\Downloads\\m3u8dl\" --saveName \"abc\" --enableDelAfterDone --disableDateInfo --noProxy\n```\n\n## Document\nhttps://nilaoda.github.io/N_m3u8DL-CLI/\n\n## Chit-chat\nhttps://discord.gg/RscAJZv3Yq\n"
  },
  {
    "path": "docs/Advanced.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>命令行参数 · N_m3u8DL-CLI文档</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"nilaoda\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-donate/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-highlight/website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"SimpleGUI.html\" />\n    \n    \n\n    <style>\n    @media only screen and (max-width: 640px) {\n        .book-header .hidden-mobile {\n            display: none;\n        }\n    }\n    </style>\n    <script>\n        window[\"gitbook-plugin-github-buttons\"] = {\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]};\n    </script>\n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" >\n            \n                <span>\n            \n                    \n                    简介\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"2.1\" >\n            \n                <span>\n            \n                    \n                    入门\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"2.1.1\" data-path=\"Introductory.html\">\n            \n                <a href=\"Introductory.html\">\n            \n                    \n                    使用入门\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"3.1\" >\n            \n                <span>\n            \n                    \n                    进阶\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"3.1.1\" data-path=\"Advanced.html\">\n            \n                <a href=\"Advanced.html\">\n            \n                    \n                    命令行参数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"3.1.2\" data-path=\"SimpleGUI.html\">\n            \n                <a href=\"SimpleGUI.html\">\n            \n                    \n                    SimpleGUI\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"4.1\" >\n            \n                <span>\n            \n                    \n                    辅助\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"4.1.1\" data-path=\"GetM3u8.html\">\n            \n                <a href=\"GetM3u8.html\">\n            \n                    \n                    JS获取m3u8\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"4.1.2\" data-path=\"M3U8URL2File.html\">\n            \n                <a href=\"M3U8URL2File.html\">\n            \n                    \n                    M3U8URL2File\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >命令行参数</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <h1 id=\"&#x4F7F;&#x7528;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;\">&#x4F7F;&#x7528;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;</h1>\n<p>&#x4E3A;&#x4E86;&#x4E30;&#x5BCC;&#x8F6F;&#x4EF6;&#x529F;&#x80FD;&#xFF0C;&#x6211;&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;&#xFF0C;&#x5728;&#x672C;&#x9875;&#x6211;&#x5C06;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x8FD9;&#x4E9B;&#x53C2;&#x6570;&#x7684;&#x4F5C;&#x7528;&#x3002;</p>\n<pre><code>N_m3u8DL-CLI\n\nUSAGE:\n\n  N_m3u8DL-CLI &lt;URL|JSON|FILE&gt; [OPTIONS]\n\nOPTIONS:\n\n  --workDir                  &#x8BBE;&#x5B9A;&#x7A0B;&#x5E8F;&#x5DE5;&#x4F5C;&#x76EE;&#x5F55;\n  --saveName                 &#x8BBE;&#x5B9A;&#x5B58;&#x50A8;&#x6587;&#x4EF6;&#x540D;(&#x4E0D;&#x5305;&#x62EC;&#x540E;&#x7F00;)\n  --baseUrl                  &#x8BBE;&#x5B9A;Baseurl\n  --headers                  &#x8BBE;&#x5B9A;&#x8BF7;&#x6C42;&#x5934;&#xFF0C;&#x683C;&#x5F0F; key:value &#x4F7F;&#x7528;|&#x5206;&#x5272;&#x4E0D;&#x540C;&#x7684;key&amp;value\n  --maxThreads               (Default: 32) &#x8BBE;&#x5B9A;&#x7A0B;&#x5E8F;&#x7684;&#x6700;&#x5927;&#x7EBF;&#x7A0B;&#x6570;\n  --minThreads               (Default: 16) &#x8BBE;&#x5B9A;&#x7A0B;&#x5E8F;&#x7684;&#x6700;&#x5C0F;&#x7EBF;&#x7A0B;&#x6570;\n  --retryCount               (Default: 15) &#x8BBE;&#x5B9A;&#x7A0B;&#x5E8F;&#x7684;&#x91CD;&#x8BD5;&#x6B21;&#x6570;\n  --timeOut                  (Default: 10) &#x8BBE;&#x5B9A;&#x7A0B;&#x5E8F;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x7684;&#x8D85;&#x65F6;&#x65F6;&#x95F4;(&#x5355;&#x4F4D;&#x4E3A;&#x79D2;)\n  --muxSetJson               &#x4F7F;&#x7528;&#x5916;&#x90E8;json&#x6587;&#x4EF6;&#x5B9A;&#x4E49;&#x6DF7;&#x6D41;&#x9009;&#x9879;\n  --useKeyFile               &#x4F7F;&#x7528;&#x5916;&#x90E8;16&#x5B57;&#x8282;&#x6587;&#x4EF6;&#x5B9A;&#x4E49;AES-128&#x89E3;&#x5BC6;KEY\n  --useKeyBase64             &#x4F7F;&#x7528;Base64&#x5B57;&#x7B26;&#x4E32;&#x5B9A;&#x4E49;AES-128&#x89E3;&#x5BC6;KEY\n  --useKeyIV                 &#x4F7F;&#x7528;HEX&#x5B57;&#x7B26;&#x4E32;&#x5B9A;&#x4E49;AES-128&#x89E3;&#x5BC6;IV\n  --downloadRange            &#x4EC5;&#x4E0B;&#x8F7D;&#x89C6;&#x9891;&#x7684;&#x4E00;&#x90E8;&#x5206;&#x5206;&#x7247;&#x6216;&#x957F;&#x5EA6;\n  --liveRecDur               &#x76F4;&#x64AD;&#x5F55;&#x5236;&#x65F6;&#xFF0C;&#x8FBE;&#x5230;&#x6B64;&#x957F;&#x5EA6;&#x81EA;&#x52A8;&#x9000;&#x51FA;&#x8F6F;&#x4EF6;(HH:MM:SS)\n  --stopSpeed                &#x5F53;&#x901F;&#x5EA6;&#x4F4E;&#x4E8E;&#x6B64;&#x503C;&#x65F6;&#xFF0C;&#x91CD;&#x8BD5;(&#x5355;&#x4F4D;&#x4E3A;KB/s)\n  --maxSpeed                 &#x8BBE;&#x7F6E;&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;&#x4E0A;&#x9650;(&#x5355;&#x4F4D;&#x4E3A;KB/s)\n  --proxyAddress             &#x8BBE;&#x7F6E;HTTP/SOCKS5&#x4EE3;&#x7406;, &#x5982; http://127.0.0.1:8080\n  --enableDelAfterDone       &#x5F00;&#x542F;&#x4E0B;&#x8F7D;&#x540E;&#x5220;&#x9664;&#x4E34;&#x65F6;&#x6587;&#x4EF6;&#x5939;&#x7684;&#x529F;&#x80FD;\n  --enableMuxFastStart       &#x5F00;&#x542F;&#x6DF7;&#x6D41;mp4&#x7684;FastStart&#x7279;&#x6027;\n  --enableBinaryMerge        &#x5F00;&#x542F;&#x4E8C;&#x8FDB;&#x5236;&#x5408;&#x5E76;&#x5206;&#x7247;\n  --enableParseOnly          &#x5F00;&#x542F;&#x4EC5;&#x89E3;&#x6790;&#x6A21;&#x5F0F;(&#x7A0B;&#x5E8F;&#x53EA;&#x8FDB;&#x884C;&#x5230;meta.json)\n  --enableAudioOnly          &#x5408;&#x5E76;&#x65F6;&#x4EC5;&#x5C01;&#x88C5;&#x97F3;&#x9891;&#x8F68;&#x9053;\n  --disableDateInfo          &#x5173;&#x95ED;&#x6DF7;&#x6D41;&#x4E2D;&#x7684;&#x65E5;&#x671F;&#x5199;&#x5165;\n  --disableIntegrityCheck    &#x4E0D;&#x68C0;&#x6D4B;&#x5206;&#x7247;&#x6570;&#x91CF;&#x662F;&#x5426;&#x5B8C;&#x6574;\n  --noMerge                  &#x7981;&#x7528;&#x81EA;&#x52A8;&#x5408;&#x5E76;\n  --noProxy                  &#x4E0D;&#x81EA;&#x52A8;&#x4F7F;&#x7528;&#x7CFB;&#x7EDF;&#x4EE3;&#x7406;\n  --registerUrlProtocol      &#x6CE8;&#x518C;m3u8dl&#x94FE;&#x63A5;&#x534F;&#x8BAE;\n  --unregisterUrlProtocol    &#x53D6;&#x6D88;&#x6CE8;&#x518C;m3u8dl&#x94FE;&#x63A5;&#x534F;&#x8BAE;\n  --enableChaCha20           enableChaCha20\n  --chaCha20KeyBase64        ChaCha20KeyBase64\n  --chaCha20NonceBase64      ChaCha20NonceBase64\n  --help                     Display this help screen.\n  --version                  Display version information.\n</code></pre><h3 id=\"&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;\">&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;</h3>\n<p>&#x9996;&#x5148;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x662F; <strong>&#x5FC5;&#x8981;&#x7684;</strong>&#xFF0C;&#x5B83;&#x610F;&#x5473;&#x7740;&#x7A0B;&#x5E8F;&#x5C06;&#x4ECE;&#x54EA;&#x91CC;&#x63A5;&#x6536;&#x4E00;&#x4E2A;&#x5730;&#x5740;&#x3001;&#x6587;&#x4EF6;&#x4EE5;&#x5F00;&#x59CB;&#x4E0B;&#x8F7D;&#x3002;<br>&#x4F8B;&#x5982;&#xFF0C;&#x4E0B;&#x5217;&#x547D;&#x4EE4;&#x5C06;&#x4F7F;&#x4ECE;&#x6307;&#x5B9A;&#x5730;&#x5740;&#x4E0B;&#x8F7D;&#x4E00;&#x4E2A;&#x89C6;&#x9891;&#xFF1A;  </p>\n<pre><code>N_m3u8DL-CLI &quot;https://moviets.tc.qq.com/p0027jbwye1.321004.ts.m3u8?ver=4&quot;\n</code></pre><pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;.m3u8&quot;\n</code></pre><h3 id=\"-workdir\">--workDir</h3>\n<p>&#x6B64;&#x547D;&#x4EE4;&#x5C06;&#x6307;&#x5B9A;&#x89C6;&#x9891;&#x4FDD;&#x5B58;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x53C2;&#x6570;&#x662F;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x5939;&#x8DEF;&#x5F84;&#x3002;<br>&#x4F8B;&#x5982;&#xFF0C;&#x4E0B;&#x5217;&#x547D;&#x4EE4;&#x5C06;&#x4F7F;&#x4F60;&#x7684;&#x89C6;&#x9891;&#x4FDD;&#x5B58;&#x81F3;<code>D:\\MyVideo</code>&#xFF1A;</p>\n<pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;.m3u8&quot; --workDir &quot;D:\\MyVideo&quot;\n</code></pre><h3 id=\"-savename\">--saveName</h3>\n<p>&#x6B64;&#x547D;&#x4EE4;&#x5C06;&#x6307;&#x5B9A;&#x89C6;&#x9891;&#x4FDD;&#x5B58;&#x7684;&#x540D;&#x79F0;&#xFF0C;&#x53C2;&#x6570;&#x662F;&#x4E00;&#x4E2A;&#x6709;&#x6548;&#x5B57;&#x7B26;&#x4E32;&#x3002;<br>&#x901A;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x89C6;&#x9891;&#x540D;&#x79F0;&#x7531;&#x7A0B;&#x5E8F;&#x81EA;&#x52A8;&#x8BC6;&#x522B;&#xFF0C;&#x5047;&#x5982;&#x4F60;&#x60F3;&#x81EA;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x540D;&#x5B57;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x672C;&#x547D;&#x4EE4;&#x3002;\n&#x4F8B;&#x5982;&#xFF0C;&#x4E0B;&#x5217;&#x547D;&#x4EE4;&#x5C06;&#x4F7F;&#x4F60;&#x7684;&#x89C6;&#x9891;&#x4FDD;&#x5B58;&#x4E3A;<code>&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;.mp4</code></p>\n<pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;.m3u8&quot; --saveName &quot;&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;&quot;\n</code></pre><h3 id=\"-baseurl\">--baseUrl</h3>\n<p>&#x6B64;&#x547D;&#x4EE4;&#x5E38;&#x7528;&#x4E8E;&#x4E0B;&#x8F7D;&#x672C;&#x5730;m3u8&#x6587;&#x4EF6;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;</p>\n<pre><code>#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-MEDIA-SEQUENCE:0\n#EXT-X-TARGETDURATION:15\n#EXT-X-PLAYLIST-TYPE:VOD\n#EXTINF:12.000,\n00_p0027jbwye1.321004.1.ts?index=0&amp;start=0&amp;end=12000&amp;brs=0&amp;bre=1137963&amp;ver=4\n#EXTINF:12.000,\n01_p0027jbwye1.321004.1.ts?index=1&amp;start=12000&amp;end=24000&amp;brs=1137964&amp;bre=2658695&amp;ver=4\n#EXTINF:8.200,\n02_p0027jbwye1.321004.1.ts?index=2&amp;start=24000&amp;end=32200&amp;brs=2658696&amp;bre=3083011&amp;ver=4\n...\n...\n#EXT-X-ENDLIST\n</code></pre><p>&#x8FD9;&#x6837;&#x7684;m3u8&#x6587;&#x4EF6;&#x662F;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x4E0B;&#x8F7D;&#x7684;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x6307;&#x5B9A;&#x5BF9;&#x5E94;&#x7684;<code>baseUrl</code>&#xFF0C;&#x5C31;&#x50CF;&#x8FD9;&#x6837;&#xFF1A;</p>\n<pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\raw.m3u8&quot; --baseUrl &quot;https://apd-1b75827c3b093392908ce37d3e2c2481.v.smtcdns.com/moviets.tc.qq.com/AaycNil6WINh7T1JAIHdFjn5ANcF7Q8mk3QXxQHl-7Ik/uwMROfz2r5xhIaQXGdGnC2df64gZXNTMZvhtgq7maR8xuHpV/ihA_Kl1SzFmdh7RlzCAOqn64fVVL3Myzr20LmxKiuA2qr7rgjvqMS8k6gQI6VHwjuQMUrctWXB6kDQYYbHDsR1ZGIaDOtcm5wbE36xN9CC34Itm7ZoYdDjJHYH-wfETSwFsTXa4iJpZcXytyCVCRlFIyBdDIYgqNJiSIJsBu_m0/&quot;\n</code></pre><h3 id=\"-headers\">--headers</h3>\n<p>&#x67D0;&#x4E9B;&#x65F6;&#x5019;&#xFF0C;&#x89C6;&#x9891;&#x670D;&#x52A1;&#x5668;&#x4F1A;&#x963B;&#x6B62;&#x4F60;&#x7684;&#x8BF7;&#x6C42;&#xFF0C;&#x9664;&#x975E;&#x4F60;&#x80FD;&#x591F;&#x4F2A;&#x9020;&#x4E00;&#x4E9B;<code>&#x8BF7;&#x6C42;&#x5934;</code>&#xFF0C;&#x672C;&#x547D;&#x4EE4;&#x5373;&#x53EF;&#x4F2A;&#x9020;&#x4E00;&#x4E9B;&#x8BF7;&#x6C42;&#x5934;&#xFF0C;&#x76EE;&#x524D;&#x652F;&#x6301;&#x5927;&#x90E8;&#x5206;&#x5E38;&#x89C1;&#x8BF7;&#x6C42;&#x5934;&#xFF1A;</p>\n<pre><code>Referer\nUser-Agent\nRange\nAccept\n...\n</code></pre><p>&#x5982;<code>&#x8292;&#x679C;TV</code>&#x7684;m3u8&#x4F1A;&#x9A8C;&#x8BC1;Cookie&#xFF0C;&#x5FC5;&#x987B;&#x542B;&#x6709;<code>MQGUID</code>&#x624D;&#x80FD;&#x6B63;&#x786E;&#x8BBF;&#x95EE;&#x4E0B;&#x8F7D;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x8FD9;&#x6837;&#x6307;&#x5B9A;&#xFF1A;</p>\n<pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;(MGTV).m3u8&quot; --headers &quot;Cookie:MQGUID&quot;\n</code></pre><p>&#x5F53;&#x7136;&#xFF0C;&#x652F;&#x6301;&#x81EA;&#x5B9A;&#x4E49;&#x591A;&#x79CD;&#x8BF7;&#x6C42;&#x5934;&#xFF0C;&#x4F7F;&#x7528;<code>|</code>&#x5206;&#x9694;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;</p>\n<pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\M.m3u8&quot; --headers &quot;Cookie:sessionId=1236983428;cns=xpopqwe305|User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36&quot;\n</code></pre><p>&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x4F7F;&#x7A0B;&#x5E8F;&#x4F7F;&#x7528;&#x5982;&#x4E0B;&#x8BF7;&#x6C42;&#x5934;&#xFF1A;</p>\n<pre><code>...\nCookie:sessionId=1236983428;cns=xpopqwe305\nUser-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\n...\n</code></pre><h3 id=\"-maxthreads----minthreads\">--maxThreads &amp; --minThreads</h3>\n<p>&#x7A0B;&#x5E8F;&#x7684;&#x4E0B;&#x8F7D;&#x7EBF;&#x7A0B;&#x6570;&#x53EF;&#x7531;<code>--maxThreads</code>&#x548C;<code>--minThreads</code>&#x6307;&#x5B9A;&#xFF0C;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8FD9;&#x4E24;&#x4E2A;&#x503C;&#x5206;&#x522B;&#x662F;<code>32</code>&#x548C;<code>16</code>&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x624B;&#x52A8;&#x6307;&#x5B9A;&#x5B83;&#xFF0C;&#x4F8B;&#x5982;&#x4E0B;&#x5217;&#x547D;&#x4EE4;&#x53EF;&#x5C06;&#x7A0B;&#x5E8F;&#x7EBF;&#x7A0B;&#x9650;&#x5236;&#x5230;<code>1</code>&#xFF1A;</p>\n<pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;.m3u8&quot; --maxThreads 1 --minThreads 1\n</code></pre><h3 id=\"-retrycount\">--retryCount</h3>\n<p>&#x6307;&#x5B9A;&#x7A0B;&#x5E8F;&#x6700;&#x5927;&#x91CD;&#x8BD5;&#x6B21;&#x6570;&#x3002;&#x67D0;&#x4E9B;&#x65F6;&#x5019;&#x6211;&#x4EEC;&#x5E76;&#x4E0D;&#x80FD;&#x4E00;&#x6B21;&#x6027;&#x6210;&#x529F;&#x4E0B;&#x8F7D;&#x6240;&#x6709;&#x5206;&#x7247;&#xFF0C;&#x5728;&#x4E00;&#x6B21;&#x4EFB;&#x52A1;&#x7ED3;&#x675F;&#x540E;&#xFF0C;&#x7A0B;&#x5E8F;&#x4F1A;&#x68C0;&#x6D4B;&#x5DF2;&#x4E0B;&#x8F7D;&#x7684;<code>TS</code>&#x5206;&#x7247;&#x6570;&#x91CF;&#x548C;<code>m3u8</code>&#x6587;&#x4EF6;&#x4E2D;&#x7684;&#x5206;&#x7247;&#x6570;&#x91CF;&#x662F;&#x5426;&#x76F8;&#x7B49;&#xFF0C;&#x4E0D;&#x4E00;&#x81F4;&#x5219;&#x8FDB;&#x5165;&#x91CD;&#x8BD5;&#x73AF;&#x8282;&#x3002;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A;<code>15</code></p>\n<h3 id=\"-timeout\">--timeOut</h3>\n<p>&#x6307;&#x5B9A;&#x7A0B;&#x5E8F;&#x8FDB;&#x884C;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x7684;&#x8D85;&#x65F6;&#x65F6;&#x957F;&#xFF0C;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A;<code>10</code>&#x79D2;</p>\n<h3 id=\"-muxsetjson\">--muxSetJson</h3>\n<p>&#x6307;&#x5B9A;&#x4E00;&#x4E2A;<code>json</code>&#x6587;&#x4EF6;&#x7528;&#x4E8E;&#x6DF7;&#x6D41;&#xFF0C;&#x80FD;&#x591F;&#x8BC6;&#x522B;&#x7684;&#x683C;&#x5F0F;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre><code>{\n    &quot;muxFormat&quot;: &quot;mp4&quot;, \n    &quot;fastStart&quot;: &quot;True&quot;, \n    &quot;poster&quot;: &quot;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;&#xFF0C;\\&#x9700;&#x5199;&#x4E3A;\\\\&quot;, \n    &quot;audioName&quot;: &quot;&quot;, \n    &quot;title&quot;: &quot;&quot;, \n    &quot;copyright&quot;: &quot;&quot;, \n    &quot;comment&quot;: &quot;&quot;\n}\n</code></pre><p>&#x4F8B;&#x5982;&#x4F60;&#x60F3;&#x8981;&#x5C06;&#x4E00;&#x4E2A;&#x56FE;&#x7247;&#x4F5C;&#x4E3A;&#x89C6;&#x9891;&#x7684;<code>&#x6D77;&#x62A5;</code>&#xFF0C;&#x540C;&#x65F6;&#x4E3A;&#x89C6;&#x9891;&#x6DFB;&#x52A0;<code>&#x6807;&#x9898;</code>&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5728;&#x684C;&#x9762;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;<code>&#x5C0F;&#x732A;&#x4F69;&#x5947;.json</code>&#xFF0C;&#x5E76;&#x5728;&#x6587;&#x4EF6;&#x4E2D;&#x5199;&#x5165;&#x5982;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p>\n<pre><code>{\n    &quot;muxFormat&quot;:&quot;mp4&quot;,\n    &quot;fastStart&quot;:&quot;True&quot;,\n    &quot;poster&quot;:&quot;C:\\\\Users\\\\nilao\\\\Desktop\\\\&#x5C0F;&#x732A;&#x4F69;&#x5947;.jpg&quot;,\n    &quot;audioName&quot;:&quot;&quot;,\n    &quot;title&quot;:&quot;&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;&quot;,\n    &quot;copyright&quot;:&quot;&quot;,\n    &quot;comment&quot;:&quot;&#x6211;&#x7231;&#x5C0F;&#x732A;&#x4F69;&#x5947;&quot;,\n    &quot;encodingTool&quot;: &quot;&quot;\n}\n</code></pre><p>&#x7136;&#x540E;&#x4F7F;&#x7528;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#x4F7F;&#x7528;&#x5B83;&#xFF1A;</p>\n<pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;.m3u8&quot; --saveName &quot;&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;&quot; --muxSetJson &quot;C:\\Users\\nilao\\Desktop\\&#x5C0F;&#x732A;&#x4F69;&#x5947;.json&quot;\n</code></pre><p>&#x8FD9;&#x6837;&#xFF0C;&#x4F60;&#x7684;&#x89C6;&#x9891;&#x5C06;&#x5728;<code>Windows&#x6587;&#x4EF6;&#x8D44;&#x6E90;&#x7BA1;&#x7406;&#x5668;</code>&#x4E2D;&#x5448;&#x73B0;&#x51FA;&#x8FD9;&#x6837;&#x7684;&#x6548;&#x679C;&#xFF1A;  <br>\n<img src=\"source/images/muxSetJson.png\" alt=\"&#x76F4;&#x63A5;&#x4F7F;&#x7528;\"></p>\n<p>&#x5728;<code>Mediainfo</code>&#x4E2D;&#xFF0C;&#x663E;&#x793A;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre><code>&#x683C;&#x5F0F;                                       : MPEG-4\n&#x683C;&#x5F0F;&#x6982;&#x51B5;                                     : Base Media\n&#x7F16;&#x89E3;&#x7801;&#x5668;ID                                   : isom (isom/iso2/avc1/mp41)\n&#x6587;&#x4EF6;&#x5927;&#x5C0F;                                     : 38.6 MiB\n&#x6301;&#x7EED;&#x65F6;&#x95F4;                                     : 5 &#x5206; 2 &#x79D2;\n&#x5E73;&#x5747;&#x6DF7;&#x5408;&#x7801;&#x7387;                                   : 1 072 kb/s\n&#x7535;&#x5F71;&#x540D;&#x79F0;                                     : &#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;\n&#x5F55;&#x5236;&#x65E5;&#x671F;                                     : 2019-07-08T23:12:46.9349258+08:00\n&#x7F16;&#x7801;&#x7A0B;&#x5E8F;                                     : Lavf58.20.100\n&#x5C01;&#x9762;                                       : Yes\n&#x8BC4;&#x8BBA;                                       : &#x6211;&#x7231;&#x5C0F;&#x732A;&#x4F69;&#x5947;\n</code></pre><h3 id=\"-usekeybase64\">--useKeyBase64</h3>\n<p>&#x5F3A;&#x5236;&#x4F7F;&#x7528;<code>AES-128</code>&#x89E3;&#x5BC6;&#xFF0C;&#x5E76;&#x4F7F;&#x7528;&#x8F93;&#x5165;&#x7684;<code>Base64String</code>&#x6765;&#x4F5C;&#x4E3A;&#x89E3;&#x5BC6;<code>KEY</code></p>\n<pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\AES.m3u8&quot; --useKeyBase64 &quot;di5rZXkAAAAAAAAAAAAAAA==&quot;\n</code></pre><h3 id=\"-usekeyfile\">--useKeyFile</h3>\n<p>&#x5F3A;&#x5236;&#x4F7F;&#x7528;<code>AES-128</code>&#x89E3;&#x5BC6;&#xFF0C;&#x5E76;&#x4F7F;&#x7528;&#x8F93;&#x5165;&#x7684;&#x6587;&#x4EF6;&#x6765;&#x4F5C;&#x4E3A;&#x89E3;&#x5BC6;<code>KEY</code></p>\n<pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\AES.m3u8&quot; --useKeyFile &quot;C:\\Users\\nilao\\Desktop\\key&quot;\n</code></pre><h3 id=\"-downloadrange\">--downloadRange</h3>\n<p><code>2.0.4</code>&#x53CA;&#x4EE5;&#x540E;&#x7248;&#x672C;&#x7684;&#x65B0;&#x529F;&#x80FD;&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x4F60;&#x4ECE;&#x4E00;&#x6BB5;&#x89C6;&#x9891;&#x4E2D;&#x4E0B;&#x8F7D;&#x4F60;&#x60F3;&#x8981;&#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x652F;&#x6301;&#x5206;&#x7247;&#x53C2;&#x6570;&#x4E0E;&#x65F6;&#x95F4;&#x7801;&#x53C2;&#x6570;&#xFF0C;&#x5177;&#x4F53;&#x7684;&#x4F7F;&#x7528;&#x793A;&#x4F8B;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre><code>--downloadRange 0-10\n&#x4E0B;&#x8F7D;&#x89C6;&#x9891;&#x7684;&#x7B2C;0&#x4E2A;&#x5206;&#x7247;&#x5230;&#x7B2C;10&#x4E2A;&#x5206;&#x7247;&#xFF0C;&#x5373;[0-10]\n\n--downloadRange 200-\n&#x4E0B;&#x8F7D;&#x89C6;&#x9891;&#x7684;&#x7B2C;200&#x4E2A;&#x5206;&#x7247;&#x5230;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x5206;&#x7247;\n\n--downloadRange  -100\n&#x4E0B;&#x8F7D;&#x89C6;&#x9891;&#x7684;&#x7B2C;0&#x4E2A;&#x5206;&#x7247;&#x5230;&#x7B2C;100&#x4E2A;&#x5206;&#x7247;&#xFF0C;&#x5373;[0-100]\n\n--downloadRange 00:23:00-00:25:20\n&#x4E0B;&#x8F7D;&#x89C6;&#x9891;00:23:00-00:25:20&#x7684;&#x5185;&#x5BB9;\n\n--downloadRange -00:10:00\n&#x4E0B;&#x8F7D;&#x89C6;&#x9891;&#x7684;&#x524D;10&#x5206;&#x949F;&#x7684;&#x5185;&#x5BB9;\n\n--downloadRange 00:30:00-\n&#x4E0B;&#x8F7D;&#x89C6;&#x9891;&#x7684;30&#x5206;&#x949F;&#x5230;&#x7ED3;&#x675F;&#x7684;&#x5185;&#x5BB9;\n\n&#x6CE8;&#x610F;&#xFF1A;&#x5728;&#x4F7F;&#x7528;&#x65F6;&#x95F4;&#x7801;&#x53C2;&#x6570;&#x65F6;&#xFF0C;&#x683C;&#x5F0F;&#x5FC5;&#x987B;&#x4E3A;00:00:00&#x624D;&#x80FD;&#x88AB;&#x7A0B;&#x5E8F;&#x6B63;&#x786E;&#x8BC6;&#x522B;\n</code></pre><h3 id=\"-liverecdur\">--liveRecDur</h3>\n<p><code>2.5.1</code>&#x53CA;&#x4EE5;&#x540E;&#x7248;&#x672C;&#x7684;&#x65B0;&#x529F;&#x80FD;&#x3002;&#x5728;&#x76F4;&#x64AD;&#x5F55;&#x5236;&#x65F6;&#xFF0C;&#x8FD9;&#x5C06;&#x975E;&#x5E38;&#x6709;&#x7528;&#x3002;</p>\n<pre><code>--downloadRange 00:10:00\n&#x76F4;&#x64AD;&#x6D41;&#x5F55;&#x5236;&#x957F;&#x5EA6;&#x4E3A;10&#x5206;&#x949F;\n\n--downloadRange 01:10:10\n&#x76F4;&#x64AD;&#x6D41;&#x5F55;&#x5236;&#x957F;&#x5EA6;&#x4E3A;1&#x5C0F;&#x65F6;10&#x5206;&#x949F;10&#x79D2;\n</code></pre><h3 id=\"-stopspeed\">--stopSpeed</h3>\n<p>&#x5F53;&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;&#x4F4E;&#x4E8E;&#x6B64;&#x503C;(&#x5355;&#x4F4D;&#x4E3A;KB/s)&#x65F6;&#xFF0C;&#x7A0B;&#x5E8F;&#x8FDB;&#x5165;&#x91CD;&#x8BD5;&#x9636;&#x6BB5;&#x3002;<br>&#x9ED8;&#x8BA4;&#x503C;&#x4E3A;<code>0</code></p>\n<h3 id=\"-maxspeed\">--maxSpeed</h3>\n<p>&#x8BBE;&#x7F6E;&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;&#x4E0A;&#x9650;(&#x5355;&#x4F4D;&#x4E3A;KB/s)&#x3002;<br>&#x9ED8;&#x8BA4;&#x503C;&#x4E3A;<code>0</code>, &#x4E0D;&#x9650;&#x901F;</p>\n<h3 id=\"-proxyaddress\">--proxyAddress</h3>\n<p>&#x8BBE;&#x7F6E;HTTP&#x4EE3;&#x7406;&#xFF0C;&#x914D;&#x5408;&#x4EE3;&#x7406;&#x8F6F;&#x4EF6;&#x4F7F;&#x7528;&#x3002;<br>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x7A0B;&#x5E8F;&#x4F1A;&#x4F7F;&#x7528;&#x7CFB;&#x7EDF;&#x4EE3;&#x7406;&#xFF1B;&#x73B0;&#x5728;&#x4F60;&#x53EF;&#x4EE5;&#x81EA;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;http&#x5730;&#x5740;&#x7528;&#x4F5C;&#x4EE3;&#x7406;&#x4E86;&#x3002;  </p>\n<pre><code>N_m3u8DL-CLI &quot;C:\\Users\\nilao\\Desktop\\&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;.m3u8&quot; --saveName &quot;&#x5C0F;&#x732A;&#x4F69;&#x5947;&#x7B2C;&#x4E00;&#x96C6;&quot; --proxyAddress &quot;http://127.0.0.1:8080&quot;\n</code></pre><p>&#x6CE8;&#x610F;&#xFF0C;&#x5F53;&#x542F;&#x7528;<code>--noProxy</code>&#x65F6;&#xFF0C;&#x6B64;&#x5904;&#x8BBE;&#x7F6E;&#x5C06;&#x4E0D;&#x751F;&#x6548;</p>\n<h3 id=\"-enabledelafterdone\">--enableDelAfterDone</h3>\n<p>&#x7528;&#x4E8E;&#x5F00;&#x542F;&#x7A0B;&#x5E8F;&#x7684;<code>&#x4E0B;&#x8F7D;&#x5B8C;&#x6210;&#x540E;&#x81EA;&#x52A8;&#x5220;&#x9664;&#x4E34;&#x65F6;&#x76EE;&#x5F55;</code>&#x529F;&#x80FD;&#xFF0C;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#x3002;</p>\n<h3 id=\"-enablemuxfaststart\">--enableMuxFastStart</h3>\n<p>&#x4F7F;&#x7528;&#x672C;&#x547D;&#x4EE4;&#x540E;&#xFF0C;&#x5408;&#x5E76;&#x751F;&#x6210;&#x7684;<code>mp4</code>&#x6587;&#x4EF6;&#x5C06;&#x80FD;&#x591F;&#x5728;&#x7F51;&#x7EDC;&#x4F20;&#x8F93;&#x65F6;<code>&#x8FB9;&#x4E0B;&#x8FB9;&#x770B;</code>&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x6D41;&#x5A92;&#x4F53;&#x3002;<br>&#x7F3A;&#x70B9;&#x662F;&#x5408;&#x5E76;&#x65F6;&#x95F4;&#x4F1A;&#x53D8;&#x6162;&#x3002;<br>&#x672C;&#x547D;&#x4EE4;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#x3002;</p>\n<h3 id=\"-enablebinarymerge\">--enableBinaryMerge</h3>\n<p>&#x4F7F;&#x7528;&#x672C;&#x547D;&#x4EE4;&#x540E;&#xFF0C;&#x6240;&#x6709;&#x5173;&#x4E8E;mp4&#x5408;&#x5E76;&#x7684;&#x53C2;&#x6570;&#x5C06;&#x4F1A;&#x5931;&#x6548;&#xFF0C;&#x7A0B;&#x5E8F;&#x5C06;&#x91C7;&#x7528;<code>&#x4E8C;&#x8FDB;&#x5236;&#x5408;&#x5E76;</code>&#xFF0C;&#x5373;&#x76F4;&#x63A5;&#x62FC;&#x63A5;&#x670D;&#x52A1;&#x5668;&#x63D0;&#x4F9B;&#x7684;<code>Raw</code>&#x6D41;&#xFF0C;&#x4E0D;&#x4F7F;&#x7528;<code>ffmpeg</code>&#x8FDB;&#x884C;&#x6DF7;&#x6D41;&#x3002;<br>&#x672C;&#x547D;&#x4EE4;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#x3002;</p>\n<h3 id=\"-enableparseonly\">--enableParseOnly</h3>\n<p>&#x4F7F;&#x7528;&#x672C;&#x547D;&#x4EE4;&#x540E;&#xFF0C;&#x7A0B;&#x5E8F;&#x5C06;&#x53EA;&#x5206;&#x6790;&#x7528;&#x6237;&#x8F93;&#x5165;&#x7684;<code>m3u8</code>&#x6587;&#x4EF6;&#x800C;&#x4E0D;&#x8FDB;&#x884C;&#x4E0B;&#x8F7D;&#x3002;<br>&#x672C;&#x547D;&#x4EE4;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#x3002;</p>\n<h3 id=\"-enableaudioonly\">--enableAudioOnly</h3>\n<p>&#x4F7F;&#x7528;&#x672C;&#x547D;&#x4EE4;&#x540E;&#xFF0C;&#x7A0B;&#x5E8F;&#x5C06;&#x53EA;&#x5408;&#x5E76;&#x97F3;&#x9891;&#x8F68;&#x9053;&#x3002;<br>&#x672C;&#x547D;&#x4EE4;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#x3002;</p>\n<h3 id=\"-disabledateinfo\">--disableDateInfo</h3>\n<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E0B;&#x8F7D;&#x5408;&#x5E76;&#x751F;&#x6210;&#x7684;<code>mp4</code>&#x6587;&#x4EF6;&#x4F1A;&#x9ED8;&#x8BA4;&#x52A0;&#x5165;&#x4E00;&#x4E2A;<code>&#x5F55;&#x5236;&#x65E5;&#x671F;</code>&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x672C;&#x547D;&#x4EE4;&#x6765;&#x89C4;&#x907F;&#x6B64;&#x64CD;&#x4F5C;&#x3002;<br>&#x672C;&#x547D;&#x4EE4;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#x3002;</p>\n<h3 id=\"-nomerge\">--noMerge</h3>\n<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E0B;&#x8F7D;&#x540E;&#x4F1A;&#x81EA;&#x52A8;&#x5408;&#x5E76;&#x4E3A;<code>mp4</code>&#x6587;&#x4EF6;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x672C;&#x547D;&#x4EE4;&#x6765;&#x89C4;&#x907F;&#x6B64;&#x64CD;&#x4F5C;&#x3002;<br>&#x672C;&#x547D;&#x4EE4;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#x3002;</p>\n<h3 id=\"-noproxy\">--noProxy</h3>\n<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E0B;&#x8F7D;&#x5668;&#x4F1A;&#x4F7F;&#x7528;&#x5F53;&#x524D;&#x7CFB;&#x7EDF;&#x7684;&#x4EE3;&#x7406;&#x8BBE;&#x7F6E;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x672C;&#x547D;&#x4EE4;&#x6765;&#x89C4;&#x907F;&#x6B64;&#x64CD;&#x4F5C;&#x3002;<br>&#x672C;&#x547D;&#x4EE4;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#x3002;</p>\n<h3 id=\"-disableintegritycheck\">--disableIntegrityCheck</h3>\n<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E0B;&#x8F7D;&#x5668;&#x5728;&#x4E0B;&#x8F7D;&#x8FC7;&#x7A0B;&#x5B8C;&#x6BD5;&#x540E;&#xFF0C;&#x4F1A;&#x63D0;&#x53D6;&#x4E0B;&#x8F7D;&#x76EE;&#x5F55;&#x6240;&#x6709;<code>ts</code>&#x6587;&#x4EF6;&#x6570;&#x91CF;&#x4E0E;<code>meta.json</code>&#x4E2D;&#x8BFB;&#x53D6;&#x5230;&#x7684;&#x6587;&#x4EF6;&#x6570;&#x91CF;&#x505A;&#x6BD4;&#x5BF9;&#xFF0C;&#x5982;&#x679C;&#x6570;&#x91CF;&#x4E0D;&#x4E00;&#x81F4;(&#x8FD9;&#x610F;&#x5473;&#x7740;&#x4E22;&#x5931;&#x4E86;&#x67D0;&#x4E9B;&#x5206;&#x7247;)&#xFF0C;&#x7A0B;&#x5E8F;&#x5C06;&#x8FDB;&#x5165;&#x91CD;&#x8BD5;&#x9636;&#x6BB5;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x6B64;&#x9009;&#x9879;&#x6765;&#x89C4;&#x907F;&#x6B64;&#x64CD;&#x4F5C;(&#x4E0D;&#x63A8;&#x8350;)&#x3002;\n&#x672C;&#x547D;&#x4EE4;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#x3002;</p>\n<h3 id=\"&#x4F60;&#x53EF;&#x80FD;&#x4E0D;&#x77E5;&#x9053;\">&#x4F60;&#x53EF;&#x80FD;&#x4E0D;&#x77E5;&#x9053;</h3>\n<p>&#x73B0;&#x5728;&#x4F60;&#x53EF;&#x4EE5;&#x5728;&#x7A0B;&#x5E8F;<code>EXE</code>&#x76EE;&#x5F55;&#x4E0B;&#x65B0;&#x5EFA;<code>N_m3u8DL-CLI.args.txt</code>&#xFF0C;&#x5B58;&#x4E00;&#x4E9B;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;&#xFF0C;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF1A;</p>\n<pre><code>--enableDelAfterDone --disableDateInfo --noProxy --workDir &quot;C:\\Users\\nilao\\Downloads&quot;\n</code></pre><p>&#x6B64;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x7684;&#x53C2;&#x6570;&#x53EA;&#x6709;0&#x4E2A;(&#x53CC;&#x51FB;&#x6253;&#x5F00;&#x7A0B;&#x5E8F;)&#x6216;1&#x4E2A;(&#x4F7F;&#x7528;&#x547D;&#x4EE4;&#x884C;&#x8C03;&#x7528;&#x4E14;&#x53EA;&#x8F93;&#x5165;&#x4E86;m3u8&#x5730;&#x5740;)&#xFF0C;&#x7A0B;&#x5E8F;&#x4F1A;&#x81EA;&#x52A8;&#x8865;&#x5145;&#x53C2;&#x6570;&#xFF0C;&#x4F8B;&#x5982;<code>N_m3u8DL-CLI &quot;http://x.x/1.m3u8&quot;</code>&#x5C06;&#x6210;&#x4E3A;<code>N_m3u8DL-CLI &quot;http://x.x/1.m3u8&quot; --enableDelAfterDone --disableDateInfo --noProxy --workDir &quot;C:\\Users\\nilao\\Downloads&quot;</code>&#xFF0C;&#x8FD9;&#x5728;&#x6CA1;&#x6709;GUI&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x5C06;&#x5341;&#x5206;&#x6709;&#x7528;&#x3002;  </p>\n<p>&#x4F60;&#x53EF;&#x4EE5;&#x5C06;<code>.m3u8</code>&#x6587;&#x4EF6;&#x7684;&#x9ED8;&#x8BA4;&#x6253;&#x5F00;&#x65B9;&#x5F0F;&#x8BBE;&#x7F6E;&#x4E3A;<code>N_m3u8DL-CLI</code>&#xFF0C;&#x4FBF;&#x80FD;&#x53CC;&#x51FB;&#x4E0B;&#x8F7D;&#x4E14;&#x80FD;&#x4FDD;&#x8BC1;&#x7A0B;&#x5E8F;&#x4F1A;&#x6309;&#x7167;&#x4E00;&#x5B9A;&#x7684;&#x9ED8;&#x8BA4;&#x884C;&#x4E3A;&#x53BB;&#x6B63;&#x786E;&#x5730;&#x5DE5;&#x4F5C;&#xFF0C;&#x50CF;&#x4F60;&#x671F;&#x5F85;&#x7684;&#x90A3;&#x6837;&#x3002;</p>\n\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                \n                <a href=\"SimpleGUI.html\" class=\"navigation navigation-next navigation-unique\" aria-label=\"Next page: SimpleGUI\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"命令行参数\",\"level\":\"3.1.1\",\"depth\":2,\"next\":{\"title\":\"SimpleGUI\",\"level\":\"3.1.2\",\"depth\":2,\"path\":\"SimpleGUI.md\",\"ref\":\"SimpleGUI.md\",\"articles\":[]},\"previous\":{\"title\":\"进阶\",\"level\":\"3.1\",\"depth\":1,\"ref\":\"\",\"articles\":[{\"title\":\"命令行参数\",\"level\":\"3.1.1\",\"depth\":2,\"path\":\"Advanced.md\",\"ref\":\"Advanced.md\",\"articles\":[]},{\"title\":\"SimpleGUI\",\"level\":\"3.1.2\",\"depth\":2,\"path\":\"SimpleGUI.md\",\"ref\":\"SimpleGUI.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"donate\",\"github\",\"github-buttons\",\"-sharing\",\"sharing-plus\"],\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"github\":{\"url\":\"https://github.com/nilaoda\"},\"search\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"lunr\":{\"maxIndexSize\":1000000,\"ignoreSpecialCharacters\":false},\"donate\":{\"alipay\":\"./source/images/alipay.png\",\"alipayText\":\"支付宝\",\"button\":\"赞赏\",\"title\":\"\",\"wechat\":\"\",\"wechatText\":\"微信打赏\"},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"highlight\":{},\"github-buttons\":{\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]},\"sharing\":{\"qq\":true,\"all\":[\"google\",\"facebook\",\"weibo\",\"twitter\",\"qq\",\"qzone\",\"linkedin\",\"pocket\"],\"douban\":false,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":true,\"linkedin\":false},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false}},\"theme\":\"default\",\"author\":\"nilaoda\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"N_m3u8DL-CLI文档\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"N_m3u8DL-CLI文档\"},\"file\":{\"path\":\"Advanced.md\",\"mtime\":\"2022-07-11T16:10:02.732Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2022-07-11T16:10:30.637Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-donate/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github-buttons/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search-engine.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/lunr.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/search-lunr.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/GetM3u8.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>JS获取m3u8 · N_m3u8DL-CLI文档</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"nilaoda\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-donate/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-highlight/website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"M3U8URL2File.html\" />\n    \n    \n\n    <style>\n    @media only screen and (max-width: 640px) {\n        .book-header .hidden-mobile {\n            display: none;\n        }\n    }\n    </style>\n    <script>\n        window[\"gitbook-plugin-github-buttons\"] = {\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]};\n    </script>\n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" >\n            \n                <span>\n            \n                    \n                    简介\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"2.1\" >\n            \n                <span>\n            \n                    \n                    入门\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"2.1.1\" data-path=\"Introductory.html\">\n            \n                <a href=\"Introductory.html\">\n            \n                    \n                    使用入门\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"3.1\" >\n            \n                <span>\n            \n                    \n                    进阶\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"3.1.1\" data-path=\"Advanced.html\">\n            \n                <a href=\"Advanced.html\">\n            \n                    \n                    命令行参数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"3.1.2\" data-path=\"SimpleGUI.html\">\n            \n                <a href=\"SimpleGUI.html\">\n            \n                    \n                    SimpleGUI\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"4.1\" >\n            \n                <span>\n            \n                    \n                    辅助\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"4.1.1\" data-path=\"GetM3u8.html\">\n            \n                <a href=\"GetM3u8.html\">\n            \n                    \n                    JS获取m3u8\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"4.1.2\" data-path=\"M3U8URL2File.html\">\n            \n                <a href=\"M3U8URL2File.html\">\n            \n                    \n                    M3U8URL2File\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >JS获取m3u8</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <h1 id=\"&#x4F7F;&#x7528;javascript&#x83B7;&#x53D6;m3u8\">&#x4F7F;&#x7528;Javascript&#x83B7;&#x53D6;m3u8</h1>\n<p>&#x8FD9;&#x91CC;&#x53D8;&#x5F97;&#x7A7A;&#x7A7A;&#x5982;&#x4E5F;...</p>\n\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                \n                <a href=\"M3U8URL2File.html\" class=\"navigation navigation-next navigation-unique\" aria-label=\"Next page: M3U8URL2File\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"JS获取m3u8\",\"level\":\"4.1.1\",\"depth\":2,\"next\":{\"title\":\"M3U8URL2File\",\"level\":\"4.1.2\",\"depth\":2,\"path\":\"M3U8URL2File.md\",\"ref\":\"M3U8URL2File.md\",\"articles\":[]},\"previous\":{\"title\":\"辅助\",\"level\":\"4.1\",\"depth\":1,\"ref\":\"\",\"articles\":[{\"title\":\"JS获取m3u8\",\"level\":\"4.1.1\",\"depth\":2,\"path\":\"GetM3u8.md\",\"ref\":\"GetM3u8.md\",\"articles\":[]},{\"title\":\"M3U8URL2File\",\"level\":\"4.1.2\",\"depth\":2,\"path\":\"M3U8URL2File.md\",\"ref\":\"M3U8URL2File.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"donate\",\"github\",\"github-buttons\",\"-sharing\",\"sharing-plus\"],\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"github\":{\"url\":\"https://github.com/nilaoda\"},\"search\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"lunr\":{\"maxIndexSize\":1000000,\"ignoreSpecialCharacters\":false},\"donate\":{\"alipay\":\"./source/images/alipay.png\",\"alipayText\":\"支付宝\",\"button\":\"赞赏\",\"title\":\"\",\"wechat\":\"\",\"wechatText\":\"微信打赏\"},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"highlight\":{},\"github-buttons\":{\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]},\"sharing\":{\"qq\":true,\"all\":[\"google\",\"facebook\",\"weibo\",\"twitter\",\"qq\",\"qzone\",\"linkedin\",\"pocket\"],\"douban\":false,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":true,\"linkedin\":false},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false}},\"theme\":\"default\",\"author\":\"nilaoda\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"N_m3u8DL-CLI文档\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"N_m3u8DL-CLI文档\"},\"file\":{\"path\":\"GetM3u8.md\",\"mtime\":\"2022-05-13T09:14:01.666Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2022-07-11T16:10:30.637Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-donate/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github-buttons/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search-engine.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/lunr.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/search-lunr.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/Introductory.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>使用入门 · N_m3u8DL-CLI文档</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"nilaoda\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-donate/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-highlight/website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    \n\n    <style>\n    @media only screen and (max-width: 640px) {\n        .book-header .hidden-mobile {\n            display: none;\n        }\n    }\n    </style>\n    <script>\n        window[\"gitbook-plugin-github-buttons\"] = {\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]};\n    </script>\n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" >\n            \n                <span>\n            \n                    \n                    简介\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"2.1\" >\n            \n                <span>\n            \n                    \n                    入门\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"2.1.1\" data-path=\"Introductory.html\">\n            \n                <a href=\"Introductory.html\">\n            \n                    \n                    使用入门\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"3.1\" >\n            \n                <span>\n            \n                    \n                    进阶\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"3.1.1\" data-path=\"Advanced.html\">\n            \n                <a href=\"Advanced.html\">\n            \n                    \n                    命令行参数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"3.1.2\" data-path=\"SimpleGUI.html\">\n            \n                <a href=\"SimpleGUI.html\">\n            \n                    \n                    SimpleGUI\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"4.1\" >\n            \n                <span>\n            \n                    \n                    辅助\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"4.1.1\" data-path=\"GetM3u8.html\">\n            \n                <a href=\"GetM3u8.html\">\n            \n                    \n                    JS获取m3u8\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"4.1.2\" data-path=\"M3U8URL2File.html\">\n            \n                <a href=\"M3U8URL2File.html\">\n            \n                    \n                    M3U8URL2File\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >使用入门</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <h1 id=\"&#x8BA9;&#x6211;&#x4EEC;&#x5F00;&#x59CB;&#x5427;\">&#x8BA9;&#x6211;&#x4EEC;&#x5F00;&#x59CB;&#x5427;</h1>\n<p>&#x9996;&#x5148;&#xFF0C;&#x6700;&#x7B80;&#x5355;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#x662F;&#x76F4;&#x63A5;&#x53CC;&#x51FB;EXE&#xFF0C;&#x5C06;&#x4F60;&#x8981;&#x4E0B;&#x8F7D;&#x7684;m3u8&#x6587;&#x4EF6;&#x6216;m3u8&#x94FE;&#x63A5;&#x590D;&#x5236;&#x8FDB;&#x53BB;&#xFF0C;&#x7136;&#x540E;&#x6309;&#x4E0B;&#x56DE;&#x8F66;&#x952E;&#x3002;&#x5C31;&#x50CF;&#x8FD9;&#x6837;&#xFF1A;<br><img src=\"source/images/&#x76F4;&#x63A5;&#x4F7F;&#x7528;.gif\" alt=\"&#x76F4;&#x63A5;&#x4F7F;&#x7528;\"><br>&#x6B63;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x7A0B;&#x5E8F;&#x5C06;&#x4EA7;&#x751F;&#x5982;&#x4E0B;&#x7684;&#x76EE;&#x5F55;&#x7ED3;&#x6784;&#xFF1A;</p>\n<pre><code>.\n&#x251C;&#x2500;&#x2500; Downloads\n&#x2514;&#x2500;&#x2500; Logs\n    &#x2514;&#x2500;&#x2500; *.log\n</code></pre><p>&#x7A0B;&#x5E8F;&#x9ED8;&#x8BA4;&#x5C06;&#x89C6;&#x9891;&#x6587;&#x4EF6;&#x653E;&#x5728;&#x4E86;EXE&#x540C;&#x76EE;&#x5F55;&#x7684;<code>Downloads</code>&#x6587;&#x4EF6;&#x5939;&#x4E2D;&#xFF0C;&#x5C06;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x65E5;&#x5FD7;&#x4FE1;&#x606F;&#x653E;&#x5728;&#x4E86;<code>Logs</code>&#x76EE;&#x5F55;&#x4E2D;&#x3002;</p>\n\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"使用入门\",\"level\":\"2.1.1\",\"depth\":2,\"next\":{\"title\":\"进阶\",\"level\":\"3.1\",\"depth\":1,\"ref\":\"\",\"articles\":[{\"title\":\"命令行参数\",\"level\":\"3.1.1\",\"depth\":2,\"path\":\"Advanced.md\",\"ref\":\"Advanced.md\",\"articles\":[]},{\"title\":\"SimpleGUI\",\"level\":\"3.1.2\",\"depth\":2,\"path\":\"SimpleGUI.md\",\"ref\":\"SimpleGUI.md\",\"articles\":[]}]},\"previous\":{\"title\":\"入门\",\"level\":\"2.1\",\"depth\":1,\"ref\":\"\",\"articles\":[{\"title\":\"使用入门\",\"level\":\"2.1.1\",\"depth\":2,\"path\":\"Introductory.md\",\"ref\":\"Introductory.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"donate\",\"github\",\"github-buttons\",\"-sharing\",\"sharing-plus\"],\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"github\":{\"url\":\"https://github.com/nilaoda\"},\"search\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"lunr\":{\"maxIndexSize\":1000000,\"ignoreSpecialCharacters\":false},\"donate\":{\"alipay\":\"./source/images/alipay.png\",\"alipayText\":\"支付宝\",\"button\":\"赞赏\",\"title\":\"\",\"wechat\":\"\",\"wechatText\":\"微信打赏\"},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"highlight\":{},\"github-buttons\":{\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]},\"sharing\":{\"qq\":true,\"all\":[\"google\",\"facebook\",\"weibo\",\"twitter\",\"qq\",\"qzone\",\"linkedin\",\"pocket\"],\"douban\":false,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":true,\"linkedin\":false},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false}},\"theme\":\"default\",\"author\":\"nilaoda\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"N_m3u8DL-CLI文档\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"N_m3u8DL-CLI文档\"},\"file\":{\"path\":\"Introductory.md\",\"mtime\":\"2019-09-08T14:16:51.270Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2022-07-11T16:10:30.637Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-donate/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github-buttons/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search-engine.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/lunr.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/search-lunr.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/M3U8URL2File.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>M3U8URL2File · N_m3u8DL-CLI文档</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"nilaoda\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-donate/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-highlight/website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    \n    <link rel=\"prev\" href=\"GetM3u8.html\" />\n    \n\n    <style>\n    @media only screen and (max-width: 640px) {\n        .book-header .hidden-mobile {\n            display: none;\n        }\n    }\n    </style>\n    <script>\n        window[\"gitbook-plugin-github-buttons\"] = {\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]};\n    </script>\n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" >\n            \n                <span>\n            \n                    \n                    简介\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"2.1\" >\n            \n                <span>\n            \n                    \n                    入门\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"2.1.1\" data-path=\"Introductory.html\">\n            \n                <a href=\"Introductory.html\">\n            \n                    \n                    使用入门\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"3.1\" >\n            \n                <span>\n            \n                    \n                    进阶\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"3.1.1\" data-path=\"Advanced.html\">\n            \n                <a href=\"Advanced.html\">\n            \n                    \n                    命令行参数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"3.1.2\" data-path=\"SimpleGUI.html\">\n            \n                <a href=\"SimpleGUI.html\">\n            \n                    \n                    SimpleGUI\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"4.1\" >\n            \n                <span>\n            \n                    \n                    辅助\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"4.1.1\" data-path=\"GetM3u8.html\">\n            \n                <a href=\"GetM3u8.html\">\n            \n                    \n                    JS获取m3u8\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"4.1.2\" data-path=\"M3U8URL2File.html\">\n            \n                <a href=\"M3U8URL2File.html\">\n            \n                    \n                    M3U8URL2File\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >M3U8URL2File</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <h1 id=\"m3u8url2file\">M3U8URL2File</h1>\n<p>&#x4E00;&#x6B3E;&#x5E2E;&#x52A9;&#x4F60;&#x5C06;m3u8&#x94FE;&#x63A5;&#x4E0B;&#x8F7D;&#x4E3A;m3u8&#x6587;&#x4EF6;&#x7684;&#x5C0F;&#x8F6F;&#x4EF6;&#x3002;<br><a href=\"https://github.com/nilaoda/M3U8URL2File/releases\" target=\"_blank\">https://github.com/nilaoda/M3U8URL2File/releases</a></p>\n<h2 id=\"&#x7A0B;&#x5E8F;&#x754C;&#x9762;\">&#x7A0B;&#x5E8F;&#x754C;&#x9762;</h2>\n<p><img src=\"source/images/M3U8URL2File.gif\" alt=\"&#x7A0B;&#x5E8F;&#x754C;&#x9762;\"></p>\n\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"GetM3u8.html\" class=\"navigation navigation-prev navigation-unique\" aria-label=\"Previous page: JS获取m3u8\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"M3U8URL2File\",\"level\":\"4.1.2\",\"depth\":2,\"previous\":{\"title\":\"JS获取m3u8\",\"level\":\"4.1.1\",\"depth\":2,\"path\":\"GetM3u8.md\",\"ref\":\"GetM3u8.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"donate\",\"github\",\"github-buttons\",\"-sharing\",\"sharing-plus\"],\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"github\":{\"url\":\"https://github.com/nilaoda\"},\"search\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"lunr\":{\"maxIndexSize\":1000000,\"ignoreSpecialCharacters\":false},\"donate\":{\"alipay\":\"./source/images/alipay.png\",\"alipayText\":\"支付宝\",\"button\":\"赞赏\",\"title\":\"\",\"wechat\":\"\",\"wechatText\":\"微信打赏\"},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"highlight\":{},\"github-buttons\":{\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]},\"sharing\":{\"qq\":true,\"all\":[\"google\",\"facebook\",\"weibo\",\"twitter\",\"qq\",\"qzone\",\"linkedin\",\"pocket\"],\"douban\":false,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":true,\"linkedin\":false},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false}},\"theme\":\"default\",\"author\":\"nilaoda\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"N_m3u8DL-CLI文档\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"N_m3u8DL-CLI文档\"},\"file\":{\"path\":\"M3U8URL2File.md\",\"mtime\":\"2019-07-10T14:29:24.148Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2022-07-11T16:10:30.637Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-donate/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github-buttons/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search-engine.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/lunr.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/search-lunr.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/SimpleGUI.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>SimpleGUI · N_m3u8DL-CLI文档</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"nilaoda\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-donate/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-highlight/website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    \n    <link rel=\"prev\" href=\"Advanced.html\" />\n    \n\n    <style>\n    @media only screen and (max-width: 640px) {\n        .book-header .hidden-mobile {\n            display: none;\n        }\n    }\n    </style>\n    <script>\n        window[\"gitbook-plugin-github-buttons\"] = {\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]};\n    </script>\n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" >\n            \n                <span>\n            \n                    \n                    简介\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"2.1\" >\n            \n                <span>\n            \n                    \n                    入门\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"2.1.1\" data-path=\"Introductory.html\">\n            \n                <a href=\"Introductory.html\">\n            \n                    \n                    使用入门\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"3.1\" >\n            \n                <span>\n            \n                    \n                    进阶\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"3.1.1\" data-path=\"Advanced.html\">\n            \n                <a href=\"Advanced.html\">\n            \n                    \n                    命令行参数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"3.1.2\" data-path=\"SimpleGUI.html\">\n            \n                <a href=\"SimpleGUI.html\">\n            \n                    \n                    SimpleGUI\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"4.1\" >\n            \n                <span>\n            \n                    \n                    辅助\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"4.1.1\" data-path=\"GetM3u8.html\">\n            \n                <a href=\"GetM3u8.html\">\n            \n                    \n                    JS获取m3u8\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"4.1.2\" data-path=\"M3U8URL2File.html\">\n            \n                <a href=\"M3U8URL2File.html\">\n            \n                    \n                    M3U8URL2File\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >SimpleGUI</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <h1 id=\"&#x6B22;&#x8FCE;&#x4F7F;&#x7528;simplegui\">&#x6B22;&#x8FCE;&#x4F7F;&#x7528;SimpleGUI</h1>\n<h2 id=\"&#x7B80;&#x4ECB;\">&#x7B80;&#x4ECB;</h2>\n<p>&#x9274;&#x4E8E;&#x5927;&#x90E8;&#x5206;&#x7528;&#x6237;&#x5728;&#x4F7F;&#x7528;&#x547D;&#x4EE4;&#x884C;&#x7A0B;&#x5E8F;&#x65F6;&#x611F;&#x53D7;&#x5230;&#x6BD4;&#x8F83;&#x7E41;&#x7410;&#x7684;&#x64CD;&#x4F5C;&#x4F53;&#x9A8C;&#xFF0C;&#x6211;&#x5F00;&#x53D1;&#x4E86;<code>N_m3u8DL-CLI-SimpleG.exe</code>&#x6765;&#x81EA;&#x52A8;&#x5316;&#x751F;&#x4EA7;&#x7EDD;&#x5927;&#x90E8;&#x5206;&#x53C2;&#x6570;&#xFF0C;&#x5927;&#x5927;&#x63D0;&#x9AD8;&#x4E86;&#x4E0B;&#x8F7D;&#x6548;&#x7387;&#x3002;</p>\n<h2 id=\"&#x7A0B;&#x5E8F;&#x754C;&#x9762;\">&#x7A0B;&#x5E8F;&#x754C;&#x9762;</h2>\n<p><img src=\"source/images/GUI.png\" alt=\"&#x7A0B;&#x5E8F;&#x754C;&#x9762;\"></p>\n<h2 id=\"&#x529F;&#x80FD;&#x8BF4;&#x660E;\">&#x529F;&#x80FD;&#x8BF4;&#x660E;</h2>\n<ul>\n<li>&#x7A0B;&#x5E8F;&#x5728;&#x542F;&#x52A8;&#x65F6;&#x4F1A;&#x81EA;&#x52A8;&#x4ECE;&#x526A;&#x8D34;&#x677F;&#x4E2D;&#x5BFB;&#x627E;URL&#xFF0C;&#x8D34;&#x5165;<code>M3U8&#x5730;&#x5740;</code>&#x6587;&#x672C;&#x6846;</li>\n<li>&#x5F53;<code>M3U8&#x5730;&#x5740;</code>&#x6587;&#x672C;&#x6846;&#x4E0D;&#x4E3A;&#x7A7A;&#x65F6;&#xFF0C;&#x53CC;&#x51FB;<code>&#x89C6;&#x9891;&#x6807;&#x9898;</code>&#x6587;&#x672C;&#x6846;&#x65F6;&#xFF0C;&#x7A0B;&#x5E8F;&#x5C06;&#x81EA;&#x52A8;&#x8BC6;&#x522B;&#x60A8;&#x8F93;&#x5165;&#x7684;m3u8&#x5730;&#x5740;&#x5E76;&#x7ED9;&#x51FA;&#x4E00;&#x4E2A;&#x5408;&#x9002;&#x7684;&#x6807;&#x9898;</li>\n<li>&#x652F;&#x6301;&#x6279;&#x91CF;&#x4E0B;&#x8F7D;<blockquote>\n<p>1.&#x5C06;m3u8&#x94FE;&#x63A5;&#x6BCF;&#x884C;&#x4E00;&#x4E2A;&#x5B58;&#x5165;&#x4E00;&#x4E2A;<code>.txt</code>&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x5C06;&#x6587;&#x4EF6;&#x76F4;&#x63A5;&#x62D6;&#x5230;<code>M3U8&#x5730;&#x5740;</code>&#x6587;&#x672C;&#x6846;&#xFF0C;&#x70B9;&#x51FB;<code>GO</code>&#x6309;&#x94AE;<br>2.&#x5C06;m3u8&#x6587;&#x4EF6;&#x5B58;&#x5230;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x5939;&#x4E2D;&#xFF0C;&#x7136;&#x540E;&#x5C06;&#x6587;&#x4EF6;&#x5939;&#x76F4;&#x63A5;&#x62D6;&#x5230;<code>M3U8&#x5730;&#x5740;</code>&#x6587;&#x672C;&#x6846;&#xFF0C;&#x70B9;&#x51FB;<code>GO</code>&#x6309;&#x94AE;<br>3.&#x65B0;&#x5EFA;txt,&#x6BCF;&#x884C;&#x4EE5;<code>name,url</code>&#x5F62;&#x5F0F;&#x5199;</p>\n</blockquote>\n</li>\n<li>&#x5728;<code>M3U8&#x5730;&#x5740;</code>&#x6587;&#x672C;&#x6846;&#x6216;<code>&#x89C6;&#x9891;&#x6807;&#x9898;</code>&#x6587;&#x672C;&#x6846;&#x6309;&#x4E0B;<code>&#x56DE;&#x8F66;</code>&#x952E;&#x65F6;&#xFF0C;&#x53EF;&#x89E6;&#x53D1;&#x4E0B;&#x8F7D;&#xFF1B;&#x4EA6;&#x6216;&#x8005;&#x5728;&#x7A0B;&#x5E8F;&#x754C;&#x9762;&#x6309;&#x4E0B;&#x5FEB;&#x6377;&#x952E;<code>Alt + S</code></li>\n<li>&#x81EA;&#x52A8;&#x4FDD;&#x5B58;&#x914D;&#x7F6E;</li>\n</ul>\n\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"Advanced.html\" class=\"navigation navigation-prev navigation-unique\" aria-label=\"Previous page: 命令行参数\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"SimpleGUI\",\"level\":\"3.1.2\",\"depth\":2,\"next\":{\"title\":\"辅助\",\"level\":\"4.1\",\"depth\":1,\"ref\":\"\",\"articles\":[{\"title\":\"JS获取m3u8\",\"level\":\"4.1.1\",\"depth\":2,\"path\":\"GetM3u8.md\",\"ref\":\"GetM3u8.md\",\"articles\":[]},{\"title\":\"M3U8URL2File\",\"level\":\"4.1.2\",\"depth\":2,\"path\":\"M3U8URL2File.md\",\"ref\":\"M3U8URL2File.md\",\"articles\":[]}]},\"previous\":{\"title\":\"命令行参数\",\"level\":\"3.1.1\",\"depth\":2,\"path\":\"Advanced.md\",\"ref\":\"Advanced.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"donate\",\"github\",\"github-buttons\",\"-sharing\",\"sharing-plus\"],\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"github\":{\"url\":\"https://github.com/nilaoda\"},\"search\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"lunr\":{\"maxIndexSize\":1000000,\"ignoreSpecialCharacters\":false},\"donate\":{\"alipay\":\"./source/images/alipay.png\",\"alipayText\":\"支付宝\",\"button\":\"赞赏\",\"title\":\"\",\"wechat\":\"\",\"wechatText\":\"微信打赏\"},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"highlight\":{},\"github-buttons\":{\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]},\"sharing\":{\"qq\":true,\"all\":[\"google\",\"facebook\",\"weibo\",\"twitter\",\"qq\",\"qzone\",\"linkedin\",\"pocket\"],\"douban\":false,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":true,\"linkedin\":false},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false}},\"theme\":\"default\",\"author\":\"nilaoda\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"N_m3u8DL-CLI文档\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"N_m3u8DL-CLI文档\"},\"file\":{\"path\":\"SimpleGUI.md\",\"mtime\":\"2021-12-07T14:30:52.280Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2022-07-11T16:10:30.637Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-donate/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github-buttons/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search-engine.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/lunr.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/search-lunr.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-donate/plugin.css",
    "content": ".gitbook-donate {\n  padding: 10px 0; margin: 20px auto; width: 90%; text-align: center;\n}\n\n#rewardButton {\n  cursor: pointer;\n  border: 0;\n  outline: 0;\n  border-radius: 100%;\n  padding: 0;\n  margin: 0;\n  letter-spacing: normal;\n  text-transform: none;\n  text-indent: 0px;\n  text-shadow: none;\n}\n#rewardButton span {\n  display: inline-block;\n  width: 80px;\n  height: 35px;\n  line-height: 35px;\n  border-radius: 5px;\n  color: #fff;\n  font-weight: 400;\n  font-style: normal;\n  font-variant: normal;\n  font-stretch: normal;\n  font-size: 18px;\n  font-family: \"Microsoft Yahei\";\n  background: #f44336;\n}\n#rewardButton span:hover {\n  background: #f7877f;\n}\n#QR {\n  padding-top: 20px;\n}\n#QR a {\n  border: 0;\n}\n#QR img {\n  width: 180px;\n  max-width: 100%;\n  display: inline-block;\n  margin: 0.8em 2em 0 2em;\n}\n#wechat:hover p {\n  animation: roll 0.1s infinite linear;\n  -webkit-animation: roll 0.1s infinite linear;\n  -moz-animation: roll 0.1s infinite linear;\n}\n#alipay:hover p {\n  animation: roll 0.1s infinite linear;\n  -webkit-animation: roll 0.1s infinite linear;\n  -moz-animation: roll 0.1s infinite linear;\n}\n@-moz-keyframes roll {\n  from {\n    -webkit-transform: rotateZ(30deg);\n    -moz-transform: rotateZ(30deg);\n    -ms-transform: rotateZ(30deg);\n    -o-transform: rotateZ(30deg);\n    transform: rotateZ(30deg);\n  }\n  to {\n    -webkit-transform: rotateZ(-30deg);\n    -moz-transform: rotateZ(-30deg);\n    -ms-transform: rotateZ(-30deg);\n    -o-transform: rotateZ(-30deg);\n    transform: rotateZ(-30deg);\n  }\n}\n@-webkit-keyframes roll {\n  from {\n    -webkit-transform: rotateZ(30deg);\n    -moz-transform: rotateZ(30deg);\n    -ms-transform: rotateZ(30deg);\n    -o-transform: rotateZ(30deg);\n    transform: rotateZ(30deg);\n  }\n  to {\n    -webkit-transform: rotateZ(-30deg);\n    -moz-transform: rotateZ(-30deg);\n    -ms-transform: rotateZ(-30deg);\n    -o-transform: rotateZ(-30deg);\n    transform: rotateZ(-30deg);\n  }\n}\n@-o-keyframes roll {\n  from {\n    -webkit-transform: rotateZ(30deg);\n    -moz-transform: rotateZ(30deg);\n    -ms-transform: rotateZ(30deg);\n    -o-transform: rotateZ(30deg);\n    transform: rotateZ(30deg);\n  }\n  to {\n    -webkit-transform: rotateZ(-30deg);\n    -moz-transform: rotateZ(-30deg);\n    -ms-transform: rotateZ(-30deg);\n    -o-transform: rotateZ(-30deg);\n    transform: rotateZ(-30deg);\n  }\n}\n@keyframes roll {\n  from {\n    -webkit-transform: rotateZ(30deg);\n    -moz-transform: rotateZ(30deg);\n    -ms-transform: rotateZ(30deg);\n    -o-transform: rotateZ(30deg);\n    transform: rotateZ(30deg);\n  }\n  to {\n    -webkit-transform: rotateZ(-30deg);\n    -moz-transform: rotateZ(-30deg);\n    -ms-transform: rotateZ(-30deg);\n    -o-transform: rotateZ(-30deg);\n    transform: rotateZ(-30deg);\n  }\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-donate/plugin.js",
    "content": "require(['gitbook', 'jQuery'], function(gitbook, $) {\n\tvar wechatURL;\n\tvar alipayURL;\n\tvar titleText;\n\tvar buttonText;\n\tvar wechatText;\n\tvar alipayText;\n\n\tfunction insertDonateLink() {\n    if ($('.gitbook-donate').length === 0 && wechatURL !== undefined && (wechatURL !== '' || alipayURL !== '')) {\n\t\t\tvar html = [\n        '<div class=\"gitbook-donate\">',\n        '<div>' + titleText + '</div>',\n        '<button id=\"rewardButton\" disable=\"enable\" onclick=\"var qr = document.getElementById(\\'QR\\'); if (qr.style.display === \\'none\\') {qr.style.display=\\'block\\';} else {qr.style.display=\\'none\\'}\">',\n        '<span>' + buttonText + '</span>',\n        '</button>',\n        '<div id=\"QR\" style=\"display: none;\">'\n      ];\n\t\t\tif (wechatURL !== '') {\n\t\t\t\thtml = html.concat([\n          '<div id=\"wechat\" style=\"display: inline-block\">',\n\t\t\t\t\t'<a href=\"' + wechatURL + '\" class=\"fancybox\" rel=\"group\">',\n          '<img id=\"wechat_qr\" src=\"' + wechatURL + '\" alt=\"WeChat Pay\"/>',\n\t\t\t\t\t'</a>',\n          '<p>' + wechatText + '</p>',\n          '</div>'\n        ]);\n\t\t\t}\n\t\t\tif (alipayURL !== '') {\n\t\t\t\thtml = html.concat([\n          '<div id=\"alipay\" style=\"display: inline-block\">',\n\t\t\t\t\t'<a href=\"' + alipayURL+ '\" class=\"fancybox\" rel=\"group\">',\n          '<img id=\"alipay_qr\" src=\"' + alipayURL + '\" alt=\"Alipay\"/>',\n\t\t\t\t\t'</a>',\n          '<p>' + alipayText + '</p>', '</div>'\n        ]);\n\t\t\t}\n\t\t\thtml = html.concat(['</div>', '</div>']);\n\t\t\t$('.page-inner section.normal:last').after(html.join(''));\n\t\t}\n\t}\n\n\tgitbook.events.bind('start', function(e, config) {\n    wechatURL = config.donate.wechat || '';\n\t\twechatText = config.donate.wechatText || '微信捐赠';\n\t\talipayURL = config.donate.alipay || '';\n\t\talipayText = config.donate.alipayText || '支付宝捐赠';\n\t\ttitleText = config.donate.title || '';\n\t\tbuttonText = config.donate.button || '赏';\n\t\tinsertDonateLink();\n\t});\n\n\tgitbook.events.bind('page.change', function() {\n\t\tinsertDonateLink();\n\t});\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-fontsettings/fontsettings.js",
    "content": "require(['gitbook', 'jquery'], function(gitbook, $) {\n    // Configuration\n    var MAX_SIZE       = 4,\n        MIN_SIZE       = 0,\n        BUTTON_ID;\n\n    // Current fontsettings state\n    var fontState;\n\n    // Default themes\n    var THEMES = [\n        {\n            config: 'white',\n            text: 'White',\n            id: 0\n        },\n        {\n            config: 'sepia',\n            text: 'Sepia',\n            id: 1\n        },\n        {\n            config: 'night',\n            text: 'Night',\n            id: 2\n        }\n    ];\n\n    // Default font families\n    var FAMILIES = [\n        {\n            config: 'serif',\n            text: 'Serif',\n            id: 0\n        },\n        {\n            config: 'sans',\n            text: 'Sans',\n            id: 1\n        }\n    ];\n\n    // Return configured themes\n    function getThemes() {\n        return THEMES;\n    }\n\n    // Modify configured themes\n    function setThemes(themes) {\n        THEMES = themes;\n        updateButtons();\n    }\n\n    // Return configured font families\n    function getFamilies() {\n        return FAMILIES;\n    }\n\n    // Modify configured font families\n    function setFamilies(families) {\n        FAMILIES = families;\n        updateButtons();\n    }\n\n    // Save current font settings\n    function saveFontSettings() {\n        gitbook.storage.set('fontState', fontState);\n        update();\n    }\n\n    // Increase font size\n    function enlargeFontSize(e) {\n        e.preventDefault();\n        if (fontState.size >= MAX_SIZE) return;\n\n        fontState.size++;\n        saveFontSettings();\n    }\n\n    // Decrease font size\n    function reduceFontSize(e) {\n        e.preventDefault();\n        if (fontState.size <= MIN_SIZE) return;\n\n        fontState.size--;\n        saveFontSettings();\n    }\n\n    // Change font family\n    function changeFontFamily(configName, e) {\n        if (e && e instanceof Event) {\n            e.preventDefault();\n        }\n\n        var familyId = getFontFamilyId(configName);\n        fontState.family = familyId;\n        saveFontSettings();\n    }\n\n    // Change type of color theme\n    function changeColorTheme(configName, e) {\n        if (e && e instanceof Event) {\n            e.preventDefault();\n        }\n\n        var $book = gitbook.state.$book;\n\n        // Remove currently applied color theme\n        if (fontState.theme !== 0)\n            $book.removeClass('color-theme-'+fontState.theme);\n\n        // Set new color theme\n        var themeId = getThemeId(configName);\n        fontState.theme = themeId;\n        if (fontState.theme !== 0)\n            $book.addClass('color-theme-'+fontState.theme);\n\n        saveFontSettings();\n    }\n\n    // Return the correct id for a font-family config key\n    // Default to first font-family\n    function getFontFamilyId(configName) {\n        // Search for plugin configured font family\n        var configFamily = $.grep(FAMILIES, function(family) {\n            return family.config == configName;\n        })[0];\n        // Fallback to default font family\n        return (!!configFamily)? configFamily.id : 0;\n    }\n\n    // Return the correct id for a theme config key\n    // Default to first theme\n    function getThemeId(configName) {\n        // Search for plugin configured theme\n        var configTheme = $.grep(THEMES, function(theme) {\n            return theme.config == configName;\n        })[0];\n        // Fallback to default theme\n        return (!!configTheme)? configTheme.id : 0;\n    }\n\n    function update() {\n        var $book = gitbook.state.$book;\n\n        $('.font-settings .font-family-list li').removeClass('active');\n        $('.font-settings .font-family-list li:nth-child('+(fontState.family+1)+')').addClass('active');\n\n        $book[0].className = $book[0].className.replace(/\\bfont-\\S+/g, '');\n        $book.addClass('font-size-'+fontState.size);\n        $book.addClass('font-family-'+fontState.family);\n\n        if(fontState.theme !== 0) {\n            $book[0].className = $book[0].className.replace(/\\bcolor-theme-\\S+/g, '');\n            $book.addClass('color-theme-'+fontState.theme);\n        }\n    }\n\n    function init(config) {\n        // Search for plugin configured font family\n        var configFamily = getFontFamilyId(config.family),\n            configTheme = getThemeId(config.theme);\n\n        // Instantiate font state object\n        fontState = gitbook.storage.get('fontState', {\n            size:   config.size || 2,\n            family: configFamily,\n            theme:  configTheme\n        });\n\n        update();\n    }\n\n    function updateButtons() {\n        // Remove existing fontsettings buttons\n        if (!!BUTTON_ID) {\n            gitbook.toolbar.removeButton(BUTTON_ID);\n        }\n\n        // Create buttons in toolbar\n        BUTTON_ID = gitbook.toolbar.createButton({\n            icon: 'fa fa-font',\n            label: 'Font Settings',\n            className: 'font-settings',\n            dropdown: [\n                [\n                    {\n                        text: 'A',\n                        className: 'font-reduce',\n                        onClick: reduceFontSize\n                    },\n                    {\n                        text: 'A',\n                        className: 'font-enlarge',\n                        onClick: enlargeFontSize\n                    }\n                ],\n                $.map(FAMILIES, function(family) {\n                    family.onClick = function(e) {\n                        return changeFontFamily(family.config, e);\n                    };\n\n                    return family;\n                }),\n                $.map(THEMES, function(theme) {\n                    theme.onClick = function(e) {\n                        return changeColorTheme(theme.config, e);\n                    };\n\n                    return theme;\n                })\n            ]\n        });\n    }\n\n    // Init configuration at start\n    gitbook.events.bind('start', function(e, config) {\n        var opts = config.fontsettings;\n\n        // Generate buttons at start\n        updateButtons();\n\n        // Init current settings\n        init(opts);\n    });\n\n    // Expose API\n    gitbook.fontsettings = {\n        enlargeFontSize: enlargeFontSize,\n        reduceFontSize:  reduceFontSize,\n        setTheme:        changeColorTheme,\n        setFamily:       changeFontFamily,\n        getThemes:       getThemes,\n        setThemes:       setThemes,\n        getFamilies:     getFamilies,\n        setFamilies:     setFamilies\n    };\n});\n\n\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-fontsettings/website.css",
    "content": "/*\n * Theme 1\n */\n.color-theme-1 .dropdown-menu {\n  background-color: #111111;\n  border-color: #7e888b;\n}\n.color-theme-1 .dropdown-menu .dropdown-caret .caret-inner {\n  border-bottom: 9px solid #111111;\n}\n.color-theme-1 .dropdown-menu .buttons {\n  border-color: #7e888b;\n}\n.color-theme-1 .dropdown-menu .button {\n  color: #afa790;\n}\n.color-theme-1 .dropdown-menu .button:hover {\n  color: #73553c;\n}\n/*\n * Theme 2\n */\n.color-theme-2 .dropdown-menu {\n  background-color: #2d3143;\n  border-color: #272a3a;\n}\n.color-theme-2 .dropdown-menu .dropdown-caret .caret-inner {\n  border-bottom: 9px solid #2d3143;\n}\n.color-theme-2 .dropdown-menu .buttons {\n  border-color: #272a3a;\n}\n.color-theme-2 .dropdown-menu .button {\n  color: #62677f;\n}\n.color-theme-2 .dropdown-menu .button:hover {\n  color: #f4f4f5;\n}\n.book .book-header .font-settings .font-enlarge {\n  line-height: 30px;\n  font-size: 1.4em;\n}\n.book .book-header .font-settings .font-reduce {\n  line-height: 30px;\n  font-size: 1em;\n}\n.book.color-theme-1 .book-body {\n  color: #704214;\n  background: #f3eacb;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section {\n  background: #f3eacb;\n}\n.book.color-theme-2 .book-body {\n  color: #bdcadb;\n  background: #1c1f2b;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section {\n  background: #1c1f2b;\n}\n.book.font-size-0 .book-body .page-inner section {\n  font-size: 1.2rem;\n}\n.book.font-size-1 .book-body .page-inner section {\n  font-size: 1.4rem;\n}\n.book.font-size-2 .book-body .page-inner section {\n  font-size: 1.6rem;\n}\n.book.font-size-3 .book-body .page-inner section {\n  font-size: 2.2rem;\n}\n.book.font-size-4 .book-body .page-inner section {\n  font-size: 4rem;\n}\n.book.font-family-0 {\n  font-family: Georgia, serif;\n}\n.book.font-family-1 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal {\n  color: #704214;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a {\n  color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 {\n  border-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr {\n  background-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote {\n  border-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code {\n  background: #fdf6e3;\n  color: #657b83;\n  border-color: #f8df9c;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight {\n  background-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td {\n  border-color: #f5d06c;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr {\n  color: inherit;\n  background-color: #fdf6e3;\n  border-color: #444444;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) {\n  background-color: #fbeecb;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal {\n  color: #bdcadb;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a {\n  color: #3eb1d0;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: #fffffa;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 {\n  border-color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr {\n  background-color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote {\n  border-color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code {\n  color: #9dbed8;\n  background: #2d3143;\n  border-color: #2d3143;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight {\n  background-color: #282a39;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td {\n  border-color: #3b3f54;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr {\n  color: #b6c2d2;\n  background-color: #2d3143;\n  border-color: #3b3f54;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) {\n  background-color: #35394b;\n}\n.book.color-theme-1 .book-header {\n  color: #afa790;\n  background: transparent;\n}\n.book.color-theme-1 .book-header .btn {\n  color: #afa790;\n}\n.book.color-theme-1 .book-header .btn:hover {\n  color: #73553c;\n  background: none;\n}\n.book.color-theme-1 .book-header h1 {\n  color: #704214;\n}\n.book.color-theme-2 .book-header {\n  color: #7e888b;\n  background: transparent;\n}\n.book.color-theme-2 .book-header .btn {\n  color: #3b3f54;\n}\n.book.color-theme-2 .book-header .btn:hover {\n  color: #fffff5;\n  background: none;\n}\n.book.color-theme-2 .book-header h1 {\n  color: #bdcadb;\n}\n.book.color-theme-1 .book-body .navigation {\n  color: #afa790;\n}\n.book.color-theme-1 .book-body .navigation:hover {\n  color: #73553c;\n}\n.book.color-theme-2 .book-body .navigation {\n  color: #383f52;\n}\n.book.color-theme-2 .book-body .navigation:hover {\n  color: #fffff5;\n}\n/*\n * Theme 1\n */\n.book.color-theme-1 .book-summary {\n  color: #afa790;\n  background: #111111;\n  border-right: 1px solid rgba(0, 0, 0, 0.07);\n}\n.book.color-theme-1 .book-summary .book-search {\n  background: transparent;\n}\n.book.color-theme-1 .book-summary .book-search input,\n.book.color-theme-1 .book-summary .book-search input:focus {\n  border: 1px solid transparent;\n}\n.book.color-theme-1 .book-summary ul.summary li.divider {\n  background: #7e888b;\n  box-shadow: none;\n}\n.book.color-theme-1 .book-summary ul.summary li i.fa-check {\n  color: #33cc33;\n}\n.book.color-theme-1 .book-summary ul.summary li.done > a {\n  color: #877f6a;\n}\n.book.color-theme-1 .book-summary ul.summary li a,\n.book.color-theme-1 .book-summary ul.summary li span {\n  color: #877f6a;\n  background: transparent;\n  font-weight: normal;\n}\n.book.color-theme-1 .book-summary ul.summary li.active > a,\n.book.color-theme-1 .book-summary ul.summary li a:hover {\n  color: #704214;\n  background: transparent;\n  font-weight: normal;\n}\n/*\n * Theme 2\n */\n.book.color-theme-2 .book-summary {\n  color: #bcc1d2;\n  background: #2d3143;\n  border-right: none;\n}\n.book.color-theme-2 .book-summary .book-search {\n  background: transparent;\n}\n.book.color-theme-2 .book-summary .book-search input,\n.book.color-theme-2 .book-summary .book-search input:focus {\n  border: 1px solid transparent;\n}\n.book.color-theme-2 .book-summary ul.summary li.divider {\n  background: #272a3a;\n  box-shadow: none;\n}\n.book.color-theme-2 .book-summary ul.summary li i.fa-check {\n  color: #33cc33;\n}\n.book.color-theme-2 .book-summary ul.summary li.done > a {\n  color: #62687f;\n}\n.book.color-theme-2 .book-summary ul.summary li a,\n.book.color-theme-2 .book-summary ul.summary li span {\n  color: #c1c6d7;\n  background: transparent;\n  font-weight: 600;\n}\n.book.color-theme-2 .book-summary ul.summary li.active > a,\n.book.color-theme-2 .book-summary ul.summary li a:hover {\n  color: #f4f4f5;\n  background: #252737;\n  font-weight: 600;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-github/plugin.js",
    "content": "require([ 'gitbook' ], function (gitbook) {\n    gitbook.events.bind('start', function (e, config) {\n        var githubURL = config.github.url;\n\n        gitbook.toolbar.createButton({\n            icon: 'fa fa-github',\n            label: 'GitHub',\n            position: 'right',\n            onClick: function() {\n                window.open(githubURL)\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-github-buttons/plugin.js",
    "content": "// LICENSE : MIT\n\"use strict\";\nrequire(['gitbook'], function (gitbook) {\n    function addBeforeHeader(element) {\n        jQuery('.book-header > h1').before(element);\n    }\n\n    function createButton(_ref) {\n        var user = _ref.user;\n        var repo = _ref.repo;\n        var type = _ref.type;\n        var size = _ref.size;\n        var width = _ref.width;\n        var height = _ref.height;\n        var count = _ref.count;\n\n        var extraParam = type === \"watch\" ? \"&v=2\" : \"\";\n        return '<a class=\"btn pull-right hidden-mobile\" aria-label=\"github\">\\n            <iframe\\n                style=\"display:inline-block;vertical-align:middle;\"\\n                src=\"https://ghbtns.com/github-btn.html?user=' + user + '&repo=' + repo + '&type=' + type + '&count=' + count + '&size=' + size + extraParam + '\"\\n                frameborder=\"0\"\\n                scrolling=\"0\"\\n                width=\"' + width + 'px\"\\n                height=\"' + height + 'px\"\\n            ></iframe>\\n        </a>';\n    }\n\n    function createUserButton(_ref2) {\n        var user = _ref2.user;\n        var size = _ref2.size;\n        var width = _ref2.width;\n        var height = _ref2.height;\n        var count = _ref2.count;\n\n        return '<a class=\"btn pull-right hidden-mobile\" aria-label=\"github\">\\n            <iframe\\n                style=\"display:inline-block;vertical-align:middle;\"\\n                src=\"https://ghbtns.com/github-btn.html?user=' + user + '&type=follow&count=' + count + '&size=' + size + '\"\\n                frameborder=\"0\"\\n                scrolling=\"0\"\\n                width=\"' + width + 'px\"\\n                height=\"' + height + 'px\"\\n            ></iframe>\\n        </a>';\n    }\n\n    function insertGitHubLink(button) {\n        var user = button.user;\n        var repo = button.repo;\n        var type = button.type;\n        var size = button.size;\n        var width = button.width;\n        var height = button.height;\n        var count = button.count;\n\n        var size = size || \"large\";\n        var width = width || (size === \"large\" ? \"150\" : \"100\");\n        var height = height || (size === \"large\" ? \"30\" : \"20\");\n        var count = typeof count === \"boolean\" ? count : false;\n\n        if (type === 'follow') {\n            var elementString = createUserButton({\n                user: user,\n                size: size,\n                width: width,\n                height: height,\n                count: count\n            });\n        } else {\n            var elementString = createButton({\n                user: user,\n                repo: repo,\n                type: type,\n                size: size,\n                width: width,\n                height: height,\n                count: count\n            });\n        }\n        addBeforeHeader(elementString);\n    }\n\n    function init(config) {\n        config.buttons.forEach(insertGitHubLink);\n    }\n\n    // injected by html hook\n    function getPluginConfig() {\n        return window[\"gitbook-plugin-github-buttons\"];\n    }\n\n    // make sure configuration gets injected\n    gitbook.events.bind('start', function (e, config) {\n        window[\"gitbook-plugin-github-buttons\"] = config[\"github-buttons\"];\n    });\n\n    gitbook.events.bind('page.change', function () {\n        init(getPluginConfig());\n    });\n});\n//# sourceMappingURL=plugin.js.map"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-highlight/ebook.css",
    "content": "pre,\ncode {\n  /* http://jmblog.github.io/color-themes-for-highlightjs */\n  /* Tomorrow Comment */\n  /* Tomorrow Red */\n  /* Tomorrow Orange */\n  /* Tomorrow Yellow */\n  /* Tomorrow Green */\n  /* Tomorrow Aqua */\n  /* Tomorrow Blue */\n  /* Tomorrow Purple */\n}\npre .hljs-comment,\ncode .hljs-comment,\npre .hljs-title,\ncode .hljs-title {\n  color: #8e908c;\n}\npre .hljs-variable,\ncode .hljs-variable,\npre .hljs-attribute,\ncode .hljs-attribute,\npre .hljs-tag,\ncode .hljs-tag,\npre .hljs-regexp,\ncode .hljs-regexp,\npre .hljs-deletion,\ncode .hljs-deletion,\npre .ruby .hljs-constant,\ncode .ruby .hljs-constant,\npre .xml .hljs-tag .hljs-title,\ncode .xml .hljs-tag .hljs-title,\npre .xml .hljs-pi,\ncode .xml .hljs-pi,\npre .xml .hljs-doctype,\ncode .xml .hljs-doctype,\npre .html .hljs-doctype,\ncode .html .hljs-doctype,\npre .css .hljs-id,\ncode .css .hljs-id,\npre .css .hljs-class,\ncode .css .hljs-class,\npre .css .hljs-pseudo,\ncode .css .hljs-pseudo {\n  color: #c82829;\n}\npre .hljs-number,\ncode .hljs-number,\npre .hljs-preprocessor,\ncode .hljs-preprocessor,\npre .hljs-pragma,\ncode .hljs-pragma,\npre .hljs-built_in,\ncode .hljs-built_in,\npre .hljs-literal,\ncode .hljs-literal,\npre .hljs-params,\ncode .hljs-params,\npre .hljs-constant,\ncode .hljs-constant {\n  color: #f5871f;\n}\npre .ruby .hljs-class .hljs-title,\ncode .ruby .hljs-class .hljs-title,\npre .css .hljs-rules .hljs-attribute,\ncode .css .hljs-rules .hljs-attribute {\n  color: #eab700;\n}\npre .hljs-string,\ncode .hljs-string,\npre .hljs-value,\ncode .hljs-value,\npre .hljs-inheritance,\ncode .hljs-inheritance,\npre .hljs-header,\ncode .hljs-header,\npre .hljs-addition,\ncode .hljs-addition,\npre .ruby .hljs-symbol,\ncode .ruby .hljs-symbol,\npre .xml .hljs-cdata,\ncode .xml .hljs-cdata {\n  color: #718c00;\n}\npre .css .hljs-hexcolor,\ncode .css .hljs-hexcolor {\n  color: #3e999f;\n}\npre .hljs-function,\ncode .hljs-function,\npre .python .hljs-decorator,\ncode .python .hljs-decorator,\npre .python .hljs-title,\ncode .python .hljs-title,\npre .ruby .hljs-function .hljs-title,\ncode .ruby .hljs-function .hljs-title,\npre .ruby .hljs-title .hljs-keyword,\ncode .ruby .hljs-title .hljs-keyword,\npre .perl .hljs-sub,\ncode .perl .hljs-sub,\npre .javascript .hljs-title,\ncode .javascript .hljs-title,\npre .coffeescript .hljs-title,\ncode .coffeescript .hljs-title {\n  color: #4271ae;\n}\npre .hljs-keyword,\ncode .hljs-keyword,\npre .javascript .hljs-function,\ncode .javascript .hljs-function {\n  color: #8959a8;\n}\npre .hljs,\ncode .hljs {\n  display: block;\n  background: white;\n  color: #4d4d4c;\n  padding: 0.5em;\n}\npre .coffeescript .javascript,\ncode .coffeescript .javascript,\npre .javascript .xml,\ncode .javascript .xml,\npre .tex .hljs-formula,\ncode .tex .hljs-formula,\npre .xml .javascript,\ncode .xml .javascript,\npre .xml .vbscript,\ncode .xml .vbscript,\npre .xml .css,\ncode .xml .css,\npre .xml .hljs-cdata,\ncode .xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-highlight/website.css",
    "content": ".book .book-body .page-wrapper .page-inner section.normal pre,\n.book .book-body .page-wrapper .page-inner section.normal code {\n  /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n  /* Tomorrow Comment */\n  /* Tomorrow Red */\n  /* Tomorrow Orange */\n  /* Tomorrow Yellow */\n  /* Tomorrow Green */\n  /* Tomorrow Aqua */\n  /* Tomorrow Blue */\n  /* Tomorrow Purple */\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-comment,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-comment,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-title {\n  color: #8e908c;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-variable,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-variable,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-attribute,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-tag,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-tag,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-regexp,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-deletion,\n.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant,\n.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype,\n.book .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype,\n.book .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype,\n.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id,\n.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-id,\n.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class,\n.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-class,\n.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo,\n.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo {\n  color: #c82829;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-number,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-number,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-pragma,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-literal,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-literal,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-params,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-params,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-constant,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-constant {\n  color: #f5871f;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute,\n.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute {\n  color: #eab700;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-string,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-string,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-value,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-value,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-header,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-header,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-addition,\n.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol,\n.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata {\n  color: #718c00;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor,\n.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor {\n  color: #3e999f;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-function,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-function,\n.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator,\n.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator,\n.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword,\n.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword,\n.book .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub,\n.book .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub,\n.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title {\n  color: #4271ae;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-keyword,\n.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function,\n.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function {\n  color: #8959a8;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs {\n  display: block;\n  background: white;\n  color: #4d4d4c;\n  padding: 0.5em;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript,\n.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript,\n.book .book-body .page-wrapper .page-inner section.normal pre .javascript .xml,\n.book .book-body .page-wrapper .page-inner section.normal code .javascript .xml,\n.book .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula,\n.book .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .javascript,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .javascript,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .vbscript,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .css,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .css,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata {\n  opacity: 0.5;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code {\n  /*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n  /* Solarized Green */\n  /* Solarized Cyan */\n  /* Solarized Blue */\n  /* Solarized Yellow */\n  /* Solarized Orange */\n  /* Solarized Red */\n  /* Solarized Violet */\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs {\n  display: block;\n  padding: 0.5em;\n  background: #fdf6e3;\n  color: #657b83;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-comment,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template_comment,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template_comment,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-header,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-header,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctype,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctype,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pi,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pi,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-javadoc,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-javadoc {\n  color: #93a1a1;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-winutils,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-winutils,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .method,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .method,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-addition,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-tag,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-tag,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-request,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-request,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-status,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-status,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .nginx .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .nginx .hljs-title {\n  color: #859900;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-number,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-number,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-command,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-command,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag .hljs-value,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-tag .hljs-value,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-rules .hljs-value,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-rules .hljs-value,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-phpdoc,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-phpdoc,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-hexcolor,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-hexcolor,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_url,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_url {\n  color: #2aa198;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-localvars,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-localvars,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-chunk,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-chunk,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-decorator,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-decorator,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-identifier,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-identifier,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .vhdl .hljs-literal,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .vhdl .hljs-literal,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-id,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-id,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-function,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-function {\n  color: #268bd2;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-body,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-body,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .smalltalk .hljs-number,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .smalltalk .hljs-number,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-constant,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-parent,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-parent,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .haskell .hljs-type,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .haskell .hljs-type,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_reference,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_reference {\n  color: #b58900;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor .hljs-keyword,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor .hljs-keyword,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-shebang,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-shebang,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-change,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-change,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-special,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-special,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr_selector,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr_selector,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-subst,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-subst,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-cdata,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-cdata,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .clojure .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .clojure .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-header,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-header {\n  color: #cb4b16;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-important,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-important {\n  color: #dc322f;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_label,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_label {\n  color: #6c71c4;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula {\n  background: #eee8d5;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code {\n  /* Tomorrow Night Bright Theme */\n  /* Original theme - https://github.com/chriskempson/tomorrow-theme */\n  /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n  /* Tomorrow Comment */\n  /* Tomorrow Red */\n  /* Tomorrow Orange */\n  /* Tomorrow Yellow */\n  /* Tomorrow Green */\n  /* Tomorrow Aqua */\n  /* Tomorrow Blue */\n  /* Tomorrow Purple */\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-comment,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title {\n  color: #969896;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-variable,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-tag,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-id,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-class,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo {\n  color: #d54e53;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-number,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-number,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-literal,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-params,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-params,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-constant {\n  color: #e78c45;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute {\n  color: #e7c547;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-string,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-string,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-value,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-value,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-header,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-header,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-addition,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata {\n  color: #b9ca4a;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor {\n  color: #70c0b1;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-function,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-function,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title {\n  color: #7aa6da;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function {\n  color: #c397d8;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs {\n  display: block;\n  background: black;\n  color: #eaeaea;\n  padding: 0.5em;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .xml,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .xml,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .javascript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .javascript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .vbscript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .css,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .css,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-lunr/search-lunr.js",
    "content": "require([\n    'gitbook',\n    'jquery'\n], function(gitbook, $) {\n    // Define global search engine\n    function LunrSearchEngine() {\n        this.index = null;\n        this.store = {};\n        this.name = 'LunrSearchEngine';\n    }\n\n    // Initialize lunr by fetching the search index\n    LunrSearchEngine.prototype.init = function() {\n        var that = this;\n        var d = $.Deferred();\n\n        $.getJSON(gitbook.state.basePath+'/search_index.json')\n        .then(function(data) {\n            // eslint-disable-next-line no-undef\n            that.index = lunr.Index.load(data.index);\n            that.store = data.store;\n            d.resolve();\n        });\n\n        return d.promise();\n    };\n\n    // Search for a term and return results\n    LunrSearchEngine.prototype.search = function(q, offset, length) {\n        var that = this;\n        var results = [];\n\n        if (this.index) {\n            results = $.map(this.index.search(q), function(result) {\n                var doc = that.store[result.ref];\n\n                return {\n                    title: doc.title,\n                    url: doc.url,\n                    body: doc.summary || doc.body\n                };\n            });\n        }\n\n        return $.Deferred().resolve({\n            query: q,\n            results: results.slice(0, length),\n            count: results.length\n        }).promise();\n    };\n\n    // Set gitbook research\n    gitbook.events.bind('start', function(e, config) {\n        var engine = gitbook.search.getEngine();\n        if (!engine) {\n            gitbook.search.setEngine(LunrSearchEngine, config);\n        }\n    });\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-search/search-engine.js",
    "content": "require([\n    'gitbook',\n    'jquery'\n], function(gitbook, $) {\n    // Global search objects\n    var engine      = null;\n    var initialized = false;\n\n    // Set a new search engine\n    function setEngine(Engine, config) {\n        initialized = false;\n        engine      = new Engine(config);\n\n        init(config);\n    }\n\n    // Initialize search engine with config\n    function init(config) {\n        if (!engine) throw new Error('No engine set for research. Set an engine using gitbook.research.setEngine(Engine).');\n\n        return engine.init(config)\n        .then(function() {\n            initialized = true;\n            gitbook.events.trigger('search.ready');\n        });\n    }\n\n    // Launch search for query q\n    function query(q, offset, length) {\n        if (!initialized) throw new Error('Search has not been initialized');\n        return engine.search(q, offset, length);\n    }\n\n    // Get stats about search\n    function getEngine() {\n        return engine? engine.name : null;\n    }\n\n    function isInitialized() {\n        return initialized;\n    }\n\n    // Initialize gitbook.search\n    gitbook.search = {\n        setEngine:     setEngine,\n        getEngine:     getEngine,\n        query:         query,\n        isInitialized: isInitialized\n    };\n});"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-search/search.css",
    "content": "/*\n    This CSS only styled the search results section, not the search input\n    It defines the basic interraction to hide content when displaying results, etc\n*/\n#book-search-results .search-results {\n  display: none;\n}\n#book-search-results .search-results ul.search-results-list {\n  list-style-type: none;\n  padding-left: 0;\n}\n#book-search-results .search-results ul.search-results-list li {\n  margin-bottom: 1.5rem;\n  padding-bottom: 0.5rem;\n  /* Highlight results */\n}\n#book-search-results .search-results ul.search-results-list li p em {\n  background-color: rgba(255, 220, 0, 0.4);\n  font-style: normal;\n}\n#book-search-results .search-results .no-results {\n  display: none;\n}\n#book-search-results.open .search-results {\n  display: block;\n}\n#book-search-results.open .search-noresults {\n  display: none;\n}\n#book-search-results.no-results .search-results .has-results {\n  display: none;\n}\n#book-search-results.no-results .search-results .no-results {\n  display: block;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-search/search.js",
    "content": "require([\n    'gitbook',\n    'jquery'\n], function(gitbook, $) {\n    var MAX_RESULTS = 15;\n    var MAX_DESCRIPTION_SIZE = 500;\n\n    var usePushState = (typeof history.pushState !== 'undefined');\n\n    // DOM Elements\n    var $body = $('body');\n    var $bookSearchResults;\n    var $searchInput;\n    var $searchList;\n    var $searchTitle;\n    var $searchResultsCount;\n    var $searchQuery;\n\n    // Throttle search\n    function throttle(fn, wait) {\n        var timeout;\n\n        return function() {\n            var ctx = this, args = arguments;\n            if (!timeout) {\n                timeout = setTimeout(function() {\n                    timeout = null;\n                    fn.apply(ctx, args);\n                }, wait);\n            }\n        };\n    }\n\n    function displayResults(res) {\n        $bookSearchResults.addClass('open');\n\n        var noResults = res.count == 0;\n        $bookSearchResults.toggleClass('no-results', noResults);\n\n        // Clear old results\n        $searchList.empty();\n\n        // Display title for research\n        $searchResultsCount.text(res.count);\n        $searchQuery.text(res.query);\n\n        // Create an <li> element for each result\n        res.results.forEach(function(res) {\n            var $li = $('<li>', {\n                'class': 'search-results-item'\n            });\n\n            var $title = $('<h3>');\n\n            var $link = $('<a>', {\n                'href': gitbook.state.basePath + '/' + res.url,\n                'text': res.title\n            });\n\n            var content = res.body.trim();\n            if (content.length > MAX_DESCRIPTION_SIZE) {\n                content = content.slice(0, MAX_DESCRIPTION_SIZE).trim()+'...';\n            }\n            var $content = $('<p>').html(content);\n\n            $link.appendTo($title);\n            $title.appendTo($li);\n            $content.appendTo($li);\n            $li.appendTo($searchList);\n        });\n    }\n\n    function launchSearch(q) {\n        // Add class for loading\n        $body.addClass('with-search');\n        $body.addClass('search-loading');\n\n        // Launch search query\n        throttle(gitbook.search.query(q, 0, MAX_RESULTS)\n        .then(function(results) {\n            displayResults(results);\n        })\n        .always(function() {\n            $body.removeClass('search-loading');\n        }), 1000);\n    }\n\n    function closeSearch() {\n        $body.removeClass('with-search');\n        $bookSearchResults.removeClass('open');\n    }\n\n    function launchSearchFromQueryString() {\n        var q = getParameterByName('q');\n        if (q && q.length > 0) {\n            // Update search input\n            $searchInput.val(q);\n\n            // Launch search\n            launchSearch(q);\n        }\n    }\n\n    function bindSearch() {\n        // Bind DOM\n        $searchInput        = $('#book-search-input input');\n        $bookSearchResults  = $('#book-search-results');\n        $searchList         = $bookSearchResults.find('.search-results-list');\n        $searchTitle        = $bookSearchResults.find('.search-results-title');\n        $searchResultsCount = $searchTitle.find('.search-results-count');\n        $searchQuery        = $searchTitle.find('.search-query');\n\n        // Launch query based on input content\n        function handleUpdate() {\n            var q = $searchInput.val();\n\n            if (q.length == 0) {\n                closeSearch();\n            }\n            else {\n                launchSearch(q);\n            }\n        }\n\n        // Detect true content change in search input\n        // Workaround for IE < 9\n        var propertyChangeUnbound = false;\n        $searchInput.on('propertychange', function(e) {\n            if (e.originalEvent.propertyName == 'value') {\n                handleUpdate();\n            }\n        });\n\n        // HTML5 (IE9 & others)\n        $searchInput.on('input', function(e) {\n            // Unbind propertychange event for IE9+\n            if (!propertyChangeUnbound) {\n                $(this).unbind('propertychange');\n                propertyChangeUnbound = true;\n            }\n\n            handleUpdate();\n        });\n\n        // Push to history on blur\n        $searchInput.on('blur', function(e) {\n            // Update history state\n            if (usePushState) {\n                var uri = updateQueryString('q', $(this).val());\n                history.pushState({ path: uri }, null, uri);\n            }\n        });\n    }\n\n    gitbook.events.on('page.change', function() {\n        bindSearch();\n        closeSearch();\n\n        // Launch search based on query parameter\n        if (gitbook.search.isInitialized()) {\n            launchSearchFromQueryString();\n        }\n    });\n\n    gitbook.events.on('search.ready', function() {\n        bindSearch();\n\n        // Launch search from query param at start\n        launchSearchFromQueryString();\n    });\n\n    function getParameterByName(name) {\n        var url = window.location.href;\n        name = name.replace(/[\\[\\]]/g, '\\\\$&');\n        var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)', 'i'),\n            results = regex.exec(url);\n        if (!results) return null;\n        if (!results[2]) return '';\n        return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n    }\n\n    function updateQueryString(key, value) {\n        value = encodeURIComponent(value);\n\n        var url = window.location.href;\n        var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'),\n            hash;\n\n        if (re.test(url)) {\n            if (typeof value !== 'undefined' && value !== null)\n                return url.replace(re, '$1' + key + '=' + value + '$2$3');\n            else {\n                hash = url.split('#');\n                url = hash[0].replace(re, '$1$3').replace(/(&|\\?)$/, '');\n                if (typeof hash[1] !== 'undefined' && hash[1] !== null)\n                    url += '#' + hash[1];\n                return url;\n            }\n        }\n        else {\n            if (typeof value !== 'undefined' && value !== null) {\n                var separator = url.indexOf('?') !== -1 ? '&' : '?';\n                hash = url.split('#');\n                url = hash[0] + separator + key + '=' + value;\n                if (typeof hash[1] !== 'undefined' && hash[1] !== null)\n                    url += '#' + hash[1];\n                return url;\n            }\n            else\n                return url;\n        }\n    }\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-sharing-plus/buttons.js",
    "content": "require(['gitbook', 'jquery'], function(gitbook, $) {\n    function site(label, icon, link) {\n        return {\n            label: label,\n            icon: 'fa fa-' + icon,\n            onClick: function (e) {\n                e.preventDefault();\n                window.open(link);\n            }\n        };\n    }\n\n    var url = encodeURIComponent(location.href);\n    var title = encodeURIComponent(document.title);\n\n    var SITES = {\n        douban: site('豆瓣', 'share', 'http://shuo.douban.com/!service/share?href=' + url + '&name=' + title),\n        facebook: site('Facebook', 'facebook', 'http://www.facebook.com/sharer/sharer.php?s=100&p[url]=' + url),\n        google: site('Google+', 'google-plus', 'https://plus.google.com/share?url=' + url),\n        hatenaBookmark: site('はてなブックマーク', 'bold', 'http://b.hatena.ne.jp/entry/' + url),\n        instapaper: site('instapaper', 'instapaper', 'http://www.instapaper.com/text?u=' + url),\n        line: site('LINE', 'comment', 'http://line.me/R/msg/text/?' + title + ' ' + url),\n        linkedin: site('Linkedin', 'linkedin', 'https://www.linkedin.com/shareArticle?mini=true&url=' + url),\n        messenger: site('Facebook Messenger', 'commenting', 'fb-messenger://share?link=' + url),\n        pocket: site('Pocket', 'get-pocket', 'https://getpocket.com/save?url=' + url + '&title=' + title),\n        qq: site('QQ', 'qq', 'http://connect.qq.com/widget/shareqq/index.html?url=' + url + '&title=' + title),\n        qzone: site('QQ空间', 'star', 'http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + url + '&title=' + title),\n        stumbleupon: site('StumbleUpon', 'stumbleupon', 'http://www.stumbleupon.com/submit?url=' + url + '&title=' + title),\n        twitter: site('Twitter', 'twitter', 'https://twitter.com/intent/tweet?url=' + title + '&text=' + title),\n        viber: site('Viber', 'volume-control-phone', 'viber://forward?text='+ url + ' ' + title),\n        vk: site('VK', 'vk', 'http://vkontakte.ru/share.php?url=' + url),\n        weibo: site('新浪微博', 'weibo', 'http://service.weibo.com/share/share.php?content=utf-8&url=' + url + '&title=' + title),\n        whatsapp: site('WhatsApp', 'whatsapp', 'whatsapp://send?text='+ url + ' ' + title),\n    };\n\n    gitbook.events.bind('start', function(e, config) {\n        var opts = config.sharing;\n\n        // Create dropdown menu\n        var menu = $.map(opts.all, function(id) {\n            var site = SITES[id];\n\n            return {\n                text: site.label,\n                onClick: site.onClick\n            };\n        });\n\n        // Create main button with dropdown\n        if (menu.length > 0) {\n            gitbook.toolbar.createButton({\n                icon: 'fa fa-share-alt',\n                label: 'Share',\n                position: 'right',\n                dropdown: [menu]\n            });\n        }\n\n        // Direct actions to share\n        $.each(SITES, function(sideId, site) {\n            if (!opts[sideId]) return;\n\n            gitbook.toolbar.createButton({\n                icon: site.icon,\n                label: site.text,\n                position: 'right',\n                onClick: site.onClick\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook.js",
    "content": "!function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u=\"function\"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error(\"Cannot find module '\"+s+\"'\");throw c.code=\"MODULE_NOT_FOUND\",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i=\"function\"==typeof require&&require,s=0;s<r.length;s++)o(r[s]);return o}({1:[function(e,t,n){!function(e,n){\"use strict\";\"object\"==typeof t&&\"object\"==typeof t.exports?t.exports=e.document?n(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return n(e)}:n(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";function n(e,t){t=t||te;var n=t.createElement(\"script\");n.text=e,t.head.appendChild(n).parentNode.removeChild(n)}function r(e){var t=!!e&&\"length\"in e&&e.length,n=de.type(e);return\"function\"!==n&&!de.isWindow(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):\"string\"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener(\"DOMContentLoaded\",l),e.removeEventListener(\"load\",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return\"true\"===e||\"false\"!==e&&(\"null\"===e?null:e===+e+\"\"?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(Pe,\"-$&\").toLowerCase(),n=e.getAttribute(r),\"string\"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,\"\")},u=a(),c=n&&n[3]||(de.cssNumber[t]?\"\":\"px\"),l=(de.cssNumber[t]||\"px\"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||\".5\",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,\"display\"),t.parentNode.removeChild(t),\"none\"===o&&(o=\"block\"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i<s;i++)r=e[i],r.style&&(n=r.style.display,t?(\"none\"===n&&(o[i]=Fe.get(r,\"display\")||null,o[i]||(r.style.display=\"\")),\"\"===r.style.display&&Be(r)&&(o[i]=g(r))):\"none\"!==n&&(o[i]=\"none\",Fe.set(r,\"display\",n)));for(i=0;i<s;i++)null!=o[i]&&(e[i].style.display=o[i]);return e}function v(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&de.nodeName(e,t)?de.merge([e],n):n}function y(e,t){for(var n=0,r=e.length;n<r;n++)Fe.set(e[n],\"globalEval\",!t||Fe.get(t[n],\"globalEval\"))}function x(e,t,n,r,o){for(var i,s,a,u,c,l,f=t.createDocumentFragment(),p=[],h=0,d=e.length;h<d;h++)if(i=e[h],i||0===i)if(\"object\"===de.type(i))de.merge(p,i.nodeType?[i]:i);else if(Ye.test(i)){for(s=s||f.appendChild(t.createElement(\"div\")),a=(Xe.exec(i)||[\"\",\"\"])[1].toLowerCase(),u=Ge[a]||Ge._default,s.innerHTML=u[1]+de.htmlPrefilter(i)+u[2],l=u[0];l--;)s=s.lastChild;de.merge(p,s.childNodes),s=f.firstChild,s.textContent=\"\"}else p.push(t.createTextNode(i));for(f.textContent=\"\",h=0;i=p[h++];)if(r&&de.inArray(i,r)>-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),\"script\"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||\"\")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if(\"object\"==typeof t){\"string\"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&(\"string\"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,\"table\")&&de.nodeName(11!==t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n<r;n++)de.event.add(t,o,c[o][n])}Re.hasData(e)&&(a=Re.access(e),u=de.extend({},a),Re.set(t,u))}}function N(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&ze.test(e.type)?t.checked=e.checked:\"input\"!==n&&\"textarea\"!==n||(t.defaultValue=e.defaultValue)}function A(e,t,r,o){t=oe.apply([],t);var i,s,a,u,c,l,f=0,p=e.length,h=p-1,d=t[0],g=de.isFunction(d);if(g||p>1&&\"string\"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,\"script\"),k),u=a.length;f<p;f++)c=i,f!==h&&(c=de.clone(c,!0,!0),u&&de.merge(a,v(c,\"script\"))),r.call(e[f],c,f);if(u)for(l=a[a.length-1].ownerDocument,de.map(a,E),f=0;f<u;f++)c=a[f],Ve.test(c.type||\"\")&&!Fe.access(c,\"globalEval\")&&de.contains(l,c)&&(c.src?de._evalUrl&&de._evalUrl(c.src):n(c.textContent.replace(ot,\"\"),l))}return e}function q(e,t,n){for(var r,o=t?de.filter(t,e):e,i=0;null!=(r=o[i]);i++)n||1!==r.nodeType||de.cleanData(v(r)),r.parentNode&&(n&&de.contains(r.ownerDocument,r)&&y(v(r,\"script\")),r.parentNode.removeChild(r));return e}function D(e,t,n){var r,o,i,s,a=e.style;return n=n||at(e),n&&(s=n.getPropertyValue(t)||n[t],\"\"!==s||de.contains(e.ownerDocument,e)||(s=de.style(e,t)),!pe.pixelMarginRight()&&st.test(s)&&it.test(t)&&(r=a.width,o=a.minWidth,i=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=r,a.minWidth=o,a.maxWidth=i)),void 0!==s?s+\"\":s}function O(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function L(e){if(e in pt)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=ft.length;n--;)if(e=ft[n]+t,e in pt)return e}function H(e,t,n){var r=$e.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function F(e,t,n,r,o){var i,s=0;for(i=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0;i<4;i+=2)\"margin\"===n&&(s+=de.css(e,n+We[i],!0,o)),r?(\"content\"===n&&(s-=de.css(e,\"padding\"+We[i],!0,o)),\"margin\"!==n&&(s-=de.css(e,\"border\"+We[i]+\"Width\",!0,o))):(s+=de.css(e,\"padding\"+We[i],!0,o),\"padding\"!==n&&(s+=de.css(e,\"border\"+We[i]+\"Width\",!0,o)));return s}function R(e,t,n){var r,o=!0,i=at(e),s=\"border-box\"===de.css(e,\"boxSizing\",!1,i);if(e.getClientRects().length&&(r=e.getBoundingClientRect()[t]),r<=0||null==r){if(r=D(e,t,i),(r<0||null==r)&&(r=e.style[t]),st.test(r))return r;o=s&&(pe.boxSizingReliable()||r===e.style[t]),r=parseFloat(r)||0}return r+F(e,t,n||(s?\"border\":\"content\"),o,i)+\"px\"}function I(e,t,n,r,o){return new I.prototype.init(e,t,n,r,o)}function P(){dt&&(e.requestAnimationFrame(P),de.fx.tick())}function M(){return e.setTimeout(function(){ht=void 0}),ht=de.now()}function $(e,t){var n,r=0,o={height:e};for(t=t?1:0;r<4;r+=2-t)n=We[r],o[\"margin\"+n]=o[\"padding\"+n]=e;return t&&(o.opacity=o.width=e),o}function W(e,t,n){for(var r,o=(U.tweeners[t]||[]).concat(U.tweeners[\"*\"]),i=0,s=o.length;i<s;i++)if(r=o[i].call(n,t,e))return r}function B(e,t,n){var r,o,i,s,a,u,c,l,f=\"width\"in t||\"height\"in t,p=this,h={},d=e.style,g=e.nodeType&&Be(e),v=Fe.get(e,\"fxshow\");n.queue||(s=de._queueHooks(e,\"fx\"),null==s.unqueued&&(s.unqueued=0,a=s.empty.fire,s.empty.fire=function(){s.unqueued||a()}),s.unqueued++,p.always(function(){p.always(function(){s.unqueued--,de.queue(e,\"fx\").length||s.empty.fire()})}));for(r in t)if(o=t[r],gt.test(o)){if(delete t[r],i=i||\"toggle\"===o,o===(g?\"hide\":\"show\")){if(\"show\"!==o||!v||void 0===v[r])continue;g=!0}h[r]=v&&v[r]||de.style(e,r)}if(u=!de.isEmptyObject(t),u||!de.isEmptyObject(h)){f&&1===e.nodeType&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],c=v&&v.display,null==c&&(c=Fe.get(e,\"display\")),l=de.css(e,\"display\"),\"none\"===l&&(c?l=c:(m([e],!0),c=e.style.display||c,l=de.css(e,\"display\"),m([e]))),(\"inline\"===l||\"inline-block\"===l&&null!=c)&&\"none\"===de.css(e,\"float\")&&(u||(p.done(function(){d.display=c}),null==c&&(l=d.display,c=\"none\"===l?\"\":l)),d.display=\"inline-block\")),n.overflow&&(d.overflow=\"hidden\",p.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]})),u=!1;for(r in h)u||(v?\"hidden\"in v&&(g=v.hidden):v=Fe.access(e,\"fxshow\",{display:c}),i&&(v.hidden=!g),g&&m([e],!0),p.done(function(){g||m([e]),Fe.remove(e,\"fxshow\");for(r in h)de.style(e,r,h[r])})),u=W(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}}function _(e,t){var n,r,o,i,s;for(n in e)if(r=de.camelCase(n),o=t[r],i=e[n],de.isArray(i)&&(o=i[1],i=e[n]=i[0]),n!==r&&(e[r]=i,delete e[n]),s=de.cssHooks[r],s&&\"expand\"in s){i=s.expand(i),delete e[r];for(n in i)n in e||(e[n]=i[n],t[n]=o)}else t[r]=o}function U(e,t,n){var r,o,i=0,s=U.prefilters.length,a=de.Deferred().always(function(){delete u.elem}),u=function(){if(o)return!1;for(var t=ht||M(),n=Math.max(0,c.startTime+c.duration-t),r=n/c.duration||0,i=1-r,s=0,u=c.tweens.length;s<u;s++)c.tweens[s].run(i);return a.notifyWith(e,[c,i,n]),i<1&&u?n:(a.resolveWith(e,[c]),!1)},c=a.promise({elem:e,props:de.extend({},t),opts:de.extend(!0,{specialEasing:{},easing:de.easing._default},n),originalProperties:t,originalOptions:n,startTime:ht||M(),duration:n.duration,tweens:[],createTween:function(t,n){var r=de.Tween(e,c.opts,t,n,c.opts.specialEasing[t]||c.opts.easing);return c.tweens.push(r),r},stop:function(t){var n=0,r=t?c.tweens.length:0;if(o)return this;for(o=!0;n<r;n++)c.tweens[n].run(1);return t?(a.notifyWith(e,[c,1,0]),a.resolveWith(e,[c,t])):a.rejectWith(e,[c,t]),this}}),l=c.props;for(_(l,c.opts.specialEasing);i<s;i++)if(r=U.prefilters[i].call(c,e,l,c.opts))return de.isFunction(r.stop)&&(de._queueHooks(c.elem,c.opts.queue).stop=de.proxy(r.stop,r)),r;return de.map(l,W,c),de.isFunction(c.opts.start)&&c.opts.start.call(e,c),de.fx.timer(de.extend(u,{elem:e,anim:c,queue:c.opts.queue})),c.progress(c.opts.progress).done(c.opts.done,c.opts.complete).fail(c.opts.fail).always(c.opts.always)}function z(e){var t=e.match(qe)||[];return t.join(\" \")}function X(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function V(e,t,n,r){var o;if(de.isArray(t))de.each(t,function(t,o){n||Et.test(e)?r(e,o):V(e+\"[\"+(\"object\"==typeof o&&null!=o?t:\"\")+\"]\",o,n,r)});else if(n||\"object\"!==de.type(t))r(e,t);else for(o in t)V(e+\"[\"+o+\"]\",t[o],n,r)}function G(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,o=0,i=t.toLowerCase().match(qe)||[];if(de.isFunction(n))for(;r=i[o++];)\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Y(e,t,n,r){function o(a){var u;return i[a]=!0,de.each(e[a]||[],function(e,a){var c=a(t,n,r);return\"string\"!=typeof c||s||i[c]?s?!(u=c):void 0:(t.dataTypes.unshift(c),o(c),!1)}),u}var i={},s=e===Pt;return o(t.dataTypes[0])||!i[\"*\"]&&o(\"*\")}function Q(e,t){var n,r,o=de.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((o[n]?e:r||(r={}))[n]=t[n]);return r&&de.extend(!0,e,r),e}function J(e,t,n){for(var r,o,i,s,a=e.contents,u=e.dataTypes;\"*\"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(o in a)if(a[o]&&a[o].test(r)){u.unshift(o);break}if(u[0]in n)i=u[0];else{for(o in n){if(!u[0]||e.converters[o+\" \"+u[0]]){i=o;break}s||(s=o)}i=i||s}if(i)return i!==u[0]&&u.unshift(i),n[i]}function K(e,t,n,r){var o,i,s,a,u,c={},l=e.dataTypes.slice();if(l[1])for(s in e.converters)c[s.toLowerCase()]=e.converters[s];for(i=l.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=i,i=l.shift())if(\"*\"===i)i=u;else if(\"*\"!==u&&u!==i){if(s=c[u+\" \"+i]||c[\"* \"+i],!s)for(o in c)if(a=o.split(\" \"),a[1]===i&&(s=c[u+\" \"+a[0]]||c[\"* \"+a[0]])){s===!0?s=c[o]:c[o]!==!0&&(i=a[0],l.unshift(a[1]));break}if(s!==!0)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(e){return{state:\"parsererror\",error:s?e:\"No conversion from \"+u+\" to \"+i}}}return{state:\"success\",data:t}}function Z(e){return de.isWindow(e)?e:9===e.nodeType&&e.defaultView}var ee=[],te=e.document,ne=Object.getPrototypeOf,re=ee.slice,oe=ee.concat,ie=ee.push,se=ee.indexOf,ae={},ue=ae.toString,ce=ae.hasOwnProperty,le=ce.toString,fe=le.call(Object),pe={},he=\"3.1.1\",de=function(e,t){return new de.fn.init(e,t)},ge=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,me=/^-ms-/,ve=/-([a-z])/g,ye=function(e,t){return t.toUpperCase()};de.fn=de.prototype={jquery:he,constructor:de,length:0,toArray:function(){return re.call(this)},get:function(e){return null==e?re.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=de.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return de.each(this,e)},map:function(e){return this.pushStack(de.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(re.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ie,sort:ee.sort,splice:ee.splice},de.extend=de.fn.extend=function(){var e,t,n,r,o,i,s=arguments[0]||{},a=1,u=arguments.length,c=!1;for(\"boolean\"==typeof s&&(c=s,s=arguments[a]||{},a++),\"object\"==typeof s||de.isFunction(s)||(s={}),a===u&&(s=this,a--);a<u;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(c&&r&&(de.isPlainObject(r)||(o=de.isArray(r)))?(o?(o=!1,i=n&&de.isArray(n)?n:[]):i=n&&de.isPlainObject(n)?n:{},s[t]=de.extend(c,i,r)):void 0!==r&&(s[t]=r));return s},de.extend({expando:\"jQuery\"+(he+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return\"function\"===de.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){var t=de.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==ue.call(e))&&(!(t=ne(e))||(n=ce.call(t,\"constructor\")&&t.constructor,\"function\"==typeof n&&le.call(n)===fe))},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?ae[ue.call(e)]||\"object\":typeof e},globalEval:function(e){n(e)},camelCase:function(e){return e.replace(me,\"ms-\").replace(ve,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,o=0;if(r(e))for(n=e.length;o<n&&t.call(e[o],o,e[o])!==!1;o++);else for(o in e)if(t.call(e[o],o,e[o])===!1)break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(ge,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(r(Object(e))?de.merge(n,\"string\"==typeof e?[e]:e):ie.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,o=e.length;r<n;r++)e[o++]=t[r];return e.length=o,e},grep:function(e,t,n){for(var r,o=[],i=0,s=e.length,a=!n;i<s;i++)r=!t(e[i],i),r!==a&&o.push(e[i]);return o},map:function(e,t,n){var o,i,s=0,a=[];if(r(e))for(o=e.length;s<o;s++)i=t(e[s],s,n),null!=i&&a.push(i);else for(s in e)i=t(e[s],s,n),null!=i&&a.push(i);return oe.apply([],a)},guid:1,proxy:function(e,t){var n,r,o;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),de.isFunction(e))return r=re.call(arguments,2),o=function(){return e.apply(t||this,r.concat(re.call(arguments)))},o.guid=e.guid=e.guid||de.guid++,o},now:Date.now,support:pe}),\"function\"==typeof Symbol&&(de.fn[Symbol.iterator]=ee[Symbol.iterator]),de.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){ae[\"[object \"+t+\"]\"]=t.toLowerCase()});var xe=function(e){function t(e,t,n,r){var o,i,s,a,u,c,l,p=t&&t.ownerDocument,d=t?t.nodeType:9;if(n=n||[],\"string\"!=typeof e||!e||1!==d&&9!==d&&11!==d)return n;if(!r&&((t?t.ownerDocument||t:W)!==L&&O(t),t=t||L,F)){if(11!==d&&(u=ve.exec(e)))if(o=u[1]){if(9===d){if(!(s=t.getElementById(o)))return n;if(s.id===o)return n.push(s),n}else if(p&&(s=p.getElementById(o))&&M(t,s)&&s.id===o)return n.push(s),n}else{if(u[2])return K.apply(n,t.getElementsByTagName(e)),n;if((o=u[3])&&T.getElementsByClassName&&t.getElementsByClassName)return K.apply(n,t.getElementsByClassName(o)),n}if(T.qsa&&!X[e+\" \"]&&(!R||!R.test(e))){if(1!==d)p=t,l=e;else if(\"object\"!==t.nodeName.toLowerCase()){for((a=t.getAttribute(\"id\"))?a=a.replace(we,Te):t.setAttribute(\"id\",a=$),c=E(e),i=c.length;i--;)c[i]=\"#\"+a+\" \"+h(c[i]);l=c.join(\",\"),p=ye.test(e)&&f(t.parentNode)||t}if(l)try{return K.apply(n,p.querySelectorAll(l)),n}catch(e){}finally{a===$&&t.removeAttribute(\"id\")}}}return N(e.replace(ae,\"$1\"),t,n,r)}function n(){function e(n,r){return t.push(n+\" \")>C.cacheLength&&delete e[t.shift()],e[n+\" \"]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split(\"|\"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function c(e){return function(t){return\"form\"in t?t.parentNode&&t.disabled===!1?\"label\"in t?\"label\"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:\"label\"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,o=t.next,i=o||r,s=n&&\"parentNode\"===i,a=_++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||s)return e(t,n,o);return!1}:function(t,n,u){var c,l,f,p=[B,a];if(u){for(;t=t[r];)if((1===t.nodeType||s)&&e(t,n,u))return!0}else for(;t=t[r];)if(1===t.nodeType||s)if(f=t[$]||(t[$]={}),l=f[t.uniqueID]||(f[t.uniqueID]={}),o&&o===t.nodeName.toLowerCase())t=t[r]||t;else{if((c=l[i])&&c[0]===B&&c[1]===a)return p[2]=c[2];if(l[i]=p,p[2]=e(t,n,u))return!0}return!1}}function g(e){return e.length>1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o<i;o++)t(e,n[o],r);return r}function v(e,t,n,r,o){for(var i,s=[],a=0,u=e.length,c=null!=t;a<u;a++)(i=e[a])&&(n&&!n(i,r,o)||(s.push(i),c&&t.push(a)));return s}function y(e,t,n,o,i,s){return o&&!o[$]&&(o=y(o)),i&&!i[$]&&(i=y(i,s)),r(function(r,s,a,u){var c,l,f,p=[],h=[],d=s.length,g=r||m(t||\"*\",a.nodeType?[a]:a,[]),y=!e||!r&&t?g:v(g,p,e,a,u),x=n?i||(r?e:d||o)?[]:s:y;if(n&&n(y,x,a,u),o)for(c=v(x,h),o(c,[],a,u),l=c.length;l--;)(f=c[l])&&(x[h[l]]=!(y[h[l]]=f));if(r){if(i||e){if(i){for(c=[],l=x.length;l--;)(f=x[l])&&c.push(y[l]=f);i(null,x=[],c,u)}for(l=x.length;l--;)(f=x[l])&&(c=i?ee(r,f):p[l])>-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[\" \"],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a<o;a++)if(n=C.relative[e[a].type])l=[d(g(l),n)];else{if(n=C.filter[e[a].type].apply(null,e[a].matches),n[$]){for(r=++a;r<o&&!C.relative[e[r].type];r++);return y(a>1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:\" \"===e[a-2].type?\"*\":\"\"})).replace(ae,\"$1\"),n,a<r&&x(e.slice(a,r)),r<o&&x(e=e.slice(r)),r<o&&h(e))}l.push(n)}return g(l)}function b(e,n){var o=n.length>0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d=\"0\",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG(\"*\",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$=\"sizzle\"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",ne=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",re=\"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",oe=\"\\\\[\"+ne+\"*(\"+re+\")(?:\"+ne+\"*([*^$|!~]?=)\"+ne+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+re+\"))|)\"+ne+\"*\\\\]\",ie=\":(\"+re+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+oe+\")*)|.*)\\\\)|)\",se=new RegExp(ne+\"+\",\"g\"),ae=new RegExp(\"^\"+ne+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+ne+\"+$\",\"g\"),ue=new RegExp(\"^\"+ne+\"*,\"+ne+\"*\"),ce=new RegExp(\"^\"+ne+\"*([>+~]|\"+ne+\")\"+ne+\"*\"),le=new RegExp(\"=\"+ne+\"*([^\\\\]'\\\"]*?)\"+ne+\"*\\\\]\",\"g\"),fe=new RegExp(ie),pe=new RegExp(\"^\"+re+\"$\"),he={ID:new RegExp(\"^#(\"+re+\")\"),CLASS:new RegExp(\"^\\\\.(\"+re+\")\"),TAG:new RegExp(\"^(\"+re+\"|[*])\"),ATTR:new RegExp(\"^\"+oe),PSEUDO:new RegExp(\"^\"+ie),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ne+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ne+\"*(?:([+-]|)\"+ne+\"*(\\\\d+)|))\"+ne+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+te+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ne+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ne+\"*((?:-\\\\d)?\\\\d*)\"+ne+\"*\\\\)|)(?=[^-]|$)\",\"i\")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\\d$/i,me=/^[^{]+\\{\\s*\\[native \\w/,ve=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ye=/[+~]/,xe=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+ne+\"?|(\"+ne+\")|.)\",\"ig\"),be=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,Te=function(e,t){return t?\"\\0\"===e?\"�\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&(\"form\"in e||\"label\"in e)},{dir:\"parentNode\",next:\"legend\"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&\"HTML\"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",Ce,!1):n.attachEvent&&n.attachEvent(\"onunload\",Ce)),T.attributes=o(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute(\"id\")===t}},C.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return n&&n.value===t}},C.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if(\"*\"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML=\"<a id='\"+$+\"'></a><select id='\"+$+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&R.push(\"[*^$]=\"+ne+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||R.push(\"\\\\[\"+ne+\"*(?:value|\"+te+\")\"),e.querySelectorAll(\"[id~=\"+$+\"-]\").length||R.push(\"~=\"),e.querySelectorAll(\":checked\").length||R.push(\":checked\"),e.querySelectorAll(\"a#\"+$+\"+*\").length||R.push(\".#.+[+~]\")}),o(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=L.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&R.push(\"name\"+ne+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&R.push(\":enabled\",\":disabled\"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&R.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),R.push(\",.*:\")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,\"*\"),P.call(e,\"[s!='']:x\"),I.push(\"!=\",ie)}),R=R.length&&new RegExp(R.join(\"|\")),I=I.length&&new RegExp(I.join(\"|\")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,\"='$1']\"),T.matchesSelector&&F&&!X[n+\" \"]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+\"\").replace(we,Te)},t.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n=\"\",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,be),e[3]=(e[3]||e[4]||e[5]||\"\").replace(xe,be),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,be).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+\" \"];return t||(t=new RegExp(\"(^|\"+ne+\")\"+e+\"(\"+ne+\"|$)\"))&&U(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?\"!=\"===n:!n||(i+=\"\",\"=\"===n?i===r:\"!=\"===n?i!==r:\"^=\"===n?r&&0===i.indexOf(r):\"*=\"===n?r&&i.indexOf(r)>-1:\"$=\"===n?r&&i.slice(-r.length)===r:\"~=\"===n?(\" \"+i.replace(se,\" \")+\" \").indexOf(r)>-1:\"|=\"===n&&(i===r||i.slice(0,r.length+1)===r+\"-\"))}},CHILD:function(e,t,n,r,o){var i=\"nth\"!==e.slice(0,3),s=\"last\"!==e.slice(-4),a=\"of-type\"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?\"nextSibling\":\"previousSibling\",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g=\"only\"===e&&!d&&\"nextSibling\"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error(\"unsupported pseudo: \"+e);return i[$]?i(n):i.length>1?(o=[e,e,\"\",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,\"$1\"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){\nreturn t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||\"\")||t.error(\"unsupported lang: \"+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},C.pseudos.nth=C.pseudos.eq;for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})C.pseudos[w]=a(w);for(w in{submit:!0,reset:!0})C.pseudos[w]=u(w);return p.prototype=C.filters=C.pseudos,C.setFilters=new p,E=t.tokenize=function(e,n){var r,o,i,s,a,u,c,l=z[e+\" \"];if(l)return n?0:l.slice(0);for(a=e,u=[],c=C.preFilter;a;){r&&!(o=ue.exec(a))||(o&&(a=a.slice(o[0].length)||a),u.push(i=[])),r=!1,(o=ce.exec(a))&&(r=o.shift(),i.push({value:r,type:o[0].replace(ae,\" \")}),a=a.slice(r.length));for(s in C.filter)!(o=he[s].exec(a))||c[s]&&!(o=c[s](o))||(r=o.shift(),i.push({value:r,type:s,matches:o}),a=a.slice(r.length));if(!r)break}return n?a.length:a?t.error(e):z(e,u).slice(0)},S=t.compile=function(e,t){var n,r=[],o=[],i=X[e+\" \"];if(!i){for(t||(t=E(e)),n=t.length;n--;)i=x(t[n]),i[$]?r.push(i):o.push(i);i=X(e,b(o,r)),i.selector=e}return i},N=t.select=function(e,t,n,r){var o,i,s,a,u,c=\"function\"==typeof e&&e,l=!r&&E(e=c.selector||e);if(n=n||[],1===l.length){if(i=l[0]=l[0].slice(0),i.length>2&&\"ID\"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split(\"\").sort(V).join(\"\")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement(\"fieldset\"))}),o(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||i(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||i(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute(\"disabled\")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[\":\"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i,je=/^.[^:#\\[\\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if(\"string\"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t<r;t++)if(de.contains(o[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)de.find(e,o[t],n);return r>1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,\"string\"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,\"string\"==typeof e){if(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(de.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,o=this.length,i=[],s=\"string\"!=typeof e&&de(e);if(!Te.test(e))for(;r<o;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(s?s.index(n)>-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?\"string\"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,\"parentNode\")},parentsUntil:function(e,t,n){return be(e,\"parentNode\",n)},next:function(e){return i(e,\"nextSibling\")},prev:function(e){return i(e,\"previousSibling\")},nextAll:function(e){return be(e,\"nextSibling\")},prevAll:function(e){return be(e,\"previousSibling\")},nextUntil:function(e,t,n){return be(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return be(e,\"previousSibling\",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\\x20\\t\\r\\n\\f]+/g;de.Callbacks=function(e){e=\"string\"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u<i.length;)i[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=i.length,n=!1);e.memory||(n=!1),t=!1,o&&(i=n?[]:\"\")},l={add:function(){return i&&(n&&!t&&(u=i.length-1,a.push(n)),function t(n){de.each(n,function(n,r){de.isFunction(r)?e.unique&&l.has(r)||i.push(r):r&&r.length&&\"string\"!==de.type(r)&&t(r)})}(arguments),n&&!t&&c()),this},remove:function(){return de.each(arguments,function(e,t){for(var n;(n=de.inArray(t,i,n))>-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n=\"\",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=\"\"),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[[\"notify\",\"progress\",de.Callbacks(\"memory\"),de.Callbacks(\"memory\"),2],[\"resolve\",\"done\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),1,\"rejected\"]],r=\"pending\",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+\"With\"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t<s)){if(e=r.apply(c,l),e===n.promise())throw new TypeError(\"Thenable self-resolution\");f=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,de.isFunction(f)?o?f.call(e,i(s,n,a,o),i(s,n,u,o)):(s++,f.call(e,i(s,n,a,o),i(s,n,u,o),i(s,n,a,n.notifyWith))):(r!==a&&(c=void 0,l=[e]),(o||n.resolveWith)(c,l))}},p=o?f:function(){try{f()}catch(e){de.Deferred.exceptionHook&&de.Deferred.exceptionHook(e,p.stackTrace),t+1>=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+\"With\"](this===i?void 0:this,arguments),this},i[t[0]+\"With\"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),\"pending\"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn(\"jQuery.Deferred exception: \"+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,\"complete\"===te.readyState||\"loading\"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener(\"DOMContentLoaded\",l),e.addEventListener(\"load\",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if(\"object\"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a<u;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return o?e:c?t.call(e):u?t(e[0],n):i},He=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};f.uid=1,f.prototype={cache:function(e){var t=e[this.expando];return t||(t={},He(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,o=this.cache(e);if(\"string\"==typeof t)o[de.camelCase(t)]=n;else for(r in t)o[de.camelCase(r)]=t[r];return o},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][de.camelCase(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){de.isArray(t)?t=t.map(de.camelCase):(t=de.camelCase(t),t=t in r?[t]:t.match(qe)||[]),n=t.length;for(;n--;)delete r[t[n]]}(void 0===t||de.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!de.isEmptyObject(t)}};var Fe=new f,Re=new f,Ie=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,Pe=/[A-Z]/g;de.extend({hasData:function(e){return Re.hasData(e)||Fe.hasData(e)},data:function(e,t,n){return Re.access(e,t,n)},removeData:function(e,t){Re.remove(e,t)},_data:function(e,t,n){return Fe.access(e,t,n)},_removeData:function(e,t){Fe.remove(e,t)}}),de.fn.extend({data:function(e,t){var n,r,o,i=this[0],s=i&&i.attributes;if(void 0===e){if(this.length&&(o=Re.get(i),1===i.nodeType&&!Fe.get(i,\"hasDataAttrs\"))){for(n=s.length;n--;)s[n]&&(r=s[n].name,0===r.indexOf(\"data-\")&&(r=de.camelCase(r.slice(5)),h(i,r,o[r])));Fe.set(i,\"hasDataAttrs\",!0)}return o}return\"object\"==typeof e?this.each(function(){Re.set(this,e)}):Le(this,function(t){var n;if(i&&void 0===t){if(n=Re.get(i,e),void 0!==n)return n;if(n=h(i,e),void 0!==n)return n}else this.each(function(){Re.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};\"inprogress\"===o&&(o=n.shift(),r--),o&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks(\"once memory\").add(function(){Fe.remove(e,[t+\"queue\",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),arguments.length<n?de.queue(this[0],e):void 0===t?this:this.each(function(){var n=de.queue(this,e,t);de._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&de.dequeue(this,e)})},dequeue:function(e){return this.each(function(){de.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,o=de.Deferred(),i=this,s=this.length,a=function(){--r||o.resolveWith(i,[i])};for(\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";s--;)n=Fe.get(i[s],e+\"queueHooks\"),n&&n.empty&&(r++,n.empty.add(a));return a(),o.promise(t)}});var Me=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,$e=new RegExp(\"^(?:([+-])=|)(\"+Me+\")([a-z%]*)$\",\"i\"),We=[\"Top\",\"Right\",\"Bottom\",\"Left\"],Be=function(e,t){return e=t||e,\"none\"===e.style.display||\"\"===e.style.display&&de.contains(e.ownerDocument,e)&&\"none\"===de.css(e,\"display\")},_e=function(e,t,n,r){var o,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];o=n.apply(e,r||[]);for(i in t)e.style[i]=s[i];return o},Ue={};de.fn.extend({show:function(){return m(this,!0)},hide:function(){return m(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){Be(this)?de(this).show():de(this).hide()})}});var ze=/^(?:checkbox|radio)$/i,Xe=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i,Ve=/^$|\\/(?:java|ecma)script/i,Ge={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement(\"div\")),n=te.createElement(\"input\");n.setAttribute(\"type\",\"radio\"),n.setAttribute(\"checked\",\"checked\"),n.setAttribute(\"name\",\"t\"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML=\"<textarea>x</textarea>\",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return\"undefined\"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||\"\").match(qe)||[\"\"],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||\"\").split(\".\").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(\".\")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||\"\").match(qe)||[\"\"],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||\"\").split(\".\").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&(\"**\"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,\"events\")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t<arguments.length;t++)u[t]=arguments[t];if(a.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,a)!==!1){for(s=de.event.handlers.call(this,a,c),t=0;(o=s[t++])&&!a.isPropagationStopped();)for(a.currentTarget=o.elem,n=0;(i=o.handlers[n++])&&!a.isImmediatePropagationStopped();)a.rnamespace&&!a.rnamespace.test(i.namespace)||(a.handleObj=i,a.data=i.data,r=((de.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),void 0!==r&&(a.result=r)===!1&&(a.preventDefault(),a.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,a),a.result}},handlers:function(e,t){var n,r,o,i,s,a=[],u=t.delegateCount,c=e.target;if(u&&c.nodeType&&!(\"click\"===e.type&&e.button>=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&(\"click\"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n<u;n++)r=t[n],o=r.selector+\" \",void 0===s[o]&&(s[o]=r.needsContext?de(o,this).index(c)>-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u<t.length&&a.push({elem:c,handlers:t.slice(u)}),a},addProp:function(e,t){Object.defineProperty(de.Event.prototype,e,{enumerable:!0,configurable:!0,get:de.isFunction(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[de.expando]?e:new de.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==T()&&this.focus)return this.focus(),!1},delegateType:\"focusin\"},blur:{trigger:function(){if(this===T()&&this.blur)return this.blur(),!1},delegateType:\"focusout\"},click:{trigger:function(){if(\"checkbox\"===this.type&&this.click&&de.nodeName(this,\"input\"))return this.click(),!1},_default:function(e){return de.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},de.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},de.Event=function(e,t){return this instanceof de.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?b:w,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&de.extend(this,t),this.timeStamp=e&&e.timeStamp||de.now(),void(this[de.expando]=!0)):new de.Event(e,t)},de.Event.prototype={constructor:de.Event,isDefaultPrevented:w,isPropagationStopped:w,isImmediatePropagationStopped:w,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=b,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=b,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=b,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},de.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Je.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ke.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},de.event.addProp),de.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,t){de.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,o=e.relatedTarget,i=e.handleObj;return o&&(o===r||de.contains(r,o))||(e.type=i.origType,n=i.handler.apply(this,arguments),e.type=t),n}}}),de.fn.extend({on:function(e,t,n,r){return C(this,e,t,n,r)},one:function(e,t,n,r){return C(this,e,t,n,r,1)},off:function(e,t,n){var r,o;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,de(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(o in e)this.off(o,t,e[o]);return this}return t!==!1&&\"function\"!=typeof t||(n=t,t=void 0),n===!1&&(n=w),this.each(function(){de.event.remove(this,e,n,t)})}});var et=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,tt=/<script|<style|<link/i,nt=/checked\\s*(?:[^=]|=\\s*.checked.)/i,rt=/^true\\/(.*)/,ot=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,\"<$1></$2>\")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r<o;r++)N(i[r],s[r]);if(t)if(n)for(i=i||v(e),s=s||v(a),r=0,o=i.length;r<o;r++)S(i[r],s[r]);else S(e,a);return s=v(a,\"script\"),s.length>0&&y(s,!u&&v(e,\"script\")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!tt.test(e)&&!Ge[(Xe.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(de.cleanData(v(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return A(this,arguments,function(t){var n=this.parentNode;de.inArray(this,e)<0&&(de.cleanData(v(this)),n&&n.replaceChild(t,this))},e)}}),de.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){de.fn[e]=function(e){for(var n,r=[],o=de(e),i=o.length-1,s=0;s<=i;s++)n=s===i?this:this.clone(!0),de(o[s])[t](n),ie.apply(r,n.get());return this.pushStack(r)}});var it=/^margin/,st=new RegExp(\"^(\"+Me+\")(?!px)[a-z%]+$\",\"i\"),at=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)};!function(){function t(){if(a){a.style.cssText=\"box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%\",a.innerHTML=\"\",Qe.appendChild(s);var t=e.getComputedStyle(a);n=\"1%\"!==t.top,i=\"2px\"===t.marginLeft,r=\"4px\"===t.width,a.style.marginRight=\"50%\",o=\"4px\"===t.marginRight,Qe.removeChild(s),a=null}}var n,r,o,i,s=te.createElement(\"div\"),a=te.createElement(\"div\");a.style&&(a.style.backgroundClip=\"content-box\",a.cloneNode(!0).style.backgroundClip=\"\",pe.clearCloneStyle=\"content-box\"===a.style.backgroundClip,s.style.cssText=\"border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute\",s.appendChild(a),de.extend(pe,{pixelPosition:function(){return t(),n},boxSizingReliable:function(){return t(),r},pixelMarginRight:function(){return t(),o},reliableMarginLeft:function(){return t(),i}}))}();var ut=/^(none|table(?!-c[ea]).+)/,ct={position:\"absolute\",visibility:\"hidden\",display:\"block\"},lt={letterSpacing:\"0\",fontWeight:\"400\"},ft=[\"Webkit\",\"Moz\",\"ms\"],pt=te.createElement(\"div\").style;de.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=D(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:\"cssFloat\"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,i,s,a=de.camelCase(t),u=e.style;return t=de.cssProps[a]||(de.cssProps[a]=L(a)||a),s=de.cssHooks[t]||de.cssHooks[a],void 0===n?s&&\"get\"in s&&void 0!==(o=s.get(e,!1,r))?o:u[t]:(i=typeof n,\"string\"===i&&(o=$e.exec(n))&&o[1]&&(n=d(e,t,o),i=\"number\"),null!=n&&n===n&&(\"number\"===i&&(n+=o&&o[3]||(de.cssNumber[a]?\"\":\"px\")),pe.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(u[t]=\"inherit\"),s&&\"set\"in s&&void 0===(n=s.set(e,n,r))||(u[t]=n)),void 0)}},css:function(e,t,n,r){var o,i,s,a=de.camelCase(t);return t=de.cssProps[a]||(de.cssProps[a]=L(a)||a),s=de.cssHooks[t]||de.cssHooks[a],s&&\"get\"in s&&(o=s.get(e,!0,n)),void 0===o&&(o=D(e,t,r)),\"normal\"===o&&t in lt&&(o=lt[t]),\"\"===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),de.each([\"height\",\"width\"],function(e,t){de.cssHooks[t]={get:function(e,n,r){if(n)return!ut.test(de.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?R(e,t,r):_e(e,ct,function(){return R(e,t,r)})},set:function(e,n,r){var o,i=r&&at(e),s=r&&F(e,t,r,\"border-box\"===de.css(e,\"boxSizing\",!1,i),i);return s&&(o=$e.exec(n))&&\"px\"!==(o[3]||\"px\")&&(e.style[t]=n,n=de.css(e,t)),H(e,n,s)}}}),de.cssHooks.marginLeft=O(pe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(D(e,\"marginLeft\"))||e.getBoundingClientRect().left-_e(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),de.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){de.cssHooks[e+t]={expand:function(n){for(var r=0,o={},i=\"string\"==typeof n?n.split(\" \"):[n];r<4;r++)o[e+We[r]+t]=i[r]||i[r-2]||i[0];return o}},it.test(e)||(de.cssHooks[e+t].set=H)}),de.fn.extend({css:function(e,t){return Le(this,function(e,t,n){var r,o,i={},s=0;if(de.isArray(t)){for(r=at(e),o=t.length;s<o;s++)i[t[s]]=de.css(e,t[s],!1,r);return i}return void 0!==n?de.style(e,t,n):de.css(e,t)},e,t,arguments.length>1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?\"\":\"px\")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=[\"*\"]):e=e.match(qe);for(var n,r=0,o=e.length;r<o;r++)n=e[r],U.tweeners[n]=U.tweeners[n]||[],U.tweeners[n].unshift(t)},prefilters:[B],prefilter:function(e,t){t?U.prefilters.unshift(e):U.prefilters.push(e)}}),de.speed=function(e,t,n){var r=e&&\"object\"==typeof e?de.extend({},e):{complete:n||!n&&t||de.isFunction(e)&&e,duration:e,easing:n&&t||t&&!de.isFunction(t)&&t};return de.fx.off||te.hidden?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in de.fx.speeds?r.duration=de.fx.speeds[r.duration]:r.duration=de.fx.speeds._default),null!=r.queue&&r.queue!==!0||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){de.isFunction(r.old)&&r.old.call(this),r.queue&&de.dequeue(this,r.queue)},r},de.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Be).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){\nvar o=de.isEmptyObject(e),i=de.speed(t,n,r),s=function(){var t=U(this,de.extend({},e),i);(o||Fe.get(this,\"finish\"))&&t.stop(!0)};return s.finish=s,o||i.queue===!1?this.each(s):this.queue(i.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,o=null!=e&&e+\"queueHooks\",i=de.timers,s=Fe.get(this);if(o)s[o]&&s[o].stop&&r(s[o]);else for(o in s)s[o]&&s[o].stop&&mt.test(o)&&r(s[o]);for(o=i.length;o--;)i[o].elem!==this||null!=e&&i[o].queue!==e||(i[o].anim.stop(n),t=!1,i.splice(o,1));!t&&n||de.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=Fe.get(this),r=n[e+\"queue\"],o=n[e+\"queueHooks\"],i=de.timers,s=r?r.length:0;for(n.finish=!0,de.queue(this,e,[]),o&&o.stop&&o.stop.call(this,!0),t=i.length;t--;)i[t].elem===this&&i[t].queue===e&&(i[t].anim.stop(!0),i.splice(t,1));for(t=0;t<s;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),de.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=de.fn[t];de.fn[t]=function(e,r,o){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate($(t,!0),e,r,o)}}),de.each({slideDown:$(\"show\"),slideUp:$(\"hide\"),slideToggle:$(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){de.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),de.timers=[],de.fx.tick=function(){var e,t=0,n=de.timers;for(ht=de.now();t<n.length;t++)e=n[t],e()||n[t]!==e||n.splice(t--,1);n.length||de.fx.stop(),ht=void 0},de.fx.timer=function(e){de.timers.push(e),e()?de.fx.start():de.timers.pop()},de.fx.interval=13,de.fx.start=function(){dt||(dt=e.requestAnimationFrame?e.requestAnimationFrame(P):e.setInterval(de.fx.tick,de.fx.interval))},de.fx.stop=function(){e.cancelAnimationFrame?e.cancelAnimationFrame(dt):e.clearInterval(dt),dt=null},de.fx.speeds={slow:600,fast:200,_default:400},de.fn.delay=function(t,n){return t=de.fx?de.fx.speeds[t]||t:t,n=n||\"fx\",this.queue(n,function(n,r){var o=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(o)}})},function(){var e=te.createElement(\"input\"),t=te.createElement(\"select\"),n=t.appendChild(te.createElement(\"option\"));e.type=\"checkbox\",pe.checkOn=\"\"!==e.value,pe.optSelected=n.selected,e=te.createElement(\"input\"),e.value=\"t\",e.type=\"radio\",pe.radioValue=\"t\"===e.value}();var vt,yt=de.expr.attrHandle;de.fn.extend({attr:function(e,t){return Le(this,de.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return\"undefined\"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):o&&\"get\"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&\"radio\"===t&&de.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&\"get\"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,\"tabindex\");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:\"htmlFor\",class:\"className\"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(s=0;i=t[s++];)r.indexOf(\" \"+i+\" \")<0&&(r+=i+\" \");a=z(r),o!==a&&n.setAttribute(\"class\",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(s=0;i=t[s++];)for(;r.indexOf(\" \"+i+\" \")>-1;)r=r.replace(\" \"+i+\" \",\" \");a=z(r),o!==a&&n.setAttribute(\"class\",a)}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if(\"string\"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&\"boolean\"!==n||(t=X(this),t&&Fe.set(this,\"__className__\",t),this.setAttribute&&this.setAttribute(\"class\",t||e===!1?\"\":Fe.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;for(t=\" \"+e+\" \";n=this[r++];)if(1===n.nodeType&&(\" \"+z(X(n))+\" \").indexOf(t)>-1)return!0;return!1}});var wt=/\\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o=\"\":\"number\"==typeof o?o+=\"\":de.isArray(o)&&(o=de.map(o,function(e){return null==e?\"\":e+\"\"})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&\"set\"in t&&void 0!==t.set(this,o,\"value\")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&\"get\"in t&&void 0!==(n=t.get(o,\"value\"))?n:(n=o.value,\"string\"==typeof n?n.replace(wt,\"\"):null==n?\"\":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,\"value\");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s=\"select-one\"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r<u;r++)if(n=o[r],(n.selected||r===i)&&!n.disabled&&(!n.parentNode.disabled||!de.nodeName(n.parentNode,\"optgroup\"))){if(t=de(n).val(),s)return t;a.push(t)}return a},set:function(e,t){for(var n,r,o=e.options,i=de.makeArray(t),s=o.length;s--;)r=o[s],(r.selected=de.inArray(de.valHooks.option.get(r),i)>-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each([\"radio\",\"checkbox\"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,\"type\")?t.type:t,d=ce.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(\".\")>-1&&(d=h.split(\".\"),h=d.shift(),d.sort()),c=h.indexOf(\":\")<0&&\"on\"+h,t=t[de.expando]?t:new de.Event(h,\"object\"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join(\".\"),t.rnamespace=t.namespace?new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,\"events\")||{})[t.type]&&Fe.get(s,\"handle\"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin=\"onfocusin\"in e,pe.focusin||de.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\\?/;de.parseXML=function(t){var n;if(!t||\"string\"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,\"text/xml\")}catch(e){n=void 0}return n&&!n.getElementsByTagName(\"parsererror\").length||de.error(\"Invalid XML: \"+t),n};var Et=/\\[\\]$/,St=/\\r?\\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join(\"&\")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,\"elements\");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(\":disabled\")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,\"\\r\\n\")}}):{name:t.name,value:n.replace(St,\"\\r\\n\")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\\/\\//,It={},Pt={},Mt=\"*/\".concat(\"*\"),$t=te.createElement(\"a\");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:\"GET\",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Mt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||\"\",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader(\"Last-Modified\"),w&&(de.lastModified[i]=w),w=C.getResponseHeader(\"etag\"),w&&(de.etag[i]=w)),204===t||\"HEAD\"===d.type?T=\"nocontent\":304===t?T=\"notmodified\":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T=\"error\",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+\"\",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?\"ajaxSuccess\":\"ajaxError\",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger(\"ajaxComplete\",[C,d]),--de.active||de.event.trigger(\"ajaxStop\")))}\"object\"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks(\"once memory\"),x=d.statusCode||{},b={},w={},T=\"canceled\",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+\"\").replace(Rt,Ct.protocol+\"//\"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||\"*\").toLowerCase().match(qe)||[\"\"],null==d.crossDomain){c=te.createElement(\"a\");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+\"//\"+$t.host!=c.protocol+\"//\"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&\"string\"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger(\"ajaxStart\"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,\"\"),d.hasContent?d.data&&d.processData&&0===(d.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(d.data=d.data.replace(qt,\"+\")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?\"&\":\"?\")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,\"$1\"),h=(kt.test(i)?\"&\":\"?\")+\"_=\"+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader(\"If-Modified-Since\",de.lastModified[i]),de.etag[i]&&C.setRequestHeader(\"If-None-Match\",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader(\"Content-Type\",d.contentType),C.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(\"*\"!==d.dataTypes[0]?\", \"+Mt+\"; q=0.01\":\"\"):d.accepts[\"*\"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T=\"abort\",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger(\"ajaxSend\",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort(\"timeout\")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,\"No Transport\");return C},getJSON:function(e,t,n){return de.get(e,t,n,\"json\")},getScript:function(e,t){return de.get(e,void 0,t,\"script\")}}),de.each([\"get\",\"post\"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&\"withCredentials\"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o[\"X-Requested-With\"]||(o[\"X-Requested-With\"]=\"XMLHttpRequest\");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,\"abort\"===e?a.abort():\"error\"===e?\"number\"!=typeof a.status?i(0,\"error\"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,\"text\"!==(a.responseType||\"text\")||\"string\"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n(\"error\"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n(\"abort\");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),de.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(\"<script>\").prop({charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&o(\"error\"===e.type?404:200,e.type)}),te.head.appendChild(t[0])},abort:function(){n&&n()}}}});var _t=[],Ut=/(=)\\?(?=&|$)|\\?\\?/;de.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=_t.pop()||de.expando+\"_\"+jt++;return this[e]=!0,e}}),de.ajaxPrefilter(\"json jsonp\",function(t,n,r){var o,i,s,a=t.jsonp!==!1&&(Ut.test(t.url)?\"url\":\"string\"==typeof t.data&&0===(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ut.test(t.data)&&\"data\");if(a||\"jsonp\"===t.dataTypes[0])return o=t.jsonpCallback=de.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ut,\"$1\"+o):t.jsonp!==!1&&(t.url+=(kt.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+o),t.converters[\"script json\"]=function(){return s||de.error(o+\" was not called\"),s[0]},t.dataTypes[0]=\"json\",i=e[o],e[o]=function(){s=arguments},r.always(function(){void 0===i?de(e).removeProp(o):e[o]=i,t[o]&&(t.jsonpCallback=n.jsonpCallback,_t.push(o)),s&&de.isFunction(i)&&i(s[0]),s=i=void 0}),\"script\"}),pe.createHTMLDocument=function(){var e=te.implementation.createHTMLDocument(\"\").body;return e.innerHTML=\"<form></form><form></form>\",2===e.childNodes.length}(),de.parseHTML=function(e,t,n){if(\"string\"!=typeof e)return[];\"boolean\"==typeof t&&(n=t,t=!1);var r,o,i;return t||(pe.createHTMLDocument?(t=te.implementation.createHTMLDocument(\"\"),r=t.createElement(\"base\"),r.href=te.location.href,t.head.appendChild(r)):t=te),o=Ce.exec(e),i=!n&&[],o?[t.createElement(o[1])]:(o=x([e],t,i),i&&i.length&&de(i).remove(),de.merge([],o.childNodes))},de.fn.load=function(e,t,n){var r,o,i,s=this,a=e.indexOf(\" \");return a>-1&&(r=z(e.slice(a)),e=e.slice(0,a)),de.isFunction(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(o=\"POST\"),s.length>0&&de.ajax({url:e,type:o||\"GET\",dataType:\"html\",data:t}).done(function(e){i=arguments,s.html(r?de(\"<div>\").append(de.parseHTML(e)).find(r):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},de.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){de.fn[t]=function(e){return this.on(t,e)}}),de.expr.pseudos.animated=function(e){return de.grep(de.timers,function(t){return e===t.elem}).length},de.offset={setOffset:function(e,t,n){var r,o,i,s,a,u,c,l=de.css(e,\"position\"),f=de(e),p={};\"static\"===l&&(e.style.position=\"relative\"),a=f.offset(),i=de.css(e,\"top\"),u=de.css(e,\"left\"),c=(\"absolute\"===l||\"fixed\"===l)&&(i+u).indexOf(\"auto\")>-1,c?(r=f.position(),s=r.top,o=r.left):(s=parseFloat(i)||0,o=parseFloat(u)||0),de.isFunction(t)&&(t=t.call(e,n,de.extend({},a))),null!=t.top&&(p.top=t.top-a.top+s),null!=t.left&&(p.left=t.left-a.left+o),\"using\"in t?t.using.call(e,p):f.css(p)}},de.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){de.offset.setOffset(this,e,t)});var t,n,r,o,i=this[0];if(i)return i.getClientRects().length?(r=i.getBoundingClientRect(),r.width||r.height?(o=i.ownerDocument,n=Z(o),t=o.documentElement,{top:r.top+n.pageYOffset-t.clientTop,left:r.left+n.pageXOffset-t.clientLeft}):r):{top:0,left:0}},position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return\"fixed\"===de.css(n,\"position\")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),de.nodeName(e[0],\"html\")||(r=e.offset()),r={top:r.top+de.css(e[0],\"borderTopWidth\",!0),left:r.left+de.css(e[0],\"borderLeftWidth\",!0)}),{top:t.top-r.top-de.css(n,\"marginTop\",!0),left:t.left-r.left-de.css(n,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&\"static\"===de.css(e,\"position\");)e=e.offsetParent;return e||Qe})}}),de.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(e,t){var n=\"pageYOffset\"===t;de.fn[e]=function(r){return Le(this,function(e,r,o){var i=Z(e);return void 0===o?i?i[t]:e[r]:void(i?i.scrollTo(n?i.pageXOffset:o,n?o:i.pageYOffset):e[r]=o)},e,r,arguments.length)}}),de.each([\"top\",\"left\"],function(e,t){de.cssHooks[t]=O(pe.pixelPosition,function(e,n){if(n)return n=D(e,t),st.test(n)?de(e).position()[t]+\"px\":n})}),de.each({Height:\"height\",Width:\"width\"},function(e,t){de.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){de.fn[r]=function(o,i){var s=arguments.length&&(n||\"boolean\"!=typeof o),a=n||(o===!0||i===!0?\"margin\":\"border\");return Le(this,function(t,n,o){var i;return de.isWindow(t)?0===r.indexOf(\"outer\")?t[\"inner\"+e]:t.document.documentElement[\"client\"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body[\"scroll\"+e],i[\"scroll\"+e],t.body[\"offset\"+e],i[\"offset\"+e],i[\"client\"+e])):void 0===o?de.css(t,n,a):de.style(t,n,o,a)},t,s?o:void 0,s)}})}),de.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),de.parseJSON=JSON.parse,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return de});var zt=e.jQuery,Xt=e.$;return de.noConflict=function(t){return e.$===de&&(e.$=Xt),t&&e.jQuery===de&&(e.jQuery=zt),de},t||(e.jQuery=e.$=de),de})},{}],2:[function(e,t,n){(function(e){function t(e,t){for(var n=0,r=e.length-1;r>=0;r--){var o=e[r];\".\"===o?e.splice(r,1):\"..\"===o?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift(\"..\");return e}function r(e,t){if(e.filter)return e.filter(t);for(var n=[],r=0;r<e.length;r++)t(e[r],r,e)&&n.push(e[r]);return n}var o=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/,i=function(e){return o.exec(e).slice(1)};n.resolve=function(){for(var n=\"\",o=!1,i=arguments.length-1;i>=-1&&!o;i--){var s=i>=0?arguments[i]:e.cwd();if(\"string\"!=typeof s)throw new TypeError(\"Arguments to path.resolve must be strings\");s&&(n=s+\"/\"+n,o=\"/\"===s.charAt(0))}return n=t(r(n.split(\"/\"),function(e){return!!e}),!o).join(\"/\"),(o?\"/\":\"\")+n||\".\"},n.normalize=function(e){var o=n.isAbsolute(e),i=\"/\"===s(e,-1);return e=t(r(e.split(\"/\"),function(e){return!!e}),!o).join(\"/\"),e||o||(e=\".\"),e&&i&&(e+=\"/\"),(o?\"/\":\"\")+e},n.isAbsolute=function(e){return\"/\"===e.charAt(0)},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(r(e,function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"Arguments to path.join must be strings\");return e}).join(\"/\"))},n.relative=function(e,t){function r(e){for(var t=0;t<e.length&&\"\"===e[t];t++);for(var n=e.length-1;n>=0&&\"\"===e[n];n--);return t>n?[]:e.slice(t,n-t+1)}e=n.resolve(e).substr(1),t=n.resolve(t).substr(1);for(var o=r(e.split(\"/\")),i=r(t.split(\"/\")),s=Math.min(o.length,i.length),a=s,u=0;u<s;u++)if(o[u]!==i[u]){a=u;break}for(var c=[],u=a;u<o.length;u++)c.push(\"..\");return c=c.concat(i.slice(a)),c.join(\"/\")},n.sep=\"/\",n.delimiter=\":\",n.dirname=function(e){var t=i(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):\".\"},n.basename=function(e,t){var n=i(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},n.extname=function(e){return i(e)[3]};var s=\"b\"===\"ab\".substr(-1)?function(e,t,n){return e.substr(t,n)}:function(e,t,n){return t<0&&(t=e.length+t),e.substr(t,n)}}).call(this,e(\"_process\"))},{_process:3}],3:[function(e,t,n){function r(){throw new Error(\"setTimeout has not been defined\")}function o(){throw new Error(\"clearTimeout has not been defined\")}function i(e){if(f===setTimeout)return setTimeout(e,0);if((f===r||!f)&&setTimeout)return f=setTimeout,setTimeout(e,0);try{return f(e,0)}catch(t){try{return f.call(null,e,0)}catch(t){return f.call(this,e,0)}}}function s(e){if(p===clearTimeout)return clearTimeout(e);if((p===o||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){m&&d&&(m=!1,d.length?g=d.concat(g):v=-1,g.length&&u())}function u(){if(!m){var e=i(a);m=!0;for(var t=g.length;t;){for(d=g,g=[];++v<t;)d&&d[v].run();v=-1,t=g.length}d=null,m=!1,s(e)}}function c(e,t){this.fun=e,this.array=t}function l(){}var f,p,h=t.exports={};!function(){try{f=\"function\"==typeof setTimeout?setTimeout:r}catch(e){f=r}try{p=\"function\"==typeof clearTimeout?clearTimeout:o}catch(e){p=o}}();var d,g=[],m=!1,v=-1;h.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];g.push(new c(e,t)),1!==g.length||m||i(u)},c.prototype.run=function(){this.fun.apply(null,this.array)},h.title=\"browser\",h.browser=!0,h.env={},h.argv=[],h.version=\"\",h.versions={},h.on=l,h.addListener=l,h.once=l,h.off=l,h.removeListener=l,h.removeAllListeners=l,h.emit=l,h.prependListener=l,h.prependOnceListener=l,h.listeners=function(e){return[]},h.binding=function(e){throw new Error(\"process.binding is not supported\")},h.cwd=function(){return\"/\"},h.chdir=function(e){throw new Error(\"process.chdir is not supported\")},h.umask=function(){return 0}},{}],4:[function(e,t,n){(function(e){!function(r){function o(e){throw new RangeError(L[e])}function i(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function s(e,t){var n=e.split(\"@\"),r=\"\";n.length>1&&(r=n[0]+\"@\",e=n[1]),e=e.replace(O,\".\");var o=e.split(\".\"),s=i(o,t).join(\".\");return r+s}function a(e){for(var t,n,r=[],o=0,i=e.length;o<i;)t=e.charCodeAt(o++),t>=55296&&t<=56319&&o<i?(n=e.charCodeAt(o++),56320==(64512&n)?r.push(((1023&t)<<10)+(1023&n)+65536):(r.push(t),o--)):r.push(t);return r}function u(e){return i(e,function(e){var t=\"\";return e>65535&&(e-=65536,t+=R(e>>>10&1023|55296),e=56320|1023&e),t+=R(e)}).join(\"\")}function c(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:T}function l(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function f(e,t,n){var r=0;for(e=n?F(e/E):e>>1,e+=F(e/t);e>H*j>>1;r+=T)e=F(e/H);return F(r+(H+1)*e/(e+k))}function p(e){var t,n,r,i,s,a,l,p,h,d,g=[],m=e.length,v=0,y=N,x=S;for(n=e.lastIndexOf(A),n<0&&(n=0),r=0;r<n;++r)e.charCodeAt(r)>=128&&o(\"not-basic\"),g.push(e.charCodeAt(r));for(i=n>0?n+1:0;i<m;){for(s=v,a=1,l=T;i>=m&&o(\"invalid-input\"),p=c(e.charCodeAt(i++)),(p>=T||p>F((w-v)/a))&&o(\"overflow\"),v+=p*a,h=l<=x?C:l>=x+j?j:l-x,!(p<h);l+=T)d=T-h,a>F(w/d)&&o(\"overflow\"),a*=d;t=g.length+1,x=f(v-s,t,0==s),F(v/t)>w-y&&o(\"overflow\"),y+=F(v/t),v%=t,g.splice(v++,0,y)}return u(g)}function h(e){var t,n,r,i,s,u,c,p,h,d,g,m,v,y,x,b=[];for(e=a(e),m=e.length,t=N,n=0,s=S,u=0;u<m;++u)g=e[u],g<128&&b.push(R(g));for(r=i=b.length,i&&b.push(A);r<m;){for(c=w,u=0;u<m;++u)g=e[u],g>=t&&g<c&&(c=g);for(v=r+1,c-t>F((w-n)/v)&&o(\"overflow\"),n+=(c-t)*v,t=c,u=0;u<m;++u)if(g=e[u],g<t&&++n>w&&o(\"overflow\"),g==t){for(p=n,h=T;d=h<=s?C:h>=s+j?j:h-s,!(p<d);h+=T)x=p-d,y=T-d,b.push(R(l(d+x%y,0))),p=F(x/y);b.push(R(l(p,0))),s=f(n,v,r==i),n=0,++r}++n,++t}return b.join(\"\")}function d(e){return s(e,function(e){return q.test(e)?p(e.slice(4).toLowerCase()):e})}function g(e){return s(e,function(e){return D.test(e)?\"xn--\"+h(e):e})}var m=\"object\"==typeof n&&n&&!n.nodeType&&n,v=\"object\"==typeof t&&t&&!t.nodeType&&t,y=\"object\"==typeof e&&e;y.global!==y&&y.window!==y&&y.self!==y||(r=y);var x,b,w=2147483647,T=36,C=1,j=26,k=38,E=700,S=72,N=128,A=\"-\",q=/^xn--/,D=/[^\\x20-\\x7E]/,O=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,L={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},H=T-C,F=Math.floor,R=String.fromCharCode;if(x={version:\"1.4.1\",ucs2:{decode:a,encode:u},decode:p,encode:h,toASCII:g,toUnicode:d},\"function\"==typeof define&&\"object\"==typeof define.amd&&define.amd)define(\"punycode\",function(){return x});else if(m&&v)if(t.exports==m)v.exports=x;else for(b in x)x.hasOwnProperty(b)&&(m[b]=x[b]);else r.punycode=x}(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],5:[function(e,t,n){\"use strict\";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.exports=function(e,t,n,i){t=t||\"&\",n=n||\"=\";var s={};if(\"string\"!=typeof e||0===e.length)return s;var a=/\\+/g;e=e.split(t);var u=1e3;i&&\"number\"==typeof i.maxKeys&&(u=i.maxKeys);var c=e.length;u>0&&c>u&&(c=u);for(var l=0;l<c;++l){var f,p,h,d,g=e[l].replace(a,\"%20\"),m=g.indexOf(n);m>=0?(f=g.substr(0,m),p=g.substr(m+1)):(f=g,p=\"\"),h=decodeURIComponent(f),d=decodeURIComponent(p),r(s,h)?o(s[h])?s[h].push(d):s[h]=[s[h],d]:s[h]=d}return s};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)}},{}],6:[function(e,t,n){\"use strict\";function r(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r<e.length;r++)n.push(t(e[r],r));return n}var o=function(e){switch(typeof e){case\"string\":return e;case\"boolean\":return e?\"true\":\"false\";case\"number\":return isFinite(e)?e:\"\";default:return\"\"}};t.exports=function(e,t,n,a){return t=t||\"&\",n=n||\"=\",null===e&&(e=void 0),\"object\"==typeof e?r(s(e),function(s){var a=encodeURIComponent(o(s))+n;return i(e[s])?r(e[s],function(e){return a+encodeURIComponent(o(e))}).join(t):a+encodeURIComponent(o(e[s]))}).join(t):a?encodeURIComponent(o(a))+n+encodeURIComponent(o(e)):\"\"};var i=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},s=Object.keys||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}},{}],7:[function(e,t,n){\"use strict\";n.decode=n.parse=e(\"./decode\"),n.encode=n.stringify=e(\"./encode\")},{\"./decode\":5,\"./encode\":6}],8:[function(e,t,n){\"use strict\";function r(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function o(e,t,n){\nif(e&&c.isObject(e)&&e instanceof r)return e;var o=new r;return o.parse(e,t,n),o}function i(e){return c.isString(e)&&(e=o(e)),e instanceof r?e.format():r.prototype.format.call(e)}function s(e,t){return o(e,!1,!0).resolve(t)}function a(e,t){return e?o(e,!1,!0).resolveObject(t):t}var u=e(\"punycode\"),c=e(\"./util\");n.parse=o,n.resolve=s,n.resolveObject=a,n.format=i,n.Url=r;var l=/^([a-z0-9.+-]+:)/i,f=/:[0-9]*$/,p=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,h=[\"<\",\">\",'\"',\"`\",\" \",\"\\r\",\"\\n\",\"\\t\"],d=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat(h),g=[\"'\"].concat(d),m=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(g),v=[\"/\",\"?\",\"#\"],y=255,x=/^[+a-z0-9A-Z_-]{0,63}$/,b=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,w={javascript:!0,\"javascript:\":!0},T={javascript:!0,\"javascript:\":!0},C={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0},j=e(\"querystring\");r.prototype.parse=function(e,t,n){if(!c.isString(e))throw new TypeError(\"Parameter 'url' must be a string, not \"+typeof e);var r=e.indexOf(\"?\"),o=r!==-1&&r<e.indexOf(\"#\")?\"?\":\"#\",i=e.split(o),s=/\\\\/g;i[0]=i[0].replace(s,\"/\"),e=i.join(o);var a=e;if(a=a.trim(),!n&&1===e.split(\"#\").length){var f=p.exec(a);if(f)return this.path=a,this.href=a,this.pathname=f[1],f[2]?(this.search=f[2],t?this.query=j.parse(this.search.substr(1)):this.query=this.search.substr(1)):t&&(this.search=\"\",this.query={}),this}var h=l.exec(a);if(h){h=h[0];var d=h.toLowerCase();this.protocol=d,a=a.substr(h.length)}if(n||h||a.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)){var k=\"//\"===a.substr(0,2);!k||h&&T[h]||(a=a.substr(2),this.slashes=!0)}if(!T[h]&&(k||h&&!C[h])){for(var E=-1,S=0;S<v.length;S++){var N=a.indexOf(v[S]);N!==-1&&(E===-1||N<E)&&(E=N)}var A,q;q=E===-1?a.lastIndexOf(\"@\"):a.lastIndexOf(\"@\",E),q!==-1&&(A=a.slice(0,q),a=a.slice(q+1),this.auth=decodeURIComponent(A)),E=-1;for(var S=0;S<m.length;S++){var N=a.indexOf(m[S]);N!==-1&&(E===-1||N<E)&&(E=N)}E===-1&&(E=a.length),this.host=a.slice(0,E),a=a.slice(E),this.parseHost(),this.hostname=this.hostname||\"\";var D=\"[\"===this.hostname[0]&&\"]\"===this.hostname[this.hostname.length-1];if(!D)for(var O=this.hostname.split(/\\./),S=0,L=O.length;S<L;S++){var H=O[S];if(H&&!H.match(x)){for(var F=\"\",R=0,I=H.length;R<I;R++)F+=H.charCodeAt(R)>127?\"x\":H[R];if(!F.match(x)){var P=O.slice(0,S),M=O.slice(S+1),$=H.match(b);$&&(P.push($[1]),M.unshift($[2])),M.length&&(a=\"/\"+M.join(\".\")+a),this.hostname=P.join(\".\");break}}}this.hostname.length>y?this.hostname=\"\":this.hostname=this.hostname.toLowerCase(),D||(this.hostname=u.toASCII(this.hostname));var W=this.port?\":\"+this.port:\"\",B=this.hostname||\"\";this.host=B+W,this.href+=this.host,D&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),\"/\"!==a[0]&&(a=\"/\"+a))}if(!w[d])for(var S=0,L=g.length;S<L;S++){var _=g[S];if(a.indexOf(_)!==-1){var U=encodeURIComponent(_);U===_&&(U=escape(_)),a=a.split(_).join(U)}}var z=a.indexOf(\"#\");z!==-1&&(this.hash=a.substr(z),a=a.slice(0,z));var X=a.indexOf(\"?\");if(X!==-1?(this.search=a.substr(X),this.query=a.substr(X+1),t&&(this.query=j.parse(this.query)),a=a.slice(0,X)):t&&(this.search=\"\",this.query={}),a&&(this.pathname=a),C[d]&&this.hostname&&!this.pathname&&(this.pathname=\"/\"),this.pathname||this.search){var W=this.pathname||\"\",V=this.search||\"\";this.path=W+V}return this.href=this.format(),this},r.prototype.format=function(){var e=this.auth||\"\";e&&(e=encodeURIComponent(e),e=e.replace(/%3A/i,\":\"),e+=\"@\");var t=this.protocol||\"\",n=this.pathname||\"\",r=this.hash||\"\",o=!1,i=\"\";this.host?o=e+this.host:this.hostname&&(o=e+(this.hostname.indexOf(\":\")===-1?this.hostname:\"[\"+this.hostname+\"]\"),this.port&&(o+=\":\"+this.port)),this.query&&c.isObject(this.query)&&Object.keys(this.query).length&&(i=j.stringify(this.query));var s=this.search||i&&\"?\"+i||\"\";return t&&\":\"!==t.substr(-1)&&(t+=\":\"),this.slashes||(!t||C[t])&&o!==!1?(o=\"//\"+(o||\"\"),n&&\"/\"!==n.charAt(0)&&(n=\"/\"+n)):o||(o=\"\"),r&&\"#\"!==r.charAt(0)&&(r=\"#\"+r),s&&\"?\"!==s.charAt(0)&&(s=\"?\"+s),n=n.replace(/[?#]/g,function(e){return encodeURIComponent(e)}),s=s.replace(\"#\",\"%23\"),t+o+n+s+r},r.prototype.resolve=function(e){return this.resolveObject(o(e,!1,!0)).format()},r.prototype.resolveObject=function(e){if(c.isString(e)){var t=new r;t.parse(e,!1,!0),e=t}for(var n=new r,o=Object.keys(this),i=0;i<o.length;i++){var s=o[i];n[s]=this[s]}if(n.hash=e.hash,\"\"===e.href)return n.href=n.format(),n;if(e.slashes&&!e.protocol){for(var a=Object.keys(e),u=0;u<a.length;u++){var l=a[u];\"protocol\"!==l&&(n[l]=e[l])}return C[n.protocol]&&n.hostname&&!n.pathname&&(n.path=n.pathname=\"/\"),n.href=n.format(),n}if(e.protocol&&e.protocol!==n.protocol){if(!C[e.protocol]){for(var f=Object.keys(e),p=0;p<f.length;p++){var h=f[p];n[h]=e[h]}return n.href=n.format(),n}if(n.protocol=e.protocol,e.host||T[e.protocol])n.pathname=e.pathname;else{for(var d=(e.pathname||\"\").split(\"/\");d.length&&!(e.host=d.shift()););e.host||(e.host=\"\"),e.hostname||(e.hostname=\"\"),\"\"!==d[0]&&d.unshift(\"\"),d.length<2&&d.unshift(\"\"),n.pathname=d.join(\"/\")}if(n.search=e.search,n.query=e.query,n.host=e.host||\"\",n.auth=e.auth,n.hostname=e.hostname||e.host,n.port=e.port,n.pathname||n.search){var g=n.pathname||\"\",m=n.search||\"\";n.path=g+m}return n.slashes=n.slashes||e.slashes,n.href=n.format(),n}var v=n.pathname&&\"/\"===n.pathname.charAt(0),y=e.host||e.pathname&&\"/\"===e.pathname.charAt(0),x=y||v||n.host&&e.pathname,b=x,w=n.pathname&&n.pathname.split(\"/\")||[],d=e.pathname&&e.pathname.split(\"/\")||[],j=n.protocol&&!C[n.protocol];if(j&&(n.hostname=\"\",n.port=null,n.host&&(\"\"===w[0]?w[0]=n.host:w.unshift(n.host)),n.host=\"\",e.protocol&&(e.hostname=null,e.port=null,e.host&&(\"\"===d[0]?d[0]=e.host:d.unshift(e.host)),e.host=null),x=x&&(\"\"===d[0]||\"\"===w[0])),y)n.host=e.host||\"\"===e.host?e.host:n.host,n.hostname=e.hostname||\"\"===e.hostname?e.hostname:n.hostname,n.search=e.search,n.query=e.query,w=d;else if(d.length)w||(w=[]),w.pop(),w=w.concat(d),n.search=e.search,n.query=e.query;else if(!c.isNullOrUndefined(e.search)){if(j){n.hostname=n.host=w.shift();var k=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");k&&(n.auth=k.shift(),n.host=n.hostname=k.shift())}return n.search=e.search,n.query=e.query,c.isNull(n.pathname)&&c.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.href=n.format(),n}if(!w.length)return n.pathname=null,n.search?n.path=\"/\"+n.search:n.path=null,n.href=n.format(),n;for(var E=w.slice(-1)[0],S=(n.host||e.host||w.length>1)&&(\".\"===E||\"..\"===E)||\"\"===E,N=0,A=w.length;A>=0;A--)E=w[A],\".\"===E?w.splice(A,1):\"..\"===E?(w.splice(A,1),N++):N&&(w.splice(A,1),N--);if(!x&&!b)for(;N--;N)w.unshift(\"..\");!x||\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0)||w.unshift(\"\"),S&&\"/\"!==w.join(\"/\").substr(-1)&&w.push(\"\");var q=\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0);if(j){n.hostname=n.host=q?\"\":w.length?w.shift():\"\";var k=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");k&&(n.auth=k.shift(),n.host=n.hostname=k.shift())}return x=x||n.host&&w.length,x&&!q&&w.unshift(\"\"),w.length?n.pathname=w.join(\"/\"):(n.pathname=null,n.path=null),c.isNull(n.pathname)&&c.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},r.prototype.parseHost=function(){var e=this.host,t=f.exec(e);t&&(t=t[0],\":\"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},{\"./util\":9,punycode:4,querystring:7}],9:[function(e,t,n){\"use strict\";t.exports={isString:function(e){return\"string\"==typeof e},isObject:function(e){return\"object\"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},{}],10:[function(e,t,n){var r=e(\"jquery\");t.exports=r({})},{jquery:1}],11:[function(e,t,n){var r=e(\"jquery\"),o=e(\"./events\"),i=e(\"./storage\"),s=e(\"./page\"),a=!1,u=window.gitbook||[],c={events:o,page:s,state:s.getState(),storage:i,push:function(e){a?e():u.push(e)}},l={gitbook:c,jquery:r};window.gitbook=c,window.$=r,window.jQuery=r,window.require=function(e,t){e=e.map(function(e){if(e=e.toLowerCase(),!l[e])throw new Error(\"GitBook module \"+e+\" doesn't exist\");return l[e]}),t.apply(null,e)},r(document).ready(function(){a=!0,r.each(u,function(e,t){t()})})},{\"./events\":10,\"./page\":12,\"./storage\":13,jquery:1}],12:[function(e,t,n){function r(e){console.log(\"page has changed\",e),o(e),l||(l=!0,c.trigger(\"start\",e.config.pluginsConfig)),c.trigger(\"page.change\")}function o(e){f.page=e.page,f.file=e.file,f.gitbook=e.gitbook,f.config=e.config,f.basePath=e.basePath,f.book=e.book,f.$book=s(\".book\"),f.revision=f.gitbook.time,f.level=f.page.level,f.filepath=f.file.path,f.chapterTitle=f.page.title,f.innerLanguage=f.book.language||\"\",f.root=a.resolve(location.protocol+\"//\"+location.host,u.dirname(u.resolve(location.pathname.replace(/\\/$/,\"/index.html\"),f.basePath))).replace(/\\/?$/,\"/\"),f.bookRoot=f.innerLanguage?a.resolve(f.root,\"..\"):f.root}function i(){return f}var s=e(\"jquery\"),a=e(\"url\"),u=e(\"path\"),c=e(\"./events\"),l=!1,f={};t.exports={hasChanged:r,setState:o,getState:i}},{\"./events\":10,jquery:1,path:2,url:8}],13:[function(e,t,n){var r=\"\";t.exports={setBaseKey:function(e){r=e},set:function(e,t){e=r+\":\"+e;try{localStorage[e]=JSON.stringify(t)}catch(e){}},get:function(e,t){var n;e=r+\":\"+e;try{n=localStorage[e]}catch(e){}if(void 0===n)return t;try{var o=JSON.parse(n);return null==o?t:o}catch(e){return n||t}},remove:function(e){e=r+\":\"+e;try{localStorage.removeItem(e)}catch(e){}}}},{}]},{},[11]);\n"
  },
  {
    "path": "docs/gitbook/style.css",
    "content": "/*! normalize.css v2.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:\"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}.link-inherit{color:inherit}.link-inherit:focus,.link-inherit:hover{color:inherit}.hidden{display:none}.alert{padding:15px;margin-bottom:20px;color:#444;background:#eee;border-bottom:5px solid #ddd}.alert-success{background:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-info{background:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-danger{background:#f2dede;border-color:#ebccd1;color:#a94442}.alert-warning{background:#fcf8e3;border-color:#faebcc;color:#8a6d3b}/*!\n *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome/fontawesome-webfont.eot?v=4.6.3);src:url(fonts/fontawesome/fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(fonts/fontawesome/fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(fonts/fontawesome/fontawesome-webfont.woff?v=4.6.3) format('woff'),url(fonts/fontawesome/fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(fonts/fontawesome/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\"\\f000\"}.fa-music:before{content:\"\\f001\"}.fa-search:before{content:\"\\f002\"}.fa-envelope-o:before{content:\"\\f003\"}.fa-heart:before{content:\"\\f004\"}.fa-star:before{content:\"\\f005\"}.fa-star-o:before{content:\"\\f006\"}.fa-user:before{content:\"\\f007\"}.fa-film:before{content:\"\\f008\"}.fa-th-large:before{content:\"\\f009\"}.fa-th:before{content:\"\\f00a\"}.fa-th-list:before{content:\"\\f00b\"}.fa-check:before{content:\"\\f00c\"}.fa-close:before,.fa-remove:before,.fa-times:before{content:\"\\f00d\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-search-minus:before{content:\"\\f010\"}.fa-power-off:before{content:\"\\f011\"}.fa-signal:before{content:\"\\f012\"}.fa-cog:before,.fa-gear:before{content:\"\\f013\"}.fa-trash-o:before{content:\"\\f014\"}.fa-home:before{content:\"\\f015\"}.fa-file-o:before{content:\"\\f016\"}.fa-clock-o:before{content:\"\\f017\"}.fa-road:before{content:\"\\f018\"}.fa-download:before{content:\"\\f019\"}.fa-arrow-circle-o-down:before{content:\"\\f01a\"}.fa-arrow-circle-o-up:before{content:\"\\f01b\"}.fa-inbox:before{content:\"\\f01c\"}.fa-play-circle-o:before{content:\"\\f01d\"}.fa-repeat:before,.fa-rotate-right:before{content:\"\\f01e\"}.fa-refresh:before{content:\"\\f021\"}.fa-list-alt:before{content:\"\\f022\"}.fa-lock:before{content:\"\\f023\"}.fa-flag:before{content:\"\\f024\"}.fa-headphones:before{content:\"\\f025\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-up:before{content:\"\\f028\"}.fa-qrcode:before{content:\"\\f029\"}.fa-barcode:before{content:\"\\f02a\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-book:before{content:\"\\f02d\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-print:before{content:\"\\f02f\"}.fa-camera:before{content:\"\\f030\"}.fa-font:before{content:\"\\f031\"}.fa-bold:before{content:\"\\f032\"}.fa-italic:before{content:\"\\f033\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-right:before{content:\"\\f038\"}.fa-align-justify:before{content:\"\\f039\"}.fa-list:before{content:\"\\f03a\"}.fa-dedent:before,.fa-outdent:before{content:\"\\f03b\"}.fa-indent:before{content:\"\\f03c\"}.fa-video-camera:before{content:\"\\f03d\"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:\"\\f03e\"}.fa-pencil:before{content:\"\\f040\"}.fa-map-marker:before{content:\"\\f041\"}.fa-adjust:before{content:\"\\f042\"}.fa-tint:before{content:\"\\f043\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\\f044\"}.fa-share-square-o:before{content:\"\\f045\"}.fa-check-square-o:before{content:\"\\f046\"}.fa-arrows:before{content:\"\\f047\"}.fa-step-backward:before{content:\"\\f048\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-backward:before{content:\"\\f04a\"}.fa-play:before{content:\"\\f04b\"}.fa-pause:before{content:\"\\f04c\"}.fa-stop:before{content:\"\\f04d\"}.fa-forward:before{content:\"\\f04e\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-step-forward:before{content:\"\\f051\"}.fa-eject:before{content:\"\\f052\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-times-circle:before{content:\"\\f057\"}.fa-check-circle:before{content:\"\\f058\"}.fa-question-circle:before{content:\"\\f059\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-times-circle-o:before{content:\"\\f05c\"}.fa-check-circle-o:before{content:\"\\f05d\"}.fa-ban:before{content:\"\\f05e\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-mail-forward:before,.fa-share:before{content:\"\\f064\"}.fa-expand:before{content:\"\\f065\"}.fa-compress:before{content:\"\\f066\"}.fa-plus:before{content:\"\\f067\"}.fa-minus:before{content:\"\\f068\"}.fa-asterisk:before{content:\"\\f069\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-gift:before{content:\"\\f06b\"}.fa-leaf:before{content:\"\\f06c\"}.fa-fire:before{content:\"\\f06d\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-exclamation-triangle:before,.fa-warning:before{content:\"\\f071\"}.fa-plane:before{content:\"\\f072\"}.fa-calendar:before{content:\"\\f073\"}.fa-random:before{content:\"\\f074\"}.fa-comment:before{content:\"\\f075\"}.fa-magnet:before{content:\"\\f076\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-retweet:before{content:\"\\f079\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-arrows-v:before{content:\"\\f07d\"}.fa-arrows-h:before{content:\"\\f07e\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\"\\f080\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-key:before{content:\"\\f084\"}.fa-cogs:before,.fa-gears:before{content:\"\\f085\"}.fa-comments:before{content:\"\\f086\"}.fa-thumbs-o-up:before{content:\"\\f087\"}.fa-thumbs-o-down:before{content:\"\\f088\"}.fa-star-half:before{content:\"\\f089\"}.fa-heart-o:before{content:\"\\f08a\"}.fa-sign-out:before{content:\"\\f08b\"}.fa-linkedin-square:before{content:\"\\f08c\"}.fa-thumb-tack:before{content:\"\\f08d\"}.fa-external-link:before{content:\"\\f08e\"}.fa-sign-in:before{content:\"\\f090\"}.fa-trophy:before{content:\"\\f091\"}.fa-github-square:before{content:\"\\f092\"}.fa-upload:before{content:\"\\f093\"}.fa-lemon-o:before{content:\"\\f094\"}.fa-phone:before{content:\"\\f095\"}.fa-square-o:before{content:\"\\f096\"}.fa-bookmark-o:before{content:\"\\f097\"}.fa-phone-square:before{content:\"\\f098\"}.fa-twitter:before{content:\"\\f099\"}.fa-facebook-f:before,.fa-facebook:before{content:\"\\f09a\"}.fa-github:before{content:\"\\f09b\"}.fa-unlock:before{content:\"\\f09c\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-feed:before,.fa-rss:before{content:\"\\f09e\"}.fa-hdd-o:before{content:\"\\f0a0\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bell:before{content:\"\\f0f3\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-hand-o-right:before{content:\"\\f0a4\"}.fa-hand-o-left:before{content:\"\\f0a5\"}.fa-hand-o-up:before{content:\"\\f0a6\"}.fa-hand-o-down:before{content:\"\\f0a7\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-globe:before{content:\"\\f0ac\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-filter:before{content:\"\\f0b0\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-group:before,.fa-users:before{content:\"\\f0c0\"}.fa-chain:before,.fa-link:before{content:\"\\f0c1\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-flask:before{content:\"\\f0c3\"}.fa-cut:before,.fa-scissors:before{content:\"\\f0c4\"}.fa-copy:before,.fa-files-o:before{content:\"\\f0c5\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-floppy-o:before,.fa-save:before{content:\"\\f0c7\"}.fa-square:before{content:\"\\f0c8\"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:\"\\f0c9\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-underline:before{content:\"\\f0cd\"}.fa-table:before{content:\"\\f0ce\"}.fa-magic:before{content:\"\\f0d0\"}.fa-truck:before{content:\"\\f0d1\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-plus:before{content:\"\\f0d5\"}.fa-money:before{content:\"\\f0d6\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-columns:before{content:\"\\f0db\"}.fa-sort:before,.fa-unsorted:before{content:\"\\f0dc\"}.fa-sort-desc:before,.fa-sort-down:before{content:\"\\f0dd\"}.fa-sort-asc:before,.fa-sort-up:before{content:\"\\f0de\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-linkedin:before{content:\"\\f0e1\"}.fa-rotate-left:before,.fa-undo:before{content:\"\\f0e2\"}.fa-gavel:before,.fa-legal:before{content:\"\\f0e3\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\\f0e4\"}.fa-comment-o:before{content:\"\\f0e5\"}.fa-comments-o:before{content:\"\\f0e6\"}.fa-bolt:before,.fa-flash:before{content:\"\\f0e7\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-clipboard:before,.fa-paste:before{content:\"\\f0ea\"}.fa-lightbulb-o:before{content:\"\\f0eb\"}.fa-exchange:before{content:\"\\f0ec\"}.fa-cloud-download:before{content:\"\\f0ed\"}.fa-cloud-upload:before{content:\"\\f0ee\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-bell-o:before{content:\"\\f0a2\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cutlery:before{content:\"\\f0f5\"}.fa-file-text-o:before{content:\"\\f0f6\"}.fa-building-o:before{content:\"\\f0f7\"}.fa-hospital-o:before{content:\"\\f0f8\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-beer:before{content:\"\\f0fc\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angle-down:before{content:\"\\f107\"}.fa-desktop:before{content:\"\\f108\"}.fa-laptop:before{content:\"\\f109\"}.fa-tablet:before{content:\"\\f10a\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\\f10b\"}.fa-circle-o:before{content:\"\\f10c\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-spinner:before{content:\"\\f110\"}.fa-circle:before{content:\"\\f111\"}.fa-mail-reply:before,.fa-reply:before{content:\"\\f112\"}.fa-github-alt:before{content:\"\\f113\"}.fa-folder-o:before{content:\"\\f114\"}.fa-folder-open-o:before{content:\"\\f115\"}.fa-smile-o:before{content:\"\\f118\"}.fa-frown-o:before{content:\"\\f119\"}.fa-meh-o:before{content:\"\\f11a\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-keyboard-o:before{content:\"\\f11c\"}.fa-flag-o:before{content:\"\\f11d\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-terminal:before{content:\"\\f120\"}.fa-code:before{content:\"\\f121\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\"\\f122\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\\f123\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-crop:before{content:\"\\f125\"}.fa-code-fork:before{content:\"\\f126\"}.fa-chain-broken:before,.fa-unlink:before{content:\"\\f127\"}.fa-question:before{content:\"\\f128\"}.fa-info:before{content:\"\\f129\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-superscript:before{content:\"\\f12b\"}.fa-subscript:before{content:\"\\f12c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-shield:before{content:\"\\f132\"}.fa-calendar-o:before{content:\"\\f133\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-rocket:before{content:\"\\f135\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-html5:before{content:\"\\f13b\"}.fa-css3:before{content:\"\\f13c\"}.fa-anchor:before{content:\"\\f13d\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-bullseye:before{content:\"\\f140\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-rss-square:before{content:\"\\f143\"}.fa-play-circle:before{content:\"\\f144\"}.fa-ticket:before{content:\"\\f145\"}.fa-minus-square:before{content:\"\\f146\"}.fa-minus-square-o:before{content:\"\\f147\"}.fa-level-up:before{content:\"\\f148\"}.fa-level-down:before{content:\"\\f149\"}.fa-check-square:before{content:\"\\f14a\"}.fa-pencil-square:before{content:\"\\f14b\"}.fa-external-link-square:before{content:\"\\f14c\"}.fa-share-square:before{content:\"\\f14d\"}.fa-compass:before{content:\"\\f14e\"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:\"\\f150\"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:\"\\f151\"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:\"\\f152\"}.fa-eur:before,.fa-euro:before{content:\"\\f153\"}.fa-gbp:before{content:\"\\f154\"}.fa-dollar:before,.fa-usd:before{content:\"\\f155\"}.fa-inr:before,.fa-rupee:before{content:\"\\f156\"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:\"\\f157\"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:\"\\f158\"}.fa-krw:before,.fa-won:before{content:\"\\f159\"}.fa-bitcoin:before,.fa-btc:before{content:\"\\f15a\"}.fa-file:before{content:\"\\f15b\"}.fa-file-text:before{content:\"\\f15c\"}.fa-sort-alpha-asc:before{content:\"\\f15d\"}.fa-sort-alpha-desc:before{content:\"\\f15e\"}.fa-sort-amount-asc:before{content:\"\\f160\"}.fa-sort-amount-desc:before{content:\"\\f161\"}.fa-sort-numeric-asc:before{content:\"\\f162\"}.fa-sort-numeric-desc:before{content:\"\\f163\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-youtube-square:before{content:\"\\f166\"}.fa-youtube:before{content:\"\\f167\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-youtube-play:before{content:\"\\f16a\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-instagram:before{content:\"\\f16d\"}.fa-flickr:before{content:\"\\f16e\"}.fa-adn:before{content:\"\\f170\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitbucket-square:before{content:\"\\f172\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-long-arrow-down:before{content:\"\\f175\"}.fa-long-arrow-up:before{content:\"\\f176\"}.fa-long-arrow-left:before{content:\"\\f177\"}.fa-long-arrow-right:before{content:\"\\f178\"}.fa-apple:before{content:\"\\f179\"}.fa-windows:before{content:\"\\f17a\"}.fa-android:before{content:\"\\f17b\"}.fa-linux:before{content:\"\\f17c\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-skype:before{content:\"\\f17e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-trello:before{content:\"\\f181\"}.fa-female:before{content:\"\\f182\"}.fa-male:before{content:\"\\f183\"}.fa-gittip:before,.fa-gratipay:before{content:\"\\f184\"}.fa-sun-o:before{content:\"\\f185\"}.fa-moon-o:before{content:\"\\f186\"}.fa-archive:before{content:\"\\f187\"}.fa-bug:before{content:\"\\f188\"}.fa-vk:before{content:\"\\f189\"}.fa-weibo:before{content:\"\\f18a\"}.fa-renren:before{content:\"\\f18b\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-arrow-circle-o-right:before{content:\"\\f18e\"}.fa-arrow-circle-o-left:before{content:\"\\f190\"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:\"\\f191\"}.fa-dot-circle-o:before{content:\"\\f192\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-try:before,.fa-turkish-lira:before{content:\"\\f195\"}.fa-plus-square-o:before{content:\"\\f196\"}.fa-space-shuttle:before{content:\"\\f197\"}.fa-slack:before{content:\"\\f198\"}.fa-envelope-square:before{content:\"\\f199\"}.fa-wordpress:before{content:\"\\f19a\"}.fa-openid:before{content:\"\\f19b\"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:\"\\f19c\"}.fa-graduation-cap:before,.fa-mortar-board:before{content:\"\\f19d\"}.fa-yahoo:before{content:\"\\f19e\"}.fa-google:before{content:\"\\f1a0\"}.fa-reddit:before{content:\"\\f1a1\"}.fa-reddit-square:before{content:\"\\f1a2\"}.fa-stumbleupon-circle:before{content:\"\\f1a3\"}.fa-stumbleupon:before{content:\"\\f1a4\"}.fa-delicious:before{content:\"\\f1a5\"}.fa-digg:before{content:\"\\f1a6\"}.fa-pied-piper-pp:before{content:\"\\f1a7\"}.fa-pied-piper-alt:before{content:\"\\f1a8\"}.fa-drupal:before{content:\"\\f1a9\"}.fa-joomla:before{content:\"\\f1aa\"}.fa-language:before{content:\"\\f1ab\"}.fa-fax:before{content:\"\\f1ac\"}.fa-building:before{content:\"\\f1ad\"}.fa-child:before{content:\"\\f1ae\"}.fa-paw:before{content:\"\\f1b0\"}.fa-spoon:before{content:\"\\f1b1\"}.fa-cube:before{content:\"\\f1b2\"}.fa-cubes:before{content:\"\\f1b3\"}.fa-behance:before{content:\"\\f1b4\"}.fa-behance-square:before{content:\"\\f1b5\"}.fa-steam:before{content:\"\\f1b6\"}.fa-steam-square:before{content:\"\\f1b7\"}.fa-recycle:before{content:\"\\f1b8\"}.fa-automobile:before,.fa-car:before{content:\"\\f1b9\"}.fa-cab:before,.fa-taxi:before{content:\"\\f1ba\"}.fa-tree:before{content:\"\\f1bb\"}.fa-spotify:before{content:\"\\f1bc\"}.fa-deviantart:before{content:\"\\f1bd\"}.fa-soundcloud:before{content:\"\\f1be\"}.fa-database:before{content:\"\\f1c0\"}.fa-file-pdf-o:before{content:\"\\f1c1\"}.fa-file-word-o:before{content:\"\\f1c2\"}.fa-file-excel-o:before{content:\"\\f1c3\"}.fa-file-powerpoint-o:before{content:\"\\f1c4\"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:\"\\f1c5\"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:\"\\f1c6\"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:\"\\f1c7\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\"\\f1c8\"}.fa-file-code-o:before{content:\"\\f1c9\"}.fa-vine:before{content:\"\\f1ca\"}.fa-codepen:before{content:\"\\f1cb\"}.fa-jsfiddle:before{content:\"\\f1cc\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:\"\\f1cd\"}.fa-circle-o-notch:before{content:\"\\f1ce\"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:\"\\f1d0\"}.fa-empire:before,.fa-ge:before{content:\"\\f1d1\"}.fa-git-square:before{content:\"\\f1d2\"}.fa-git:before{content:\"\\f1d3\"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:\"\\f1d4\"}.fa-tencent-weibo:before{content:\"\\f1d5\"}.fa-qq:before{content:\"\\f1d6\"}.fa-wechat:before,.fa-weixin:before{content:\"\\f1d7\"}.fa-paper-plane:before,.fa-send:before{content:\"\\f1d8\"}.fa-paper-plane-o:before,.fa-send-o:before{content:\"\\f1d9\"}.fa-history:before{content:\"\\f1da\"}.fa-circle-thin:before{content:\"\\f1db\"}.fa-header:before{content:\"\\f1dc\"}.fa-paragraph:before{content:\"\\f1dd\"}.fa-sliders:before{content:\"\\f1de\"}.fa-share-alt:before{content:\"\\f1e0\"}.fa-share-alt-square:before{content:\"\\f1e1\"}.fa-bomb:before{content:\"\\f1e2\"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:\"\\f1e3\"}.fa-tty:before{content:\"\\f1e4\"}.fa-binoculars:before{content:\"\\f1e5\"}.fa-plug:before{content:\"\\f1e6\"}.fa-slideshare:before{content:\"\\f1e7\"}.fa-twitch:before{content:\"\\f1e8\"}.fa-yelp:before{content:\"\\f1e9\"}.fa-newspaper-o:before{content:\"\\f1ea\"}.fa-wifi:before{content:\"\\f1eb\"}.fa-calculator:before{content:\"\\f1ec\"}.fa-paypal:before{content:\"\\f1ed\"}.fa-google-wallet:before{content:\"\\f1ee\"}.fa-cc-visa:before{content:\"\\f1f0\"}.fa-cc-mastercard:before{content:\"\\f1f1\"}.fa-cc-discover:before{content:\"\\f1f2\"}.fa-cc-amex:before{content:\"\\f1f3\"}.fa-cc-paypal:before{content:\"\\f1f4\"}.fa-cc-stripe:before{content:\"\\f1f5\"}.fa-bell-slash:before{content:\"\\f1f6\"}.fa-bell-slash-o:before{content:\"\\f1f7\"}.fa-trash:before{content:\"\\f1f8\"}.fa-copyright:before{content:\"\\f1f9\"}.fa-at:before{content:\"\\f1fa\"}.fa-eyedropper:before{content:\"\\f1fb\"}.fa-paint-brush:before{content:\"\\f1fc\"}.fa-birthday-cake:before{content:\"\\f1fd\"}.fa-area-chart:before{content:\"\\f1fe\"}.fa-pie-chart:before{content:\"\\f200\"}.fa-line-chart:before{content:\"\\f201\"}.fa-lastfm:before{content:\"\\f202\"}.fa-lastfm-square:before{content:\"\\f203\"}.fa-toggle-off:before{content:\"\\f204\"}.fa-toggle-on:before{content:\"\\f205\"}.fa-bicycle:before{content:\"\\f206\"}.fa-bus:before{content:\"\\f207\"}.fa-ioxhost:before{content:\"\\f208\"}.fa-angellist:before{content:\"\\f209\"}.fa-cc:before{content:\"\\f20a\"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:\"\\f20b\"}.fa-meanpath:before{content:\"\\f20c\"}.fa-buysellads:before{content:\"\\f20d\"}.fa-connectdevelop:before{content:\"\\f20e\"}.fa-dashcube:before{content:\"\\f210\"}.fa-forumbee:before{content:\"\\f211\"}.fa-leanpub:before{content:\"\\f212\"}.fa-sellsy:before{content:\"\\f213\"}.fa-shirtsinbulk:before{content:\"\\f214\"}.fa-simplybuilt:before{content:\"\\f215\"}.fa-skyatlas:before{content:\"\\f216\"}.fa-cart-plus:before{content:\"\\f217\"}.fa-cart-arrow-down:before{content:\"\\f218\"}.fa-diamond:before{content:\"\\f219\"}.fa-ship:before{content:\"\\f21a\"}.fa-user-secret:before{content:\"\\f21b\"}.fa-motorcycle:before{content:\"\\f21c\"}.fa-street-view:before{content:\"\\f21d\"}.fa-heartbeat:before{content:\"\\f21e\"}.fa-venus:before{content:\"\\f221\"}.fa-mars:before{content:\"\\f222\"}.fa-mercury:before{content:\"\\f223\"}.fa-intersex:before,.fa-transgender:before{content:\"\\f224\"}.fa-transgender-alt:before{content:\"\\f225\"}.fa-venus-double:before{content:\"\\f226\"}.fa-mars-double:before{content:\"\\f227\"}.fa-venus-mars:before{content:\"\\f228\"}.fa-mars-stroke:before{content:\"\\f229\"}.fa-mars-stroke-v:before{content:\"\\f22a\"}.fa-mars-stroke-h:before{content:\"\\f22b\"}.fa-neuter:before{content:\"\\f22c\"}.fa-genderless:before{content:\"\\f22d\"}.fa-facebook-official:before{content:\"\\f230\"}.fa-pinterest-p:before{content:\"\\f231\"}.fa-whatsapp:before{content:\"\\f232\"}.fa-server:before{content:\"\\f233\"}.fa-user-plus:before{content:\"\\f234\"}.fa-user-times:before{content:\"\\f235\"}.fa-bed:before,.fa-hotel:before{content:\"\\f236\"}.fa-viacoin:before{content:\"\\f237\"}.fa-train:before{content:\"\\f238\"}.fa-subway:before{content:\"\\f239\"}.fa-medium:before{content:\"\\f23a\"}.fa-y-combinator:before,.fa-yc:before{content:\"\\f23b\"}.fa-optin-monster:before{content:\"\\f23c\"}.fa-opencart:before{content:\"\\f23d\"}.fa-expeditedssl:before{content:\"\\f23e\"}.fa-battery-4:before,.fa-battery-full:before{content:\"\\f240\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\"\\f241\"}.fa-battery-2:before,.fa-battery-half:before{content:\"\\f242\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\"\\f243\"}.fa-battery-0:before,.fa-battery-empty:before{content:\"\\f244\"}.fa-mouse-pointer:before{content:\"\\f245\"}.fa-i-cursor:before{content:\"\\f246\"}.fa-object-group:before{content:\"\\f247\"}.fa-object-ungroup:before{content:\"\\f248\"}.fa-sticky-note:before{content:\"\\f249\"}.fa-sticky-note-o:before{content:\"\\f24a\"}.fa-cc-jcb:before{content:\"\\f24b\"}.fa-cc-diners-club:before{content:\"\\f24c\"}.fa-clone:before{content:\"\\f24d\"}.fa-balance-scale:before{content:\"\\f24e\"}.fa-hourglass-o:before{content:\"\\f250\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\"\\f251\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\"\\f252\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\"\\f253\"}.fa-hourglass:before{content:\"\\f254\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\"\\f255\"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:\"\\f256\"}.fa-hand-scissors-o:before{content:\"\\f257\"}.fa-hand-lizard-o:before{content:\"\\f258\"}.fa-hand-spock-o:before{content:\"\\f259\"}.fa-hand-pointer-o:before{content:\"\\f25a\"}.fa-hand-peace-o:before{content:\"\\f25b\"}.fa-trademark:before{content:\"\\f25c\"}.fa-registered:before{content:\"\\f25d\"}.fa-creative-commons:before{content:\"\\f25e\"}.fa-gg:before{content:\"\\f260\"}.fa-gg-circle:before{content:\"\\f261\"}.fa-tripadvisor:before{content:\"\\f262\"}.fa-odnoklassniki:before{content:\"\\f263\"}.fa-odnoklassniki-square:before{content:\"\\f264\"}.fa-get-pocket:before{content:\"\\f265\"}.fa-wikipedia-w:before{content:\"\\f266\"}.fa-safari:before{content:\"\\f267\"}.fa-chrome:before{content:\"\\f268\"}.fa-firefox:before{content:\"\\f269\"}.fa-opera:before{content:\"\\f26a\"}.fa-internet-explorer:before{content:\"\\f26b\"}.fa-television:before,.fa-tv:before{content:\"\\f26c\"}.fa-contao:before{content:\"\\f26d\"}.fa-500px:before{content:\"\\f26e\"}.fa-amazon:before{content:\"\\f270\"}.fa-calendar-plus-o:before{content:\"\\f271\"}.fa-calendar-minus-o:before{content:\"\\f272\"}.fa-calendar-times-o:before{content:\"\\f273\"}.fa-calendar-check-o:before{content:\"\\f274\"}.fa-industry:before{content:\"\\f275\"}.fa-map-pin:before{content:\"\\f276\"}.fa-map-signs:before{content:\"\\f277\"}.fa-map-o:before{content:\"\\f278\"}.fa-map:before{content:\"\\f279\"}.fa-commenting:before{content:\"\\f27a\"}.fa-commenting-o:before{content:\"\\f27b\"}.fa-houzz:before{content:\"\\f27c\"}.fa-vimeo:before{content:\"\\f27d\"}.fa-black-tie:before{content:\"\\f27e\"}.fa-fonticons:before{content:\"\\f280\"}.fa-reddit-alien:before{content:\"\\f281\"}.fa-edge:before{content:\"\\f282\"}.fa-credit-card-alt:before{content:\"\\f283\"}.fa-codiepie:before{content:\"\\f284\"}.fa-modx:before{content:\"\\f285\"}.fa-fort-awesome:before{content:\"\\f286\"}.fa-usb:before{content:\"\\f287\"}.fa-product-hunt:before{content:\"\\f288\"}.fa-mixcloud:before{content:\"\\f289\"}.fa-scribd:before{content:\"\\f28a\"}.fa-pause-circle:before{content:\"\\f28b\"}.fa-pause-circle-o:before{content:\"\\f28c\"}.fa-stop-circle:before{content:\"\\f28d\"}.fa-stop-circle-o:before{content:\"\\f28e\"}.fa-shopping-bag:before{content:\"\\f290\"}.fa-shopping-basket:before{content:\"\\f291\"}.fa-hashtag:before{content:\"\\f292\"}.fa-bluetooth:before{content:\"\\f293\"}.fa-bluetooth-b:before{content:\"\\f294\"}.fa-percent:before{content:\"\\f295\"}.fa-gitlab:before{content:\"\\f296\"}.fa-wpbeginner:before{content:\"\\f297\"}.fa-wpforms:before{content:\"\\f298\"}.fa-envira:before{content:\"\\f299\"}.fa-universal-access:before{content:\"\\f29a\"}.fa-wheelchair-alt:before{content:\"\\f29b\"}.fa-question-circle-o:before{content:\"\\f29c\"}.fa-blind:before{content:\"\\f29d\"}.fa-audio-description:before{content:\"\\f29e\"}.fa-volume-control-phone:before{content:\"\\f2a0\"}.fa-braille:before{content:\"\\f2a1\"}.fa-assistive-listening-systems:before{content:\"\\f2a2\"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:\"\\f2a3\"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:\"\\f2a4\"}.fa-glide:before{content:\"\\f2a5\"}.fa-glide-g:before{content:\"\\f2a6\"}.fa-sign-language:before,.fa-signing:before{content:\"\\f2a7\"}.fa-low-vision:before{content:\"\\f2a8\"}.fa-viadeo:before{content:\"\\f2a9\"}.fa-viadeo-square:before{content:\"\\f2aa\"}.fa-snapchat:before{content:\"\\f2ab\"}.fa-snapchat-ghost:before{content:\"\\f2ac\"}.fa-snapchat-square:before{content:\"\\f2ad\"}.fa-pied-piper:before{content:\"\\f2ae\"}.fa-first-order:before{content:\"\\f2b0\"}.fa-yoast:before{content:\"\\f2b1\"}.fa-themeisle:before{content:\"\\f2b2\"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:\"\\f2b3\"}.fa-fa:before,.fa-font-awesome:before{content:\"\\f2b4\"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}/*!\n * Preboot v2\n *\n * Open sourced under MIT license by @mdo.\n * Some variables and mixins from Bootstrap (Apache 2 license).\n */.book-langs-index{width:100%;height:100%;padding:40px 0;margin:0;overflow:auto}@media (max-width:600px){.book-langs-index{padding:0}}.book-langs-index .inner{max-width:600px;width:100%;margin:0 auto;padding:30px;background:#fff;border-radius:3px}.book-langs-index .inner h3{margin:0}.book-langs-index .inner .languages{list-style:none;padding:20px 30px;margin-top:20px;border-top:1px solid #eee}.book-langs-index .inner .languages:after,.book-langs-index .inner .languages:before{content:\" \";display:table;line-height:0}.book-langs-index .inner .languages:after{clear:both}.book-langs-index .inner .languages li{width:50%;float:left;padding:10px 5px;font-size:16px}@media (max-width:600px){.book-langs-index .inner .languages li{width:100%;max-width:100%}}.book-header{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;overflow:visible;height:50px;padding:0 8px;z-index:2;font-size:.85em;color:#7e888b;background:0 0}.book-header .btn{display:block;height:50px;padding:0 15px;border-bottom:none;color:#ccc;text-transform:uppercase;line-height:50px;-webkit-box-shadow:none!important;box-shadow:none!important;position:relative;font-size:14px}.book-header .btn:hover{position:relative;text-decoration:none;color:#444;background:0 0}.book-header .btn:focus{outline:0}.book-header h1{margin:0;font-size:20px;font-weight:200;text-align:center;line-height:50px;opacity:0;-webkit-transition:opacity ease .4s;-moz-transition:opacity ease .4s;-o-transition:opacity ease .4s;transition:opacity ease .4s;padding-left:200px;padding-right:200px;-webkit-transition:opacity .2s ease;-moz-transition:opacity .2s ease;-o-transition:opacity .2s ease;transition:opacity .2s ease;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.book-header h1 a,.book-header h1 a:hover{color:inherit;text-decoration:none}@media (max-width:1000px){.book-header h1{display:none}}.book-header h1 i{display:none}.book-header:hover h1{opacity:1}.book.is-loading .book-header h1 i{display:inline-block}.book.is-loading .book-header h1 a{display:none}.dropdown{position:relative}.dropdown-menu{position:absolute;top:100%;left:0;z-index:100;display:none;float:left;min-width:160px;padding:0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fafafa;border:1px solid rgba(0,0,0,.07);border-radius:1px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.open{display:block}.dropdown-menu.dropdown-left{left:auto;right:4%}.dropdown-menu.dropdown-left .dropdown-caret{right:14px;left:auto}.dropdown-menu .dropdown-caret{position:absolute;top:-8px;left:14px;width:18px;height:10px;float:left;overflow:hidden}.dropdown-menu .dropdown-caret .caret-outer{position:absolute;border-left:9px solid transparent;border-right:9px solid transparent;border-bottom:9px solid rgba(0,0,0,.1);height:auto;left:0;top:0;width:auto;display:inline-block;margin-left:-1px}.dropdown-menu .dropdown-caret .caret-inner{position:absolute;display:inline-block;margin-top:-1px;top:0;top:1px;border-left:9px solid transparent;border-right:9px solid transparent;border-bottom:9px solid #fafafa}.dropdown-menu .buttons{border-bottom:1px solid rgba(0,0,0,.07)}.dropdown-menu .buttons:after,.dropdown-menu .buttons:before{content:\" \";display:table;line-height:0}.dropdown-menu .buttons:after{clear:both}.dropdown-menu .buttons:last-child{border-bottom:none}.dropdown-menu .buttons .button{border:0;background-color:transparent;color:#a6a6a6;width:100%;text-align:center;float:left;line-height:1.42857143;padding:8px 4px}.dropdown-menu .buttons .button:hover{color:#444}.dropdown-menu .buttons .button:focus,.dropdown-menu .buttons .button:hover{outline:0}.dropdown-menu .buttons .button.size-2{width:50%}.dropdown-menu .buttons .button.size-3{width:33%}.book-summary{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;position:absolute;top:0;left:-300px;bottom:0;z-index:1;overflow-y:auto;width:300px;color:#364149;background:#fafafa;border-right:1px solid rgba(0,0,0,.07);-webkit-transition:left 250ms ease;-moz-transition:left 250ms ease;-o-transition:left 250ms ease;transition:left 250ms ease}.book-summary ul.summary{list-style:none;margin:0;padding:0;-webkit-transition:top .5s ease;-moz-transition:top .5s ease;-o-transition:top .5s ease;transition:top .5s ease}.book-summary ul.summary li{list-style:none}.book-summary ul.summary li.header{padding:10px 15px;padding-top:20px;text-transform:uppercase;color:#939da3}.book-summary ul.summary li.divider{height:1px;margin:7px 0;overflow:hidden;background:rgba(0,0,0,.07)}.book-summary ul.summary li i.fa-check{display:none;position:absolute;right:9px;top:16px;font-size:9px;color:#3c3}.book-summary ul.summary li.done>a{color:#364149;font-weight:400}.book-summary ul.summary li.done>a i{display:inline}.book-summary ul.summary li a,.book-summary ul.summary li span{display:block;padding:10px 15px;border-bottom:none;color:#364149;background:0 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative}.book-summary ul.summary li a:hover{text-decoration:underline}.book-summary ul.summary li a:focus{outline:0}.book-summary ul.summary li.active>a{color:#008cff;background:0 0;text-decoration:none}.book-summary ul.summary li ul{padding-left:20px}@media (max-width:600px){.book-summary{width:calc(100% - 60px);bottom:0;left:-100%}}.book.with-summary .book-summary{left:0}.book.without-animation .book-summary{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.book{position:relative;width:100%;height:100%}@media (min-width:600px){.book.with-summary .book-body{left:300px}}@media (max-width:600px){.book.with-summary{overflow:hidden}.book.with-summary .book-body{-webkit-transform:translate(calc(100% - 60px),0);-moz-transform:translate(calc(100% - 60px),0);-ms-transform:translate(calc(100% - 60px),0);-o-transform:translate(calc(100% - 60px),0);transform:translate(calc(100% - 60px),0)}}.book.without-animation .book-body{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.book-body{position:absolute;top:0;right:0;left:0;bottom:0;overflow-y:auto;color:#000;background:#fff;-webkit-transition:left 250ms ease;-moz-transition:left 250ms ease;-o-transition:left 250ms ease;transition:left 250ms ease}.book-body .body-inner{position:absolute;top:0;right:0;left:0;bottom:0;overflow-y:auto}@media (max-width:1240px){.book-body{-webkit-transition:-webkit-transform 250ms ease;-moz-transition:-moz-transform 250ms ease;-o-transition:-o-transform 250ms ease;transition:transform 250ms ease;padding-bottom:20px}.book-body .body-inner{position:static;min-height:calc(100% - 50px)}}.page-wrapper{position:relative;outline:0}.page-inner{position:relative;max-width:800px;margin:0 auto;padding:20px 15px 40px 15px}.page-inner .btn-group .btn{border-radius:0;background:#eee;border:0}.buttons:after,.buttons:before{content:\" \";display:table;line-height:0}.buttons:after{clear:both}.button{border:0;background-color:transparent;background:#eee;color:#666;width:100%;text-align:center;float:left;line-height:1.42857143;padding:8px 4px}.button:hover{color:#444}.button:focus,.button:hover{outline:0}.button.size-2{width:50%}.button.size-3{width:33%}.markdown-section{display:block;word-wrap:break-word;overflow:hidden;color:#333;line-height:1.7;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%}.markdown-section *{box-sizing:border-box;-webkit-box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section>:last-child{margin-bottom:0!important}.markdown-section blockquote,.markdown-section code,.markdown-section figure,.markdown-section img,.markdown-section pre,.markdown-section table,.markdown-section tr{page-break-inside:avoid}.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section h5,.markdown-section p{orphans:3;widows:3}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section h5{page-break-after:avoid}.markdown-section b,.markdown-section strong{font-weight:700}.markdown-section em{font-style:italic}.markdown-section blockquote,.markdown-section dl,.markdown-section ol,.markdown-section p,.markdown-section table,.markdown-section ul{margin-top:0;margin-bottom:.85em}.markdown-section a{color:#4183c4;text-decoration:none;background:0 0}.markdown-section a:active,.markdown-section a:focus,.markdown-section a:hover{outline:0;text-decoration:underline}.markdown-section img{border:0;max-width:100%}.markdown-section hr{height:4px;padding:0;margin:1.7em 0;overflow:hidden;background-color:#e7e7e7;border:none}.markdown-section hr:after,.markdown-section hr:before{display:table;content:\" \"}.markdown-section hr:after{clear:both}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section h5,.markdown-section h6{margin-top:1.275em;margin-bottom:.85em;font-weight:700}.markdown-section h1{font-size:2em}.markdown-section h2{font-size:1.75em}.markdown-section h3{font-size:1.5em}.markdown-section h4{font-size:1.25em}.markdown-section h5{font-size:1em}.markdown-section h6{font-size:1em;color:#777}.markdown-section code,.markdown-section pre{font-family:Consolas,\"Liberation Mono\",Menlo,Courier,monospace;direction:ltr;margin:0;padding:0;border:none;color:inherit}.markdown-section pre{overflow:auto;word-wrap:normal;margin:0;padding:.85em 1em;margin-bottom:1.275em;background:#f7f7f7}.markdown-section pre>code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;font-size:.85em;white-space:pre;background:0 0}.markdown-section pre>code:after,.markdown-section pre>code:before{content:normal}.markdown-section code{padding:.2em;margin:0;font-size:.85em;background-color:#f7f7f7}.markdown-section code:after,.markdown-section code:before{letter-spacing:-.2em;content:\"\\00a0\"}.markdown-section table{display:table;width:100%;border-collapse:collapse;border-spacing:0;overflow:auto}.markdown-section table td,.markdown-section table th{padding:6px 13px;border:1px solid #ddd}.markdown-section table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-section table tr:nth-child(2n){background-color:#f8f8f8}.markdown-section table th{font-weight:700}.markdown-section ol,.markdown-section ul{padding:0;margin:0;margin-bottom:.85em;padding-left:2em}.markdown-section ol ol,.markdown-section ol ul,.markdown-section ul ol,.markdown-section ul ul{margin-top:0;margin-bottom:0}.markdown-section ol ol{list-style-type:lower-roman}.markdown-section blockquote{margin:0;margin-bottom:.85em;padding:0 15px;color:#858585;border-left:4px solid #e5e5e5}.markdown-section blockquote:first-child{margin-top:0}.markdown-section blockquote:last-child{margin-bottom:0}.markdown-section dl{padding:0}.markdown-section dl dt{padding:0;margin-top:.85em;font-style:italic;font-weight:700}.markdown-section dl dd{padding:0 .85em;margin-bottom:.85em}.markdown-section dd{margin-left:0}.markdown-section .glossary-term{cursor:help;text-decoration:underline}.navigation{position:absolute;top:50px;bottom:0;margin:0;max-width:150px;min-width:90px;display:flex;justify-content:center;align-content:center;flex-direction:column;font-size:40px;color:#ccc;text-align:center;-webkit-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease;transition:all 350ms ease}.navigation:hover{text-decoration:none;color:#444}.navigation.navigation-next{right:0}.navigation.navigation-prev{left:0}@media (max-width:1240px){.navigation{position:static;top:auto;max-width:50%;width:50%;display:inline-block;float:left}.navigation.navigation-unique{max-width:100%;width:100%}}#book-search-input{padding:6px;background:0 0;transition:top .5s ease;background:#fff;border-bottom:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);margin-bottom:10px;margin-top:-1px}#book-search-input input,#book-search-input input:focus,#book-search-input input:hover{width:100%;background:0 0;border:1px solid transparent;box-shadow:none;outline:0;line-height:22px;padding:7px 7px;color:inherit}#book-search-results{opacity:1}#book-search-results .search-results .search-results-title{text-transform:uppercase;text-align:center;font-weight:200;margin-bottom:35px;opacity:.6}#book-search-results .search-results .has-results .search-results-item{display:block;word-wrap:break-word;overflow:hidden;color:#333;line-height:1.7;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%}#book-search-results .search-results .has-results .search-results-item *{box-sizing:border-box;-webkit-box-sizing:border-box;font-size:inherit}#book-search-results .search-results .has-results .search-results-item>:first-child{margin-top:0!important}#book-search-results .search-results .has-results .search-results-item>:last-child{margin-bottom:0!important}#book-search-results .search-results .has-results .search-results-item blockquote,#book-search-results .search-results .has-results .search-results-item code,#book-search-results .search-results .has-results .search-results-item figure,#book-search-results .search-results .has-results .search-results-item img,#book-search-results .search-results .has-results .search-results-item pre,#book-search-results .search-results .has-results .search-results-item table,#book-search-results .search-results .has-results .search-results-item tr{page-break-inside:avoid}#book-search-results .search-results .has-results .search-results-item h2,#book-search-results .search-results .has-results .search-results-item h3,#book-search-results .search-results .has-results .search-results-item h4,#book-search-results .search-results .has-results .search-results-item h5,#book-search-results .search-results .has-results .search-results-item p{orphans:3;widows:3}#book-search-results .search-results .has-results .search-results-item h1,#book-search-results .search-results .has-results .search-results-item h2,#book-search-results .search-results .has-results .search-results-item h3,#book-search-results .search-results .has-results .search-results-item h4,#book-search-results .search-results .has-results .search-results-item h5{page-break-after:avoid}#book-search-results .search-results .has-results .search-results-item b,#book-search-results .search-results .has-results .search-results-item strong{font-weight:700}#book-search-results .search-results .has-results .search-results-item em{font-style:italic}#book-search-results .search-results .has-results .search-results-item blockquote,#book-search-results .search-results .has-results .search-results-item dl,#book-search-results .search-results .has-results .search-results-item ol,#book-search-results .search-results .has-results .search-results-item p,#book-search-results .search-results .has-results .search-results-item table,#book-search-results .search-results .has-results .search-results-item ul{margin-top:0;margin-bottom:.85em}#book-search-results .search-results .has-results .search-results-item a{color:#4183c4;text-decoration:none;background:0 0}#book-search-results .search-results .has-results .search-results-item a:active,#book-search-results .search-results .has-results .search-results-item a:focus,#book-search-results .search-results .has-results .search-results-item a:hover{outline:0;text-decoration:underline}#book-search-results .search-results .has-results .search-results-item img{border:0;max-width:100%}#book-search-results .search-results .has-results .search-results-item hr{height:4px;padding:0;margin:1.7em 0;overflow:hidden;background-color:#e7e7e7;border:none}#book-search-results .search-results .has-results .search-results-item hr:after,#book-search-results .search-results .has-results .search-results-item hr:before{display:table;content:\" \"}#book-search-results .search-results .has-results .search-results-item hr:after{clear:both}#book-search-results .search-results .has-results .search-results-item h1,#book-search-results .search-results .has-results .search-results-item h2,#book-search-results .search-results .has-results .search-results-item h3,#book-search-results .search-results .has-results .search-results-item h4,#book-search-results .search-results .has-results .search-results-item h5,#book-search-results .search-results .has-results .search-results-item h6{margin-top:1.275em;margin-bottom:.85em;font-weight:700}#book-search-results .search-results .has-results .search-results-item h1{font-size:2em}#book-search-results .search-results .has-results .search-results-item h2{font-size:1.75em}#book-search-results .search-results .has-results .search-results-item h3{font-size:1.5em}#book-search-results .search-results .has-results .search-results-item h4{font-size:1.25em}#book-search-results .search-results .has-results .search-results-item h5{font-size:1em}#book-search-results .search-results .has-results .search-results-item h6{font-size:1em;color:#777}#book-search-results .search-results .has-results .search-results-item code,#book-search-results .search-results .has-results .search-results-item pre{font-family:Consolas,\"Liberation Mono\",Menlo,Courier,monospace;direction:ltr;margin:0;padding:0;border:none;color:inherit}#book-search-results .search-results .has-results .search-results-item pre{overflow:auto;word-wrap:normal;margin:0;padding:.85em 1em;margin-bottom:1.275em;background:#f7f7f7}#book-search-results .search-results .has-results .search-results-item pre>code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;font-size:.85em;white-space:pre;background:0 0}#book-search-results .search-results .has-results .search-results-item pre>code:after,#book-search-results .search-results .has-results .search-results-item pre>code:before{content:normal}#book-search-results .search-results .has-results .search-results-item code{padding:.2em;margin:0;font-size:.85em;background-color:#f7f7f7}#book-search-results .search-results .has-results .search-results-item code:after,#book-search-results .search-results .has-results .search-results-item code:before{letter-spacing:-.2em;content:\"\\00a0\"}#book-search-results .search-results .has-results .search-results-item table{display:table;width:100%;border-collapse:collapse;border-spacing:0;overflow:auto}#book-search-results .search-results .has-results .search-results-item table td,#book-search-results .search-results .has-results .search-results-item table th{padding:6px 13px;border:1px solid #ddd}#book-search-results .search-results .has-results .search-results-item table tr{background-color:#fff;border-top:1px solid #ccc}#book-search-results .search-results .has-results .search-results-item table tr:nth-child(2n){background-color:#f8f8f8}#book-search-results .search-results .has-results .search-results-item table th{font-weight:700}#book-search-results .search-results .has-results .search-results-item ol,#book-search-results .search-results .has-results .search-results-item ul{padding:0;margin:0;margin-bottom:.85em;padding-left:2em}#book-search-results .search-results .has-results .search-results-item ol ol,#book-search-results .search-results .has-results .search-results-item ol ul,#book-search-results .search-results .has-results .search-results-item ul ol,#book-search-results .search-results .has-results .search-results-item ul ul{margin-top:0;margin-bottom:0}#book-search-results .search-results .has-results .search-results-item ol ol{list-style-type:lower-roman}#book-search-results .search-results .has-results .search-results-item blockquote{margin:0;margin-bottom:.85em;padding:0 15px;color:#858585;border-left:4px solid #e5e5e5}#book-search-results .search-results .has-results .search-results-item blockquote:first-child{margin-top:0}#book-search-results .search-results .has-results .search-results-item blockquote:last-child{margin-bottom:0}#book-search-results .search-results .has-results .search-results-item dl{padding:0}#book-search-results .search-results .has-results .search-results-item dl dt{padding:0;margin-top:.85em;font-style:italic;font-weight:700}#book-search-results .search-results .has-results .search-results-item dl dd{padding:0 .85em;margin-bottom:.85em}#book-search-results .search-results .has-results .search-results-item dd{margin-left:0}#book-search-results .search-results .has-results .search-results-item h3{margin-top:0;margin-bottom:0}#book-search-results .search-results .no-results{padding:40px 0}body.search-loading #book-search-results{opacity:.3}body.with-search .navigation{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:none;-webkit-touch-callout:none;-webkit-font-smoothing:antialiased}a{text-decoration:none}body,html{height:100%}html{font-size:62.5%}body{text-rendering:optimizeLegibility;font-smoothing:antialiased;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:.2px;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}"
  },
  {
    "path": "docs/gitbook/theme.js",
    "content": "!function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var u=\"function\"==typeof require&&require;if(!s&&u)return u(a,!0);if(i)return i(a,!0);var l=new Error(\"Cannot find module '\"+a+\"'\");throw l.code=\"MODULE_NOT_FOUND\",l}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var i=\"function\"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(e,t,n){!function(e,n){\"use strict\";\"object\"==typeof t&&\"object\"==typeof t.exports?t.exports=e.document?n(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return n(e)}:n(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";function n(e,t){t=t||te;var n=t.createElement(\"script\");n.text=e,t.head.appendChild(n).parentNode.removeChild(n)}function r(e){var t=!!e&&\"length\"in e&&e.length,n=de.type(e);return\"function\"!==n&&!de.isWindow(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):\"string\"!=typeof t?de.grep(e,function(e){return ae.call(t,e)>-1!==n}):ke.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return ae.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function a(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function s(e){return e}function u(e){throw e}function l(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function c(){te.removeEventListener(\"DOMContentLoaded\",c),e.removeEventListener(\"load\",c),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return\"true\"===e||\"false\"!==e&&(\"null\"===e?null:e===+e+\"\"?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(Re,\"-$&\").toLowerCase(),n=e.getAttribute(r),\"string\"==typeof n){try{n=p(n)}catch(e){}Pe.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,a=20,s=r?function(){return r.cur()}:function(){return de.css(e,t,\"\")},u=s(),l=n&&n[3]||(de.cssNumber[t]?\"\":\"px\"),c=(de.cssNumber[t]||\"px\"!==l&&+u)&&$e.exec(de.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do i=i||\".5\",c/=i,de.style(e,t,c+l);while(i!==(i=s()/u)&&1!==i&&--a)}return n&&(c=+c||+u||0,o=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,\"display\"),t.parentNode.removeChild(t),\"none\"===o&&(o=\"block\"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,a=e.length;i<a;i++)r=e[i],r.style&&(n=r.style.display,t?(\"none\"===n&&(o[i]=Fe.get(r,\"display\")||null,o[i]||(r.style.display=\"\")),\"\"===r.style.display&&We(r)&&(o[i]=g(r))):\"none\"!==n&&(o[i]=\"none\",Fe.set(r,\"display\",n)));for(i=0;i<a;i++)null!=o[i]&&(e[i].style.display=o[i]);return e}function v(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&de.nodeName(e,t)?de.merge([e],n):n}function y(e,t){for(var n=0,r=e.length;n<r;n++)Fe.set(e[n],\"globalEval\",!t||Fe.get(t[n],\"globalEval\"))}function b(e,t,n,r,o){for(var i,a,s,u,l,c,f=t.createDocumentFragment(),p=[],h=0,d=e.length;h<d;h++)if(i=e[h],i||0===i)if(\"object\"===de.type(i))de.merge(p,i.nodeType?[i]:i);else if(Ge.test(i)){for(a=a||f.appendChild(t.createElement(\"div\")),s=(Xe.exec(i)||[\"\",\"\"])[1].toLowerCase(),u=Ve[s]||Ve._default,a.innerHTML=u[1]+de.htmlPrefilter(i)+u[2],c=u[0];c--;)a=a.lastChild;de.merge(p,a.childNodes),a=f.firstChild,a.textContent=\"\"}else p.push(t.createTextNode(i));for(f.textContent=\"\",h=0;i=p[h++];)if(r&&de.inArray(i,r)>-1)o&&o.push(i);else if(l=de.contains(i.ownerDocument,i),a=v(f.appendChild(i),\"script\"),l&&y(a),n)for(c=0;i=a[c++];)Ke.test(i.type||\"\")&&n.push(i);return f}function x(){return!0}function w(){return!1}function C(){try{return te.activeElement}catch(e){}}function T(e,t,n,r,o,i){var a,s;if(\"object\"==typeof t){\"string\"!=typeof n&&(r=r||n,n=void 0);for(s in t)T(e,s,n,r,t[s],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&(\"string\"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(a=o,o=function(e){return de().off(e),a.apply(this,arguments)},o.guid=a.guid||(a.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function k(e,t){return de.nodeName(e,\"table\")&&de.nodeName(11!==t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e:e}function j(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function N(e,t){var n,r,o,i,a,s,u,l;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),a=Fe.set(t,i),l=i.events)){delete a.handle,a.events={};for(o in l)for(n=0,r=l[o].length;n<r;n++)de.event.add(t,o,l[o][n])}Pe.hasData(e)&&(s=Pe.access(e),u=de.extend({},s),Pe.set(t,u))}}function S(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&ze.test(e.type)?t.checked=e.checked:\"input\"!==n&&\"textarea\"!==n||(t.defaultValue=e.defaultValue)}function A(e,t,r,o){t=oe.apply([],t);var i,a,s,u,l,c,f=0,p=e.length,h=p-1,d=t[0],g=de.isFunction(d);if(g||p>1&&\"string\"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=b(t,e[0].ownerDocument,!1,e,o),a=i.firstChild,1===i.childNodes.length&&(i=a),a||o)){for(s=de.map(v(i,\"script\"),j),u=s.length;f<p;f++)l=i,f!==h&&(l=de.clone(l,!0,!0),u&&de.merge(s,v(l,\"script\"))),r.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,de.map(s,E),f=0;f<u;f++)l=s[f],Ke.test(l.type||\"\")&&!Fe.access(l,\"globalEval\")&&de.contains(c,l)&&(l.src?de._evalUrl&&de._evalUrl(l.src):n(l.textContent.replace(ot,\"\"),c))}return e}function q(e,t,n){for(var r,o=t?de.filter(t,e):e,i=0;null!=(r=o[i]);i++)n||1!==r.nodeType||de.cleanData(v(r)),r.parentNode&&(n&&de.contains(r.ownerDocument,r)&&y(v(r,\"script\")),r.parentNode.removeChild(r));return e}function D(e,t,n){var r,o,i,a,s=e.style;return n=n||st(e),n&&(a=n.getPropertyValue(t)||n[t],\"\"!==a||de.contains(e.ownerDocument,e)||(a=de.style(e,t)),!pe.pixelMarginRight()&&at.test(a)&&it.test(t)&&(r=s.width,o=s.minWidth,i=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=o,s.maxWidth=i)),void 0!==a?a+\"\":a}function O(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function L(e){if(e in pt)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=ft.length;n--;)if(e=ft[n]+t,e in pt)return e}function H(e,t,n){var r=$e.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function F(e,t,n,r,o){var i,a=0;for(i=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0;i<4;i+=2)\"margin\"===n&&(a+=de.css(e,n+_e[i],!0,o)),r?(\"content\"===n&&(a-=de.css(e,\"padding\"+_e[i],!0,o)),\"margin\"!==n&&(a-=de.css(e,\"border\"+_e[i]+\"Width\",!0,o))):(a+=de.css(e,\"padding\"+_e[i],!0,o),\"padding\"!==n&&(a+=de.css(e,\"border\"+_e[i]+\"Width\",!0,o)));return a}function P(e,t,n){var r,o=!0,i=st(e),a=\"border-box\"===de.css(e,\"boxSizing\",!1,i);if(e.getClientRects().length&&(r=e.getBoundingClientRect()[t]),r<=0||null==r){if(r=D(e,t,i),(r<0||null==r)&&(r=e.style[t]),at.test(r))return r;o=a&&(pe.boxSizingReliable()||r===e.style[t]),r=parseFloat(r)||0}return r+F(e,t,n||(a?\"border\":\"content\"),o,i)+\"px\"}function I(e,t,n,r,o){return new I.prototype.init(e,t,n,r,o)}function R(){dt&&(e.requestAnimationFrame(R),de.fx.tick())}function M(){return e.setTimeout(function(){ht=void 0}),ht=de.now()}function $(e,t){var n,r=0,o={height:e};for(t=t?1:0;r<4;r+=2-t)n=_e[r],o[\"margin\"+n]=o[\"padding\"+n]=e;return t&&(o.opacity=o.width=e),o}function _(e,t,n){for(var r,o=(U.tweeners[t]||[]).concat(U.tweeners[\"*\"]),i=0,a=o.length;i<a;i++)if(r=o[i].call(n,t,e))return r}function W(e,t,n){var r,o,i,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,h={},d=e.style,g=e.nodeType&&We(e),v=Fe.get(e,\"fxshow\");n.queue||(a=de._queueHooks(e,\"fx\"),null==a.unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,de.queue(e,\"fx\").length||a.empty.fire()})}));for(r in t)if(o=t[r],gt.test(o)){if(delete t[r],i=i||\"toggle\"===o,o===(g?\"hide\":\"show\")){if(\"show\"!==o||!v||void 0===v[r])continue;g=!0}h[r]=v&&v[r]||de.style(e,r)}if(u=!de.isEmptyObject(t),u||!de.isEmptyObject(h)){f&&1===e.nodeType&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],l=v&&v.display,null==l&&(l=Fe.get(e,\"display\")),c=de.css(e,\"display\"),\"none\"===c&&(l?c=l:(m([e],!0),l=e.style.display||l,c=de.css(e,\"display\"),m([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===de.css(e,\"float\")&&(u||(p.done(function(){d.display=l}),null==l&&(c=d.display,l=\"none\"===c?\"\":c)),d.display=\"inline-block\")),n.overflow&&(d.overflow=\"hidden\",p.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]})),u=!1;for(r in h)u||(v?\"hidden\"in v&&(g=v.hidden):v=Fe.access(e,\"fxshow\",{display:l}),i&&(v.hidden=!g),g&&m([e],!0),p.done(function(){g||m([e]),Fe.remove(e,\"fxshow\");for(r in h)de.style(e,r,h[r])})),u=_(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}}function B(e,t){var n,r,o,i,a;for(n in e)if(r=de.camelCase(n),o=t[r],i=e[n],de.isArray(i)&&(o=i[1],i=e[n]=i[0]),n!==r&&(e[r]=i,delete e[n]),a=de.cssHooks[r],a&&\"expand\"in a){i=a.expand(i),delete e[r];for(n in i)n in e||(e[n]=i[n],t[n]=o)}else t[r]=o}function U(e,t,n){var r,o,i=0,a=U.prefilters.length,s=de.Deferred().always(function(){delete u.elem}),u=function(){if(o)return!1;for(var t=ht||M(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,i=1-r,a=0,u=l.tweens.length;a<u;a++)l.tweens[a].run(i);return s.notifyWith(e,[l,i,n]),i<1&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:de.extend({},t),opts:de.extend(!0,{specialEasing:{},easing:de.easing._default},n),originalProperties:t,originalOptions:n,startTime:ht||M(),duration:n.duration,tweens:[],createTween:function(t,n){var r=de.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(o)return this;for(o=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(B(c,l.opts.specialEasing);i<a;i++)if(r=U.prefilters[i].call(l,e,c,l.opts))return de.isFunction(r.stop)&&(de._queueHooks(l.elem,l.opts.queue).stop=de.proxy(r.stop,r)),r;return de.map(c,_,l),de.isFunction(l.opts.start)&&l.opts.start.call(e,l),de.fx.timer(de.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function z(e){var t=e.match(qe)||[];return t.join(\" \")}function X(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function K(e,t,n,r){var o;if(de.isArray(t))de.each(t,function(t,o){n||Et.test(e)?r(e,o):K(e+\"[\"+(\"object\"==typeof o&&null!=o?t:\"\")+\"]\",o,n,r)});else if(n||\"object\"!==de.type(t))r(e,t);else for(o in t)K(e+\"[\"+o+\"]\",t[o],n,r)}function V(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,o=0,i=t.toLowerCase().match(qe)||[];if(de.isFunction(n))for(;r=i[o++];)\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function G(e,t,n,r){function o(s){var u;return i[s]=!0,de.each(e[s]||[],function(e,s){var l=s(t,n,r);return\"string\"!=typeof l||a||i[l]?a?!(u=l):void 0:(t.dataTypes.unshift(l),o(l),!1)}),u}var i={},a=e===Rt;return o(t.dataTypes[0])||!i[\"*\"]&&o(\"*\")}function Y(e,t){var n,r,o=de.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((o[n]?e:r||(r={}))[n]=t[n]);return r&&de.extend(!0,e,r),e}function Q(e,t,n){for(var r,o,i,a,s=e.contents,u=e.dataTypes;\"*\"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(o in s)if(s[o]&&s[o].test(r)){u.unshift(o);break}if(u[0]in n)i=u[0];else{for(o in n){if(!u[0]||e.converters[o+\" \"+u[0]]){i=o;break}a||(a=o)}i=i||a}if(i)return i!==u[0]&&u.unshift(i),n[i]}function J(e,t,n,r){var o,i,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(i=c.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=i,i=c.shift())if(\"*\"===i)i=u;else if(\"*\"!==u&&u!==i){if(a=l[u+\" \"+i]||l[\"* \"+i],!a)for(o in l)if(s=o.split(\" \"),s[1]===i&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){a===!0?a=l[o]:l[o]!==!0&&(i=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+i}}}return{state:\"success\",data:t}}function Z(e){return de.isWindow(e)?e:9===e.nodeType&&e.defaultView}var ee=[],te=e.document,ne=Object.getPrototypeOf,re=ee.slice,oe=ee.concat,ie=ee.push,ae=ee.indexOf,se={},ue=se.toString,le=se.hasOwnProperty,ce=le.toString,fe=ce.call(Object),pe={},he=\"3.1.1\",de=function(e,t){return new de.fn.init(e,t)},ge=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,me=/^-ms-/,ve=/-([a-z])/g,ye=function(e,t){return t.toUpperCase()};de.fn=de.prototype={jquery:he,constructor:de,length:0,toArray:function(){return re.call(this)},get:function(e){return null==e?re.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=de.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return de.each(this,e)},map:function(e){return this.pushStack(de.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(re.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ie,sort:ee.sort,splice:ee.splice},de.extend=de.fn.extend=function(){var e,t,n,r,o,i,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||de.isFunction(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],r=e[t],a!==r&&(l&&r&&(de.isPlainObject(r)||(o=de.isArray(r)))?(o?(o=!1,i=n&&de.isArray(n)?n:[]):i=n&&de.isPlainObject(n)?n:{},a[t]=de.extend(l,i,r)):void 0!==r&&(a[t]=r));return a},de.extend({expando:\"jQuery\"+(he+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return\"function\"===de.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){var t=de.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==ue.call(e))&&(!(t=ne(e))||(n=le.call(t,\"constructor\")&&t.constructor,\"function\"==typeof n&&ce.call(n)===fe))},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?se[ue.call(e)]||\"object\":typeof e},globalEval:function(e){n(e)},camelCase:function(e){return e.replace(me,\"ms-\").replace(ve,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,o=0;if(r(e))for(n=e.length;o<n&&t.call(e[o],o,e[o])!==!1;o++);else for(o in e)if(t.call(e[o],o,e[o])===!1)break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(ge,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(r(Object(e))?de.merge(n,\"string\"==typeof e?[e]:e):ie.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:ae.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,o=e.length;r<n;r++)e[o++]=t[r];return e.length=o,e},grep:function(e,t,n){for(var r,o=[],i=0,a=e.length,s=!n;i<a;i++)r=!t(e[i],i),r!==s&&o.push(e[i]);return o},map:function(e,t,n){var o,i,a=0,s=[];if(r(e))for(o=e.length;a<o;a++)i=t(e[a],a,n),null!=i&&s.push(i);else for(a in e)i=t(e[a],a,n),null!=i&&s.push(i);return oe.apply([],s)},guid:1,proxy:function(e,t){var n,r,o;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),de.isFunction(e))return r=re.call(arguments,2),o=function(){return e.apply(t||this,r.concat(re.call(arguments)))},o.guid=e.guid=e.guid||de.guid++,o},now:Date.now,support:pe}),\"function\"==typeof Symbol&&(de.fn[Symbol.iterator]=ee[Symbol.iterator]),de.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){se[\"[object \"+t+\"]\"]=t.toLowerCase()});var be=function(e){function t(e,t,n,r){var o,i,a,s,u,l,c,p=t&&t.ownerDocument,d=t?t.nodeType:9;if(n=n||[],\"string\"!=typeof e||!e||1!==d&&9!==d&&11!==d)return n;if(!r&&((t?t.ownerDocument||t:_)!==L&&O(t),t=t||L,F)){if(11!==d&&(u=ve.exec(e)))if(o=u[1]){if(9===d){if(!(a=t.getElementById(o)))return n;if(a.id===o)return n.push(a),n}else if(p&&(a=p.getElementById(o))&&M(t,a)&&a.id===o)return n.push(a),n}else{if(u[2])return J.apply(n,t.getElementsByTagName(e)),n;if((o=u[3])&&C.getElementsByClassName&&t.getElementsByClassName)return J.apply(n,t.getElementsByClassName(o)),n}if(C.qsa&&!X[e+\" \"]&&(!P||!P.test(e))){if(1!==d)p=t,c=e;else if(\"object\"!==t.nodeName.toLowerCase()){for((s=t.getAttribute(\"id\"))?s=s.replace(we,Ce):t.setAttribute(\"id\",s=$),l=E(e),i=l.length;i--;)l[i]=\"#\"+s+\" \"+h(l[i]);c=l.join(\",\"),p=ye.test(e)&&f(t.parentNode)||t}if(c)try{return J.apply(n,p.querySelectorAll(c)),n}catch(e){}finally{s===$&&t.removeAttribute(\"id\")}}}return S(e.replace(se,\"$1\"),t,n,r)}function n(){function e(n,r){return t.push(n+\" \")>T.cacheLength&&delete e[t.shift()],e[n+\" \"]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split(\"|\"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function l(e){return function(t){return\"form\"in t?t.parentNode&&t.disabled===!1?\"label\"in t?\"label\"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ke(t)===e:t.disabled===e:\"label\"in t&&t.disabled===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),a=i.length;a--;)n[o=i[a]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,o=t.next,i=o||r,a=n&&\"parentNode\"===i,s=B++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||a)return e(t,n,o);return!1}:function(t,n,u){var l,c,f,p=[W,s];if(u){for(;t=t[r];)if((1===t.nodeType||a)&&e(t,n,u))return!0}else for(;t=t[r];)if(1===t.nodeType||a)if(f=t[$]||(t[$]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),o&&o===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[i])&&l[0]===W&&l[1]===s)return p[2]=l[2];if(c[i]=p,p[2]=e(t,n,u))return!0}return!1}}function g(e){return e.length>1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o<i;o++)t(e,n[o],r);return r}function v(e,t,n,r,o){for(var i,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(i=e[s])&&(n&&!n(i,r,o)||(a.push(i),l&&t.push(s)));return a}function y(e,t,n,o,i,a){return o&&!o[$]&&(o=y(o)),i&&!i[$]&&(i=y(i,a)),r(function(r,a,s,u){var l,c,f,p=[],h=[],d=a.length,g=r||m(t||\"*\",s.nodeType?[s]:s,[]),y=!e||!r&&t?g:v(g,p,e,s,u),b=n?i||(r?e:d||o)?[]:a:y;if(n&&n(y,b,s,u),o)for(l=v(b,h),o(l,[],s,u),c=l.length;c--;)(f=l[c])&&(b[h[c]]=!(y[h[c]]=f));if(r){if(i||e){if(i){for(l=[],c=b.length;c--;)(f=b[c])&&l.push(y[c]=f);i(null,b=[],l,u)}for(c=b.length;c--;)(f=b[c])&&(l=i?ee(r,f):p[c])>-1&&(r[l]=!(a[l]=f))}}else b=v(b===a?b.splice(d,b.length):b),i?i(null,a,b,u):J.apply(a,b)})}function b(e){for(var t,n,r,o=e.length,i=T.relative[e[0].type],a=i||T.relative[\" \"],s=i?1:0,u=d(function(e){return e===t},a,!0),l=d(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,o}];s<o;s++)if(n=T.relative[e[s].type])c=[d(g(c),n)];else{if(n=T.filter[e[s].type].apply(null,e[s].matches),n[$]){for(r=++s;r<o&&!T.relative[e[r].type];r++);return y(s>1&&g(c),s>1&&h(e.slice(0,s-1).concat({value:\" \"===e[s-2].type?\"*\":\"\"})).replace(se,\"$1\"),n,s<r&&b(e.slice(s,r)),r<o&&b(e=e.slice(r)),r<o&&h(e))}c.push(n)}return g(c)}function x(e,n){var o=n.length>0,i=e.length>0,a=function(r,a,s,u,l){var c,f,p,h=0,d=\"0\",g=r&&[],m=[],y=A,b=r||i&&T.find.TAG(\"*\",l),x=W+=null==y?1:Math.random()||.1,w=b.length;for(l&&(A=a===L||a||l);d!==w&&null!=(c=b[d]);d++){if(i&&c){for(f=0,a||c.ownerDocument===L||(O(c),s=!F);p=e[f++];)if(p(c,a||L,s)){u.push(c);break}l&&(W=x)}o&&((c=!p&&c)&&h--,r&&g.push(c))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,a,s);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Y.call(u));m=v(m)}J.apply(u,m),l&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return l&&(W=x,A=y),g};return o?r(a):a}var w,C,T,k,j,E,N,S,A,q,D,O,L,H,F,P,I,R,M,$=\"sizzle\"+1*new Date,_=e.document,W=0,B=0,U=n(),z=n(),X=n(),K=function(e,t){return e===t&&(D=!0),0},V={}.hasOwnProperty,G=[],Y=G.pop,Q=G.push,J=G.push,Z=G.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",ne=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",re=\"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",oe=\"\\\\[\"+ne+\"*(\"+re+\")(?:\"+ne+\"*([*^$|!~]?=)\"+ne+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+re+\"))|)\"+ne+\"*\\\\]\",ie=\":(\"+re+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+oe+\")*)|.*)\\\\)|)\",ae=new RegExp(ne+\"+\",\"g\"),se=new RegExp(\"^\"+ne+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+ne+\"+$\",\"g\"),ue=new RegExp(\"^\"+ne+\"*,\"+ne+\"*\"),le=new RegExp(\"^\"+ne+\"*([>+~]|\"+ne+\")\"+ne+\"*\"),ce=new RegExp(\"=\"+ne+\"*([^\\\\]'\\\"]*?)\"+ne+\"*\\\\]\",\"g\"),fe=new RegExp(ie),pe=new RegExp(\"^\"+re+\"$\"),he={ID:new RegExp(\"^#(\"+re+\")\"),CLASS:new RegExp(\"^\\\\.(\"+re+\")\"),TAG:new RegExp(\"^(\"+re+\"|[*])\"),ATTR:new RegExp(\"^\"+oe),PSEUDO:new RegExp(\"^\"+ie),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ne+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ne+\"*(?:([+-]|)\"+ne+\"*(\\\\d+)|))\"+ne+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+te+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ne+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ne+\"*((?:-\\\\d)?\\\\d*)\"+ne+\"*\\\\)|)(?=[^-]|$)\",\"i\")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\\d$/i,me=/^[^{]+\\{\\s*\\[native \\w/,ve=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ye=/[+~]/,be=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+ne+\"?|(\"+ne+\")|.)\",\"ig\"),xe=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,Ce=function(e,t){return t?\"\\0\"===e?\"�\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},Te=function(){O()},ke=d(function(e){return e.disabled===!0&&(\"form\"in e||\"label\"in e)},{dir:\"parentNode\",next:\"legend\"});try{J.apply(G=Z.call(_.childNodes),_.childNodes),G[_.childNodes.length].nodeType}catch(e){J={apply:G.length?function(e,t){Q.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}C=t.support={},j=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&\"HTML\"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:_;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!j(L),_!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",Te,!1):n.attachEvent&&n.attachEvent(\"onunload\",Te)),C.attributes=o(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),C.getElementsByTagName=o(function(e){return e.appendChild(L.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),C.getElementsByClassName=me.test(L.getElementsByClassName),C.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),C.getById?(T.filter.ID=function(e){var t=e.replace(be,xe);return function(e){return e.getAttribute(\"id\")===t}},T.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(T.filter.ID=function(e){var t=e.replace(be,xe);return function(e){var n=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return n&&n.value===t}},T.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i]}return[]}}),T.find.TAG=C.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):C.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if(\"*\"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},T.find.CLASS=C.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],P=[],(C.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML=\"<a id='\"+$+\"'></a><select id='\"+$+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&P.push(\"[*^$]=\"+ne+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||P.push(\"\\\\[\"+ne+\"*(?:value|\"+te+\")\"),e.querySelectorAll(\"[id~=\"+$+\"-]\").length||P.push(\"~=\"),e.querySelectorAll(\":checked\").length||P.push(\":checked\"),e.querySelectorAll(\"a#\"+$+\"+*\").length||P.push(\".#.+[+~]\")}),o(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=L.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&P.push(\"name\"+ne+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&P.push(\":enabled\",\":disabled\"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&P.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),P.push(\",.*:\")})),(C.matchesSelector=me.test(R=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){C.disconnectedMatch=R.call(e,\"*\"),R.call(e,\"[s!='']:x\"),I.push(\"!=\",ie)}),P=P.length&&new RegExp(P.join(\"|\")),I=I.length&&new RegExp(I.join(\"|\")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},K=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!C.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===_&&M(_,e)?-1:t===L||t.ownerDocument===_&&M(_,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,s=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===_?-1:u[r]===_?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(ce,\"='$1']\"),C.matchesSelector&&F&&!X[n+\" \"]&&(!I||!I.test(n))&&(!P||!P.test(n)))try{var r=R.call(e,n);if(r||C.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=T.attrHandle[t.toLowerCase()],r=n&&V.call(T.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:C.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+\"\").replace(we,Ce)},t.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!C.detectDuplicates,q=!C.sortStable&&e.slice(0),e.sort(K),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},k=t.getText=function(e){var t,n=\"\",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=k(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=k(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,xe),e[3]=(e[3]||e[4]||e[5]||\"\").replace(be,xe),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,xe).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+\" \"];return t||(t=new RegExp(\"(^|\"+ne+\")\"+e+\"(\"+ne+\"|$)\"))&&U(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?\"!=\"===n:!n||(i+=\"\",\"=\"===n?i===r:\"!=\"===n?i!==r:\"^=\"===n?r&&0===i.indexOf(r):\"*=\"===n?r&&i.indexOf(r)>-1:\"$=\"===n?r&&i.slice(-r.length)===r:\"~=\"===n?(\" \"+i.replace(ae,\" \")+\" \").indexOf(r)>-1:\"|=\"===n&&(i===r||i.slice(0,r.length+1)===r+\"-\"))}},CHILD:function(e,t,n,r,o){var i=\"nth\"!==e.slice(0,3),a=\"last\"!==e.slice(-4),s=\"of-type\"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,h,d,g=i!==a?\"nextSibling\":\"previousSibling\",m=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!u&&!s,b=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g=\"only\"===e&&!d&&\"nextSibling\"}return!0}if(d=[a?m.firstChild:m.lastChild],a&&y){for(p=m,f=p[$]||(p[$]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),l=c[e]||[],h=l[0]===W&&l[1],b=h&&l[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(b=h=0)||d.pop();)if(1===p.nodeType&&++b&&p===t){c[e]=[W,h,b];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),l=c[e]||[],h=l[0]===W&&l[1],b=h),b===!1)for(;(p=++h&&p&&p[g]||(b=h=0)||d.pop())&&((s?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++b||(y&&(f=p[$]||(p[$]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),c[e]=[W,b]),p!==t)););return b-=o,b===r||b%r===0&&b/r>=0}}},PSEUDO:function(e,n){var o,i=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error(\"unsupported pseudo: \"+e);return i[$]?i(n):i.length>1?(o=[e,e,\"\",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),a=o.length;a--;)r=ee(e,o[a]),e[r]=!(t[r]=o[a])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=N(e.replace(se,\"$1\"));return o[$]?r(function(e,t,n,r){for(var i,a=o(e,null,r,[]),s=e.length;s--;)(i=a[s])&&(e[s]=!(t[s]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){\nreturn t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,xe),function(t){return(t.textContent||t.innerText||k(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||\"\")||t.error(\"unsupported lang: \"+e),e=e.replace(be,xe).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:l(!1),disabled:l(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[n<0?n+t:n]}),even:c(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:c(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:c(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[w]=s(w);for(w in{submit:!0,reset:!0})T.pseudos[w]=u(w);return p.prototype=T.filters=T.pseudos,T.setFilters=new p,E=t.tokenize=function(e,n){var r,o,i,a,s,u,l,c=z[e+\" \"];if(c)return n?0:c.slice(0);for(s=e,u=[],l=T.preFilter;s;){r&&!(o=ue.exec(s))||(o&&(s=s.slice(o[0].length)||s),u.push(i=[])),r=!1,(o=le.exec(s))&&(r=o.shift(),i.push({value:r,type:o[0].replace(se,\" \")}),s=s.slice(r.length));for(a in T.filter)!(o=he[a].exec(s))||l[a]&&!(o=l[a](o))||(r=o.shift(),i.push({value:r,type:a,matches:o}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):z(e,u).slice(0)},N=t.compile=function(e,t){var n,r=[],o=[],i=X[e+\" \"];if(!i){for(t||(t=E(e)),n=t.length;n--;)i=b(t[n]),i[$]?r.push(i):o.push(i);i=X(e,x(o,r)),i.selector=e}return i},S=t.select=function(e,t,n,r){var o,i,a,s,u,l=\"function\"==typeof e&&e,c=!r&&E(e=l.selector||e);if(n=n||[],1===c.length){if(i=c[0]=c[0].slice(0),i.length>2&&\"ID\"===(a=i[0]).type&&9===t.nodeType&&F&&T.relative[i[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,xe),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(a=i[o],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,xe),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return J.apply(n,r),n;break}}return(l||N(e,c))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},C.sortStable=$.split(\"\").sort(K).join(\"\")===$,C.detectDuplicates=!!D,O(),C.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement(\"fieldset\"))}),o(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||i(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),C.attributes&&o(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||i(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute(\"disabled\")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=be,de.expr=be.selectors,de.expr[\":\"]=de.expr.pseudos,de.uniqueSort=de.unique=be.uniqueSort,de.text=be.getText,de.isXMLDoc=be.isXML,de.contains=be.contains,de.escapeSelector=be.escape;var xe=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Ce=de.expr.match.needsContext,Te=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i,ke=/^.[^:#\\[\\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if(\"string\"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t<r;t++)if(de.contains(o[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)de.find(e,o[t],n);return r>1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,\"string\"==typeof e&&Ce.test(e)?de(e):e||[],!1).length}});var je,Ee=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,Ne=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||je,\"string\"==typeof e){if(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Te.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Ne.prototype=de.fn,je=de(te);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(de.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,o=this.length,i=[],a=\"string\"!=typeof e&&de(e);if(!Ce.test(e))for(;r<o;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?\"string\"==typeof e?ae.call(de(e),this[0]):ae.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,\"parentNode\")},parentsUntil:function(e,t,n){return xe(e,\"parentNode\",n)},next:function(e){return i(e,\"nextSibling\")},prev:function(e){return i(e,\"previousSibling\")},nextAll:function(e){return xe(e,\"nextSibling\")},prevAll:function(e){return xe(e,\"previousSibling\")},nextUntil:function(e,t,n){return xe(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return xe(e,\"previousSibling\",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Se.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\\x20\\t\\r\\n\\f]+/g;de.Callbacks=function(e){e=\"string\"==typeof e?a(e):de.extend({},e);var t,n,r,o,i=[],s=[],u=-1,l=function(){for(o=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u<i.length;)i[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=i.length,n=!1);e.memory||(n=!1),t=!1,o&&(i=n?[]:\"\")},c={add:function(){return i&&(n&&!t&&(u=i.length-1,s.push(n)),function t(n){de.each(n,function(n,r){de.isFunction(r)?e.unique&&c.has(r)||i.push(r):r&&r.length&&\"string\"!==de.type(r)&&t(r)})}(arguments),n&&!t&&l()),this},remove:function(){return de.each(arguments,function(e,t){for(var n;(n=de.inArray(t,i,n))>-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=s=[],i=n=\"\",this},disabled:function(){return!i},lock:function(){return o=s=[],n||t||(i=n=\"\"),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},de.extend({Deferred:function(t){var n=[[\"notify\",\"progress\",de.Callbacks(\"memory\"),de.Callbacks(\"memory\"),2],[\"resolve\",\"done\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),1,\"rejected\"]],r=\"pending\",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+\"With\"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var l=this,c=arguments,f=function(){var e,f;if(!(t<a)){if(e=r.apply(l,c),e===n.promise())throw new TypeError(\"Thenable self-resolution\");f=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,de.isFunction(f)?o?f.call(e,i(a,n,s,o),i(a,n,u,o)):(a++,f.call(e,i(a,n,s,o),i(a,n,u,o),i(a,n,s,n.notifyWith))):(r!==s&&(l=void 0,c=[e]),(o||n.resolveWith)(l,c))}},p=o?f:function(){try{f()}catch(e){de.Deferred.exceptionHook&&de.Deferred.exceptionHook(e,p.stackTrace),t+1>=a&&(r!==u&&(l=void 0,c=[e]),n.rejectWith(l,c))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var a=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:s,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:s)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var a=t[2],s=t[5];o[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[0][2].lock),a.add(t[3].fire),i[t[0]]=function(){return i[t[0]+\"With\"](this===i?void 0:this,arguments),this},i[t[0]+\"With\"]=a.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),a=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(l(e,i.done(a(n)).resolve,i.reject),\"pending\"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)l(o[n],a(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn(\"jQuery.Deferred exception: \"+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,\"complete\"===te.readyState||\"loading\"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener(\"DOMContentLoaded\",c),e.addEventListener(\"load\",c));var Le=function(e,t,n,r,o,i,a){var s=0,u=e.length,l=null==n;if(\"object\"===de.type(n)){o=!0;for(s in n)Le(e,t,s,n[s],!0,i,a)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(de(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return o?e:l?t.call(e):u?t(e[0],n):i},He=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};f.uid=1,f.prototype={cache:function(e){var t=e[this.expando];return t||(t={},He(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,o=this.cache(e);if(\"string\"==typeof t)o[de.camelCase(t)]=n;else for(r in t)o[de.camelCase(r)]=t[r];return o},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][de.camelCase(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){de.isArray(t)?t=t.map(de.camelCase):(t=de.camelCase(t),t=t in r?[t]:t.match(qe)||[]),n=t.length;for(;n--;)delete r[t[n]]}(void 0===t||de.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!de.isEmptyObject(t)}};var Fe=new f,Pe=new f,Ie=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,Re=/[A-Z]/g;de.extend({hasData:function(e){return Pe.hasData(e)||Fe.hasData(e)},data:function(e,t,n){return Pe.access(e,t,n)},removeData:function(e,t){Pe.remove(e,t)},_data:function(e,t,n){return Fe.access(e,t,n)},_removeData:function(e,t){Fe.remove(e,t)}}),de.fn.extend({data:function(e,t){var n,r,o,i=this[0],a=i&&i.attributes;if(void 0===e){if(this.length&&(o=Pe.get(i),1===i.nodeType&&!Fe.get(i,\"hasDataAttrs\"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf(\"data-\")&&(r=de.camelCase(r.slice(5)),h(i,r,o[r])));Fe.set(i,\"hasDataAttrs\",!0)}return o}return\"object\"==typeof e?this.each(function(){Pe.set(this,e)}):Le(this,function(t){var n;if(i&&void 0===t){if(n=Pe.get(i,e),void 0!==n)return n;if(n=h(i,e),void 0!==n)return n}else this.each(function(){Pe.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Pe.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),a=function(){de.dequeue(e,t)};\"inprogress\"===o&&(o=n.shift(),r--),o&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete i.stop,o.call(e,a,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks(\"once memory\").add(function(){Fe.remove(e,[t+\"queue\",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),arguments.length<n?de.queue(this[0],e):void 0===t?this:this.each(function(){var n=de.queue(this,e,t);de._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&de.dequeue(this,e)})},dequeue:function(e){return this.each(function(){de.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,o=de.Deferred(),i=this,a=this.length,s=function(){--r||o.resolveWith(i,[i])};for(\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";a--;)n=Fe.get(i[a],e+\"queueHooks\"),n&&n.empty&&(r++,n.empty.add(s));return s(),o.promise(t)}});var Me=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,$e=new RegExp(\"^(?:([+-])=|)(\"+Me+\")([a-z%]*)$\",\"i\"),_e=[\"Top\",\"Right\",\"Bottom\",\"Left\"],We=function(e,t){return e=t||e,\"none\"===e.style.display||\"\"===e.style.display&&de.contains(e.ownerDocument,e)&&\"none\"===de.css(e,\"display\")},Be=function(e,t,n,r){var o,i,a={};for(i in t)a[i]=e.style[i],e.style[i]=t[i];o=n.apply(e,r||[]);for(i in t)e.style[i]=a[i];return o},Ue={};de.fn.extend({show:function(){return m(this,!0)},hide:function(){return m(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){We(this)?de(this).show():de(this).hide()})}});var ze=/^(?:checkbox|radio)$/i,Xe=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i,Ke=/^$|\\/(?:java|ecma)script/i,Ve={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};Ve.optgroup=Ve.option,Ve.tbody=Ve.tfoot=Ve.colgroup=Ve.caption=Ve.thead,Ve.th=Ve.td;var Ge=/<|&#?\\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement(\"div\")),n=te.createElement(\"input\");n.setAttribute(\"type\",\"radio\"),n.setAttribute(\"checked\",\"checked\"),n.setAttribute(\"name\",\"t\"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML=\"<textarea>x</textarea>\",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Ye=te.documentElement,Qe=/^key/,Je=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,a,s,u,l,c,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Ye,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(a=m.handle)||(a=m.handle=function(t){return\"undefined\"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||\"\").match(qe)||[\"\"],l=t.length;l--;)s=Ze.exec(t[l])||[],h=g=s[1],d=(s[2]||\"\").split(\".\").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},c=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(\".\")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,a)!==!1||e.addEventListener&&e.addEventListener(h,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,c):p.push(c),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,a,s,u,l,c,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||\"\").match(qe)||[\"\"],l=t.length;l--;)if(s=Ze.exec(t[l])||[],h=g=s[1],d=(s[2]||\"\").split(\".\").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=i=p.length;i--;)c=p[i],!o&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(i,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[l],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,o,i,a,s=de.event.fix(e),u=new Array(arguments.length),l=(Fe.get(this,\"events\")||{})[s.type]||[],c=de.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,s)!==!1){for(a=de.event.handlers.call(this,s,l),t=0;(o=a[t++])&&!s.isPropagationStopped();)for(s.currentTarget=o.elem,n=0;(i=o.handlers[n++])&&!s.isImmediatePropagationStopped();)s.rnamespace&&!s.rnamespace.test(i.namespace)||(s.handleObj=i,s.data=i.data,r=((de.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),void 0!==r&&(s.result=r)===!1&&(s.preventDefault(),s.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,o,i,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||l.disabled!==!0)){for(i=[],a={},n=0;n<u;n++)r=t[n],o=r.selector+\" \",void 0===a[o]&&(a[o]=r.needsContext?de(o,this).index(l)>-1:de.find(o,this,null,[l]).length),a[o]&&i.push(r);i.length&&s.push({elem:l,handlers:i})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(de.Event.prototype,e,{enumerable:!0,configurable:!0,get:de.isFunction(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[de.expando]?e:new de.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==C()&&this.focus)return this.focus(),!1},delegateType:\"focusin\"},blur:{trigger:function(){if(this===C()&&this.blur)return this.blur(),!1},delegateType:\"focusout\"},click:{trigger:function(){if(\"checkbox\"===this.type&&this.click&&de.nodeName(this,\"input\"))return this.click(),!1},_default:function(e){return de.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},de.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},de.Event=function(e,t){return this instanceof de.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?x:w,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&de.extend(this,t),this.timeStamp=e&&e.timeStamp||de.now(),void(this[de.expando]=!0)):new de.Event(e,t)},de.Event.prototype={constructor:de.Event,isDefaultPrevented:w,isPropagationStopped:w,isImmediatePropagationStopped:w,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=x,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=x,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=x,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},de.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Qe.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Je.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},de.event.addProp),de.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,t){de.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,o=e.relatedTarget,i=e.handleObj;return o&&(o===r||de.contains(r,o))||(e.type=i.origType,n=i.handler.apply(this,arguments),e.type=t),n}}}),de.fn.extend({on:function(e,t,n,r){return T(this,e,t,n,r)},one:function(e,t,n,r){return T(this,e,t,n,r,1)},off:function(e,t,n){var r,o;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,de(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(o in e)this.off(o,t,e[o]);return this}return t!==!1&&\"function\"!=typeof t||(n=t,t=void 0),n===!1&&(n=w),this.each(function(){de.event.remove(this,e,n,t)})}});var et=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,tt=/<script|<style|<link/i,nt=/checked\\s*(?:[^=]|=\\s*.checked.)/i,rt=/^true\\/(.*)/,ot=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,\"<$1></$2>\")},clone:function(e,t,n){var r,o,i,a,s=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(a=v(s),i=v(e),r=0,o=i.length;r<o;r++)S(i[r],a[r]);if(t)if(n)for(i=i||v(e),a=a||v(s),r=0,o=i.length;r<o;r++)N(i[r],a[r]);else N(e,s);return a=v(s,\"script\"),a.length>0&&y(a,!u&&v(e,\"script\")),s},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Pe.expando]&&(n[Pe.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=k(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=k(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!tt.test(e)&&!Ve[(Xe.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(de.cleanData(v(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return A(this,arguments,function(t){var n=this.parentNode;de.inArray(this,e)<0&&(de.cleanData(v(this)),n&&n.replaceChild(t,this))},e)}}),de.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){de.fn[e]=function(e){for(var n,r=[],o=de(e),i=o.length-1,a=0;a<=i;a++)n=a===i?this:this.clone(!0),de(o[a])[t](n),ie.apply(r,n.get());return this.pushStack(r)}});var it=/^margin/,at=new RegExp(\"^(\"+Me+\")(?!px)[a-z%]+$\",\"i\"),st=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)};!function(){function t(){if(s){s.style.cssText=\"box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%\",s.innerHTML=\"\",Ye.appendChild(a);var t=e.getComputedStyle(s);n=\"1%\"!==t.top,i=\"2px\"===t.marginLeft,r=\"4px\"===t.width,s.style.marginRight=\"50%\",o=\"4px\"===t.marginRight,Ye.removeChild(a),s=null}}var n,r,o,i,a=te.createElement(\"div\"),s=te.createElement(\"div\");s.style&&(s.style.backgroundClip=\"content-box\",s.cloneNode(!0).style.backgroundClip=\"\",pe.clearCloneStyle=\"content-box\"===s.style.backgroundClip,a.style.cssText=\"border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute\",a.appendChild(s),de.extend(pe,{pixelPosition:function(){return t(),n},boxSizingReliable:function(){return t(),r},pixelMarginRight:function(){return t(),o},reliableMarginLeft:function(){return t(),i}}))}();var ut=/^(none|table(?!-c[ea]).+)/,lt={position:\"absolute\",visibility:\"hidden\",display:\"block\"},ct={letterSpacing:\"0\",fontWeight:\"400\"},ft=[\"Webkit\",\"Moz\",\"ms\"],pt=te.createElement(\"div\").style;de.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=D(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:\"cssFloat\"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,i,a,s=de.camelCase(t),u=e.style;return t=de.cssProps[s]||(de.cssProps[s]=L(s)||s),a=de.cssHooks[t]||de.cssHooks[s],void 0===n?a&&\"get\"in a&&void 0!==(o=a.get(e,!1,r))?o:u[t]:(i=typeof n,\"string\"===i&&(o=$e.exec(n))&&o[1]&&(n=d(e,t,o),i=\"number\"),null!=n&&n===n&&(\"number\"===i&&(n+=o&&o[3]||(de.cssNumber[s]?\"\":\"px\")),pe.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(u[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u[t]=n)),void 0)}},css:function(e,t,n,r){var o,i,a,s=de.camelCase(t);return t=de.cssProps[s]||(de.cssProps[s]=L(s)||s),a=de.cssHooks[t]||de.cssHooks[s],a&&\"get\"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=D(e,t,r)),\"normal\"===o&&t in ct&&(o=ct[t]),\"\"===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),de.each([\"height\",\"width\"],function(e,t){de.cssHooks[t]={get:function(e,n,r){if(n)return!ut.test(de.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?P(e,t,r):Be(e,lt,function(){return P(e,t,r)})},set:function(e,n,r){var o,i=r&&st(e),a=r&&F(e,t,r,\"border-box\"===de.css(e,\"boxSizing\",!1,i),i);return a&&(o=$e.exec(n))&&\"px\"!==(o[3]||\"px\")&&(e.style[t]=n,n=de.css(e,t)),H(e,n,a)}}}),de.cssHooks.marginLeft=O(pe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(D(e,\"marginLeft\"))||e.getBoundingClientRect().left-Be(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),de.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){de.cssHooks[e+t]={expand:function(n){for(var r=0,o={},i=\"string\"==typeof n?n.split(\" \"):[n];r<4;r++)o[e+_e[r]+t]=i[r]||i[r-2]||i[0];return o}},it.test(e)||(de.cssHooks[e+t].set=H)}),de.fn.extend({css:function(e,t){return Le(this,function(e,t,n){var r,o,i={},a=0;if(de.isArray(t)){for(r=st(e),o=t.length;a<o;a++)i[t[a]]=de.css(e,t[a],!1,r);return i}return void 0!==n?de.style(e,t,n):de.css(e,t)},e,t,arguments.length>1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?\"\":\"px\")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=[\"*\"]):e=e.match(qe);for(var n,r=0,o=e.length;r<o;r++)n=e[r],U.tweeners[n]=U.tweeners[n]||[],U.tweeners[n].unshift(t)},prefilters:[W],prefilter:function(e,t){t?U.prefilters.unshift(e):U.prefilters.push(e)}}),de.speed=function(e,t,n){var r=e&&\"object\"==typeof e?de.extend({},e):{complete:n||!n&&t||de.isFunction(e)&&e,duration:e,easing:n&&t||t&&!de.isFunction(t)&&t};return de.fx.off||te.hidden?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in de.fx.speeds?r.duration=de.fx.speeds[r.duration]:r.duration=de.fx.speeds._default),null!=r.queue&&r.queue!==!0||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){de.isFunction(r.old)&&r.old.call(this),r.queue&&de.dequeue(this,r.queue)},r},de.fn.extend({fadeTo:function(e,t,n,r){return this.filter(We).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){\nvar o=de.isEmptyObject(e),i=de.speed(t,n,r),a=function(){var t=U(this,de.extend({},e),i);(o||Fe.get(this,\"finish\"))&&t.stop(!0)};return a.finish=a,o||i.queue===!1?this.each(a):this.queue(i.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,o=null!=e&&e+\"queueHooks\",i=de.timers,a=Fe.get(this);if(o)a[o]&&a[o].stop&&r(a[o]);else for(o in a)a[o]&&a[o].stop&&mt.test(o)&&r(a[o]);for(o=i.length;o--;)i[o].elem!==this||null!=e&&i[o].queue!==e||(i[o].anim.stop(n),t=!1,i.splice(o,1));!t&&n||de.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=Fe.get(this),r=n[e+\"queue\"],o=n[e+\"queueHooks\"],i=de.timers,a=r?r.length:0;for(n.finish=!0,de.queue(this,e,[]),o&&o.stop&&o.stop.call(this,!0),t=i.length;t--;)i[t].elem===this&&i[t].queue===e&&(i[t].anim.stop(!0),i.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),de.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=de.fn[t];de.fn[t]=function(e,r,o){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate($(t,!0),e,r,o)}}),de.each({slideDown:$(\"show\"),slideUp:$(\"hide\"),slideToggle:$(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){de.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),de.timers=[],de.fx.tick=function(){var e,t=0,n=de.timers;for(ht=de.now();t<n.length;t++)e=n[t],e()||n[t]!==e||n.splice(t--,1);n.length||de.fx.stop(),ht=void 0},de.fx.timer=function(e){de.timers.push(e),e()?de.fx.start():de.timers.pop()},de.fx.interval=13,de.fx.start=function(){dt||(dt=e.requestAnimationFrame?e.requestAnimationFrame(R):e.setInterval(de.fx.tick,de.fx.interval))},de.fx.stop=function(){e.cancelAnimationFrame?e.cancelAnimationFrame(dt):e.clearInterval(dt),dt=null},de.fx.speeds={slow:600,fast:200,_default:400},de.fn.delay=function(t,n){return t=de.fx?de.fx.speeds[t]||t:t,n=n||\"fx\",this.queue(n,function(n,r){var o=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(o)}})},function(){var e=te.createElement(\"input\"),t=te.createElement(\"select\"),n=t.appendChild(te.createElement(\"option\"));e.type=\"checkbox\",pe.checkOn=\"\"!==e.value,pe.optSelected=n.selected,e=te.createElement(\"input\"),e.value=\"t\",e.type=\"radio\",pe.radioValue=\"t\"===e.value}();var vt,yt=de.expr.attrHandle;de.fn.extend({attr:function(e,t){return Le(this,de.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return\"undefined\"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):o&&\"get\"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&\"radio\"===t&&de.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,a=t.toLowerCase();return r||(i=yt[a],yt[a]=o,o=null!=n(e,t,r)?a:null,yt[a]=i),o}});var bt=/^(?:input|select|textarea|button)$/i,xt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&\"get\"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,\"tabindex\");return t?parseInt(t,10):bt.test(e.nodeName)||xt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:\"htmlFor\",class:\"className\"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,a,s,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(a=0;i=t[a++];)r.indexOf(\" \"+i+\" \")<0&&(r+=i+\" \");s=z(r),o!==s&&n.setAttribute(\"class\",s)}return this},removeClass:function(e){var t,n,r,o,i,a,s,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(a=0;i=t[a++];)for(;r.indexOf(\" \"+i+\" \")>-1;)r=r.replace(\" \"+i+\" \",\" \");s=z(r),o!==s&&n.setAttribute(\"class\",s)}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if(\"string\"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&\"boolean\"!==n||(t=X(this),t&&Fe.set(this,\"__className__\",t),this.setAttribute&&this.setAttribute(\"class\",t||e===!1?\"\":Fe.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;for(t=\" \"+e+\" \";n=this[r++];)if(1===n.nodeType&&(\" \"+z(X(n))+\" \").indexOf(t)>-1)return!0;return!1}});var wt=/\\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o=\"\":\"number\"==typeof o?o+=\"\":de.isArray(o)&&(o=de.map(o,function(e){return null==e?\"\":e+\"\"})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&\"set\"in t&&void 0!==t.set(this,o,\"value\")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&\"get\"in t&&void 0!==(n=t.get(o,\"value\"))?n:(n=o.value,\"string\"==typeof n?n.replace(wt,\"\"):null==n?\"\":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,\"value\");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?i+1:o.length;for(r=i<0?u:a?i:0;r<u;r++)if(n=o[r],(n.selected||r===i)&&!n.disabled&&(!n.parentNode.disabled||!de.nodeName(n.parentNode,\"optgroup\"))){if(t=de(n).val(),a)return t;s.push(t)}return s},set:function(e,t){for(var n,r,o=e.options,i=de.makeArray(t),a=o.length;a--;)r=o[a],(r.selected=de.inArray(de.valHooks.option.get(r),i)>-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each([\"radio\",\"checkbox\"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var Ct=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,a,s,u,l,c,f,p=[r||te],h=le.call(t,\"type\")?t.type:t,d=le.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(a=s=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Ct.test(h+de.event.triggered)&&(h.indexOf(\".\")>-1&&(d=h.split(\".\"),h=d.shift(),d.sort()),l=h.indexOf(\":\")<0&&\"on\"+h,t=t[de.expando]?t:new de.Event(h,\"object\"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join(\".\"),t.rnamespace=t.namespace?new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Ct.test(u+h)||(a=a.parentNode);a;a=a.parentNode)p.push(a),s=a;s===(r.ownerDocument||te)&&p.push(s.defaultView||s.parentWindow||e)}for(i=0;(a=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,c=(Fe.get(a,\"events\")||{})[t.type]&&Fe.get(a,\"handle\"),c&&c.apply(a,n),c=l&&a[l],c&&c.apply&&He(a)&&(t.result=c.apply(a,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||l&&de.isFunction(r[h])&&!de.isWindow(r)&&(s=r[l],s&&(r[l]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,s&&(r[l]=s)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin=\"onfocusin\"in e,pe.focusin||de.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Tt=e.location,kt=de.now(),jt=/\\?/;de.parseXML=function(t){var n;if(!t||\"string\"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,\"text/xml\")}catch(e){n=void 0}return n&&!n.getElementsByTagName(\"parsererror\").length||de.error(\"Invalid XML: \"+t),n};var Et=/\\[\\]$/,Nt=/\\r?\\n/g,St=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)K(n,e[n],t,o);return r.join(\"&\")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,\"elements\");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(\":disabled\")&&At.test(this.nodeName)&&!St.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(Nt,\"\\r\\n\")}}):{name:t.name,value:n.replace(Nt,\"\\r\\n\")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Pt=/^\\/\\//,It={},Rt={},Mt=\"*/\".concat(\"*\"),$t=te.createElement(\"a\");$t.href=Tt.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:\"GET\",isLocal:Ht.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Mt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Y(Y(e,de.ajaxSettings),t):Y(de.ajaxSettings,e)},ajaxPrefilter:V(It),ajaxTransport:V(Rt),ajax:function(t,n){function r(t,n,r,s){var l,p,h,x,w,C=n;c||(c=!0,u&&e.clearTimeout(u),o=void 0,a=s||\"\",T.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(x=Q(d,T,r)),x=J(d,x,T,l),l?(d.ifModified&&(w=T.getResponseHeader(\"Last-Modified\"),w&&(de.lastModified[i]=w),w=T.getResponseHeader(\"etag\"),w&&(de.etag[i]=w)),204===t||\"HEAD\"===d.type?C=\"nocontent\":304===t?C=\"notmodified\":(C=x.state,p=x.data,h=x.error,l=!h)):(h=C,!t&&C||(C=\"error\",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+\"\",l?v.resolveWith(g,[p,C,T]):v.rejectWith(g,[T,C,h]),T.statusCode(b),b=void 0,f&&m.trigger(l?\"ajaxSuccess\":\"ajaxError\",[T,d,l?p:h]),y.fireWith(g,[T,C]),f&&(m.trigger(\"ajaxComplete\",[T,d]),--de.active||de.event.trigger(\"ajaxStop\")))}\"object\"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,a,s,u,l,c,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks(\"once memory\"),b=d.statusCode||{},x={},w={},C=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s)for(s={};t=Lt.exec(a);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,x[e]=t),this},overrideMimeType:function(e){return null==c&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)T.always(e[T.status]);else for(t in e)b[t]=[b[t],e[t]];return this},abort:function(e){var t=e||C;return o&&o.abort(t),r(0,t),this}};if(v.promise(T),d.url=((t||d.url||Tt.href)+\"\").replace(Pt,Tt.protocol+\"//\"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||\"*\").toLowerCase().match(qe)||[\"\"],null==d.crossDomain){l=te.createElement(\"a\");try{l.href=d.url,l.href=l.href,d.crossDomain=$t.protocol+\"//\"+$t.host!=l.protocol+\"//\"+l.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&\"string\"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),G(It,d,n,T),c)return T;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger(\"ajaxStart\"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,\"\"),d.hasContent?d.data&&d.processData&&0===(d.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(d.data=d.data.replace(qt,\"+\")):(h=d.url.slice(i.length),d.data&&(i+=(jt.test(i)?\"&\":\"?\")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,\"$1\"),h=(jt.test(i)?\"&\":\"?\")+\"_=\"+kt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&T.setRequestHeader(\"If-Modified-Since\",de.lastModified[i]),de.etag[i]&&T.setRequestHeader(\"If-None-Match\",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader(\"Content-Type\",d.contentType),T.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(\"*\"!==d.dataTypes[0]?\", \"+Mt+\"; q=0.01\":\"\"):d.accepts[\"*\"]);for(p in d.headers)T.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,T,d)===!1||c))return T.abort();if(C=\"abort\",y.add(d.complete),T.done(d.success),T.fail(d.error),o=G(Rt,d,n,T)){if(T.readyState=1,f&&m.trigger(\"ajaxSend\",[T,d]),c)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort(\"timeout\")},d.timeout));try{c=!1,o.send(x,r)}catch(e){if(c)throw e;r(-1,e)}}else r(-1,\"No Transport\");return T},getJSON:function(e,t,n){return de.get(e,t,n,\"json\")},getScript:function(e,t){return de.get(e,void 0,t,\"script\")}}),de.each([\"get\",\"post\"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},Wt=de.ajaxSettings.xhr();pe.cors=!!Wt&&\"withCredentials\"in Wt,pe.ajax=Wt=!!Wt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Wt&&!t.crossDomain)return{send:function(o,i){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||o[\"X-Requested-With\"]||(o[\"X-Requested-With\"]=\"XMLHttpRequest\");for(a in o)s.setRequestHeader(a,o[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.onreadystatechange=null,\"abort\"===e?s.abort():\"error\"===e?\"number\"!=typeof s.status?i(0,\"error\"):i(s.status,s.statusText):i(_t[s.status]||s.status,s.statusText,\"text\"!==(s.responseType||\"text\")||\"string\"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=n(\"error\"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n(\"abort\");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),de.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(\"<script>\").prop({charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&o(\"error\"===e.type?404:200,e.type)}),te.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Bt=[],Ut=/(=)\\?(?=&|$)|\\?\\?/;de.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Bt.pop()||de.expando+\"_\"+kt++;return this[e]=!0,e}}),de.ajaxPrefilter(\"json jsonp\",function(t,n,r){var o,i,a,s=t.jsonp!==!1&&(Ut.test(t.url)?\"url\":\"string\"==typeof t.data&&0===(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ut.test(t.data)&&\"data\");if(s||\"jsonp\"===t.dataTypes[0])return o=t.jsonpCallback=de.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Ut,\"$1\"+o):t.jsonp!==!1&&(t.url+=(jt.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+o),t.converters[\"script json\"]=function(){return a||de.error(o+\" was not called\"),a[0]},t.dataTypes[0]=\"json\",i=e[o],e[o]=function(){a=arguments},r.always(function(){void 0===i?de(e).removeProp(o):e[o]=i,t[o]&&(t.jsonpCallback=n.jsonpCallback,Bt.push(o)),a&&de.isFunction(i)&&i(a[0]),a=i=void 0}),\"script\"}),pe.createHTMLDocument=function(){var e=te.implementation.createHTMLDocument(\"\").body;return e.innerHTML=\"<form></form><form></form>\",2===e.childNodes.length}(),de.parseHTML=function(e,t,n){if(\"string\"!=typeof e)return[];\"boolean\"==typeof t&&(n=t,t=!1);var r,o,i;return t||(pe.createHTMLDocument?(t=te.implementation.createHTMLDocument(\"\"),r=t.createElement(\"base\"),r.href=te.location.href,t.head.appendChild(r)):t=te),o=Te.exec(e),i=!n&&[],o?[t.createElement(o[1])]:(o=b([e],t,i),i&&i.length&&de(i).remove(),de.merge([],o.childNodes))},de.fn.load=function(e,t,n){var r,o,i,a=this,s=e.indexOf(\" \");return s>-1&&(r=z(e.slice(s)),e=e.slice(0,s)),de.isFunction(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(o=\"POST\"),a.length>0&&de.ajax({url:e,type:o||\"GET\",dataType:\"html\",data:t}).done(function(e){i=arguments,a.html(r?de(\"<div>\").append(de.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},de.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){de.fn[t]=function(e){return this.on(t,e)}}),de.expr.pseudos.animated=function(e){return de.grep(de.timers,function(t){return e===t.elem}).length},de.offset={setOffset:function(e,t,n){var r,o,i,a,s,u,l,c=de.css(e,\"position\"),f=de(e),p={};\"static\"===c&&(e.style.position=\"relative\"),s=f.offset(),i=de.css(e,\"top\"),u=de.css(e,\"left\"),l=(\"absolute\"===c||\"fixed\"===c)&&(i+u).indexOf(\"auto\")>-1,l?(r=f.position(),a=r.top,o=r.left):(a=parseFloat(i)||0,o=parseFloat(u)||0),de.isFunction(t)&&(t=t.call(e,n,de.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+o),\"using\"in t?t.using.call(e,p):f.css(p)}},de.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){de.offset.setOffset(this,e,t)});var t,n,r,o,i=this[0];if(i)return i.getClientRects().length?(r=i.getBoundingClientRect(),r.width||r.height?(o=i.ownerDocument,n=Z(o),t=o.documentElement,{top:r.top+n.pageYOffset-t.clientTop,left:r.left+n.pageXOffset-t.clientLeft}):r):{top:0,left:0}},position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return\"fixed\"===de.css(n,\"position\")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),de.nodeName(e[0],\"html\")||(r=e.offset()),r={top:r.top+de.css(e[0],\"borderTopWidth\",!0),left:r.left+de.css(e[0],\"borderLeftWidth\",!0)}),{top:t.top-r.top-de.css(n,\"marginTop\",!0),left:t.left-r.left-de.css(n,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&\"static\"===de.css(e,\"position\");)e=e.offsetParent;return e||Ye})}}),de.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(e,t){var n=\"pageYOffset\"===t;de.fn[e]=function(r){return Le(this,function(e,r,o){var i=Z(e);return void 0===o?i?i[t]:e[r]:void(i?i.scrollTo(n?i.pageXOffset:o,n?o:i.pageYOffset):e[r]=o)},e,r,arguments.length)}}),de.each([\"top\",\"left\"],function(e,t){de.cssHooks[t]=O(pe.pixelPosition,function(e,n){if(n)return n=D(e,t),at.test(n)?de(e).position()[t]+\"px\":n})}),de.each({Height:\"height\",Width:\"width\"},function(e,t){de.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){de.fn[r]=function(o,i){var a=arguments.length&&(n||\"boolean\"!=typeof o),s=n||(o===!0||i===!0?\"margin\":\"border\");return Le(this,function(t,n,o){var i;return de.isWindow(t)?0===r.indexOf(\"outer\")?t[\"inner\"+e]:t.document.documentElement[\"client\"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body[\"scroll\"+e],i[\"scroll\"+e],t.body[\"offset\"+e],i[\"offset\"+e],i[\"client\"+e])):void 0===o?de.css(t,n,s):de.style(t,n,o,s)},t,a?o:void 0,a)}})}),de.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),de.parseJSON=JSON.parse,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return de});var zt=e.jQuery,Xt=e.$;return de.noConflict=function(t){return e.$===de&&(e.$=Xt),t&&e.jQuery===de&&(e.jQuery=zt),de},t||(e.jQuery=e.$=de),de})},{}],2:[function(e,t,n){!function(e,n,r){function o(e,t,n){return e.addEventListener?void e.addEventListener(t,n,!1):void e.attachEvent(\"on\"+t,n)}function i(e){if(\"keypress\"==e.type){var t=String.fromCharCode(e.which);return e.shiftKey||(t=t.toLowerCase()),t}return y[e.which]?y[e.which]:b[e.which]?b[e.which]:String.fromCharCode(e.which).toLowerCase()}function a(e,t){return e.sort().join(\",\")===t.sort().join(\",\")}function s(e){var t=[];return e.shiftKey&&t.push(\"shift\"),e.altKey&&t.push(\"alt\"),e.ctrlKey&&t.push(\"ctrl\"),e.metaKey&&t.push(\"meta\"),t}function u(e){return e.preventDefault?void e.preventDefault():void(e.returnValue=!1)}function l(e){return e.stopPropagation?void e.stopPropagation():void(e.cancelBubble=!0)}function c(e){return\"shift\"==e||\"ctrl\"==e||\"alt\"==e||\"meta\"==e}function f(){if(!v){v={};for(var e in y)e>95&&e<112||y.hasOwnProperty(e)&&(v[y[e]]=e)}return v}function p(e,t,n){return n||(n=f()[e]?\"keydown\":\"keypress\"),\"keypress\"==n&&t.length&&(n=\"keydown\"),n}function h(e){return\"+\"===e?[\"+\"]:(e=e.replace(/\\+{2}/g,\"+plus\"),e.split(\"+\"))}function d(e,t){var n,r,o,i=[];for(n=h(e),o=0;o<n.length;++o)r=n[o],w[r]&&(r=w[r]),t&&\"keypress\"!=t&&x[r]&&(r=x[r],i.push(\"shift\")),c(r)&&i.push(r);return t=p(r,i,t),{key:r,modifiers:i,action:t}}function g(e,t){return null!==e&&e!==n&&(e===t||g(e.parentNode,t))}function m(e){function t(e){e=e||{};var t,n=!1;for(t in x)e[t]?n=!0:x[t]=0;n||(T=!1)}function r(e,t,n,r,o,i){var s,u,l=[],f=n.type;if(!y._callbacks[e])return[];for(\"keyup\"==f&&c(e)&&(t=[e]),s=0;s<y._callbacks[e].length;++s)if(u=y._callbacks[e][s],(r||!u.seq||x[u.seq]==u.level)&&f==u.action&&(\"keypress\"==f&&!n.metaKey&&!n.ctrlKey||a(t,u.modifiers))){var p=!r&&u.combo==o,h=r&&u.seq==r&&u.level==i;(p||h)&&y._callbacks[e].splice(s,1),l.push(u)}return l}function f(e,t,n,r){y.stopCallback(t,t.target||t.srcElement,n,r)||e(t,n)===!1&&(u(t),l(t))}function p(e){\"number\"!=typeof e.which&&(e.which=e.keyCode);var t=i(e);if(t)return\"keyup\"==e.type&&w===t?void(w=!1):void y.handleKey(t,s(e),e)}function h(){clearTimeout(b),b=setTimeout(t,1e3)}function g(e,n,r,o){function a(t){return function(){T=t,++x[e],h()}}function s(n){f(r,n,e),\"keyup\"!==o&&(w=i(n)),setTimeout(t,10)}x[e]=0;for(var u=0;u<n.length;++u){var l=u+1===n.length,c=l?s:a(o||d(n[u+1]).action);v(n[u],c,o,e,u)}}function v(e,t,n,o,i){y._directMap[e+\":\"+n]=t,e=e.replace(/\\s+/g,\" \");var a,s=e.split(\" \");return s.length>1?void g(e,s,t,n):(a=d(e,n),y._callbacks[a.key]=y._callbacks[a.key]||[],r(a.key,a.modifiers,{type:a.action},o,e,i),void y._callbacks[a.key][o?\"unshift\":\"push\"]({callback:t,modifiers:a.modifiers,action:a.action,seq:o,level:i,combo:e}))}var y=this;if(e=e||n,!(y instanceof m))return new m(e);y.target=e,y._callbacks={},y._directMap={};var b,x={},w=!1,C=!1,T=!1;y._handleKey=function(e,n,o){var i,a=r(e,n,o),s={},u=0,l=!1;for(i=0;i<a.length;++i)a[i].seq&&(u=Math.max(u,a[i].level));for(i=0;i<a.length;++i)if(a[i].seq){if(a[i].level!=u)continue;l=!0,s[a[i].seq]=1,f(a[i].callback,o,a[i].combo,a[i].seq)}else l||f(a[i].callback,o,a[i].combo);var p=\"keypress\"==o.type&&C;o.type!=T||c(e)||p||t(s),C=l&&\"keydown\"==o.type},y._bindMultiple=function(e,t,n){for(var r=0;r<e.length;++r)v(e[r],t,n)},o(e,\"keypress\",p),o(e,\"keydown\",p),o(e,\"keyup\",p)}if(e){for(var v,y={8:\"backspace\",9:\"tab\",13:\"enter\",16:\"shift\",17:\"ctrl\",18:\"alt\",20:\"capslock\",27:\"esc\",32:\"space\",33:\"pageup\",34:\"pagedown\",35:\"end\",36:\"home\",37:\"left\",38:\"up\",39:\"right\",40:\"down\",45:\"ins\",46:\"del\",91:\"meta\",93:\"meta\",224:\"meta\"},b={106:\"*\",107:\"+\",109:\"-\",110:\".\",111:\"/\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\"},x={\"~\":\"`\",\"!\":\"1\",\"@\":\"2\",\"#\":\"3\",$:\"4\",\"%\":\"5\",\"^\":\"6\",\"&\":\"7\",\"*\":\"8\",\"(\":\"9\",\")\":\"0\",_:\"-\",\"+\":\"=\",\":\":\";\",'\"':\"'\",\"<\":\",\",\">\":\".\",\"?\":\"/\",\"|\":\"\\\\\"},w={option:\"alt\",command:\"meta\",return:\"enter\",escape:\"esc\",plus:\"+\",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?\"meta\":\"ctrl\"},C=1;C<20;++C)y[111+C]=\"f\"+C;for(C=0;C<=9;++C)y[C+96]=C;m.prototype.bind=function(e,t,n){var r=this;return e=e instanceof Array?e:[e],r._bindMultiple.call(r,e,t,n),r},m.prototype.unbind=function(e,t){var n=this;return n.bind.call(n,e,function(){},t)},m.prototype.trigger=function(e,t){var n=this;return n._directMap[e+\":\"+t]&&n._directMap[e+\":\"+t]({},e),n},m.prototype.reset=function(){var e=this;return e._callbacks={},e._directMap={},e},m.prototype.stopCallback=function(e,t){var n=this;return!((\" \"+t.className+\" \").indexOf(\" mousetrap \")>-1)&&(!g(t,n.target)&&(\"INPUT\"==t.tagName||\"SELECT\"==t.tagName||\"TEXTAREA\"==t.tagName||t.isContentEditable))},m.prototype.handleKey=function(){var e=this;return e._handleKey.apply(e,arguments)},m.addKeycodes=function(e){for(var t in e)e.hasOwnProperty(t)&&(y[t]=e[t]);v=null},m.init=function(){var e=m(n);for(var t in e)\"_\"!==t.charAt(0)&&(m[t]=function(t){return function(){return e[t].apply(e,arguments)}}(t))},m.init(),e.Mousetrap=m,\"undefined\"!=typeof t&&t.exports&&(t.exports=m),\"function\"==typeof define&&define.amd&&define(function(){return m})}}(\"undefined\"!=typeof window?window:null,\"undefined\"!=typeof window?document:null)},{}],3:[function(e,t,n){(function(e){!function(r){function o(e){throw new RangeError(L[e])}function i(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function a(e,t){var n=e.split(\"@\"),r=\"\";n.length>1&&(r=n[0]+\"@\",e=n[1]),e=e.replace(O,\".\");var o=e.split(\".\"),a=i(o,t).join(\".\");return r+a}function s(e){for(var t,n,r=[],o=0,i=e.length;o<i;)t=e.charCodeAt(o++),t>=55296&&t<=56319&&o<i?(n=e.charCodeAt(o++),56320==(64512&n)?r.push(((1023&t)<<10)+(1023&n)+65536):(r.push(t),o--)):r.push(t);return r}function u(e){return i(e,function(e){var t=\"\";return e>65535&&(e-=65536,t+=P(e>>>10&1023|55296),e=56320|1023&e),t+=P(e)}).join(\"\")}function l(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:C}function c(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function f(e,t,n){var r=0;for(e=n?F(e/E):e>>1,e+=F(e/t);e>H*k>>1;r+=C)e=F(e/H);return F(r+(H+1)*e/(e+j))}function p(e){var t,n,r,i,a,s,c,p,h,d,g=[],m=e.length,v=0,y=S,b=N;for(n=e.lastIndexOf(A),n<0&&(n=0),r=0;r<n;++r)e.charCodeAt(r)>=128&&o(\"not-basic\"),g.push(e.charCodeAt(r));for(i=n>0?n+1:0;i<m;){for(a=v,s=1,c=C;i>=m&&o(\"invalid-input\"),p=l(e.charCodeAt(i++)),(p>=C||p>F((w-v)/s))&&o(\"overflow\"),v+=p*s,h=c<=b?T:c>=b+k?k:c-b,!(p<h);c+=C)d=C-h,s>F(w/d)&&o(\"overflow\"),s*=d;t=g.length+1,b=f(v-a,t,0==a),F(v/t)>w-y&&o(\"overflow\"),y+=F(v/t),v%=t,g.splice(v++,0,y)}return u(g)}function h(e){var t,n,r,i,a,u,l,p,h,d,g,m,v,y,b,x=[];for(e=s(e),m=e.length,t=S,n=0,a=N,u=0;u<m;++u)g=e[u],g<128&&x.push(P(g));for(r=i=x.length,i&&x.push(A);r<m;){for(l=w,u=0;u<m;++u)g=e[u],g>=t&&g<l&&(l=g);for(v=r+1,l-t>F((w-n)/v)&&o(\"overflow\"),n+=(l-t)*v,t=l,u=0;u<m;++u)if(g=e[u],g<t&&++n>w&&o(\"overflow\"),g==t){for(p=n,h=C;d=h<=a?T:h>=a+k?k:h-a,!(p<d);h+=C)b=p-d,y=C-d,x.push(P(c(d+b%y,0))),p=F(b/y);x.push(P(c(p,0))),a=f(n,v,r==i),n=0,++r}++n,++t}return x.join(\"\")}function d(e){return a(e,function(e){return q.test(e)?p(e.slice(4).toLowerCase()):e})}function g(e){return a(e,function(e){return D.test(e)?\"xn--\"+h(e):e})}var m=\"object\"==typeof n&&n&&!n.nodeType&&n,v=\"object\"==typeof t&&t&&!t.nodeType&&t,y=\"object\"==typeof e&&e;y.global!==y&&y.window!==y&&y.self!==y||(r=y);var b,x,w=2147483647,C=36,T=1,k=26,j=38,E=700,N=72,S=128,A=\"-\",q=/^xn--/,D=/[^\\x20-\\x7E]/,O=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,L={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},H=C-T,F=Math.floor,P=String.fromCharCode;if(b={version:\"1.4.1\",ucs2:{decode:s,encode:u},decode:p,encode:h,toASCII:g,toUnicode:d},\"function\"==typeof define&&\"object\"==typeof define.amd&&define.amd)define(\"punycode\",function(){return b});else if(m&&v)if(t.exports==m)v.exports=b;else for(x in b)b.hasOwnProperty(x)&&(m[x]=b[x]);else r.punycode=b}(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],4:[function(e,t,n){\"use strict\";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.exports=function(e,t,n,i){t=t||\"&\",n=n||\"=\";var a={};if(\"string\"!=typeof e||0===e.length)return a;var s=/\\+/g;e=e.split(t);var u=1e3;i&&\"number\"==typeof i.maxKeys&&(u=i.maxKeys);var l=e.length;u>0&&l>u&&(l=u);for(var c=0;c<l;++c){var f,p,h,d,g=e[c].replace(s,\"%20\"),m=g.indexOf(n);m>=0?(f=g.substr(0,m),p=g.substr(m+1)):(f=g,p=\"\"),h=decodeURIComponent(f),d=decodeURIComponent(p),\nr(a,h)?o(a[h])?a[h].push(d):a[h]=[a[h],d]:a[h]=d}return a};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)}},{}],5:[function(e,t,n){\"use strict\";function r(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r<e.length;r++)n.push(t(e[r],r));return n}var o=function(e){switch(typeof e){case\"string\":return e;case\"boolean\":return e?\"true\":\"false\";case\"number\":return isFinite(e)?e:\"\";default:return\"\"}};t.exports=function(e,t,n,s){return t=t||\"&\",n=n||\"=\",null===e&&(e=void 0),\"object\"==typeof e?r(a(e),function(a){var s=encodeURIComponent(o(a))+n;return i(e[a])?r(e[a],function(e){return s+encodeURIComponent(o(e))}).join(t):s+encodeURIComponent(o(e[a]))}).join(t):s?encodeURIComponent(o(s))+n+encodeURIComponent(o(e)):\"\"};var i=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},a=Object.keys||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}},{}],6:[function(e,t,n){\"use strict\";n.decode=n.parse=e(\"./decode\"),n.encode=n.stringify=e(\"./encode\")},{\"./decode\":4,\"./encode\":5}],7:[function(e,t,n){\"use strict\";function r(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function o(e,t,n){if(e&&l.isObject(e)&&e instanceof r)return e;var o=new r;return o.parse(e,t,n),o}function i(e){return l.isString(e)&&(e=o(e)),e instanceof r?e.format():r.prototype.format.call(e)}function a(e,t){return o(e,!1,!0).resolve(t)}function s(e,t){return e?o(e,!1,!0).resolveObject(t):t}var u=e(\"punycode\"),l=e(\"./util\");n.parse=o,n.resolve=a,n.resolveObject=s,n.format=i,n.Url=r;var c=/^([a-z0-9.+-]+:)/i,f=/:[0-9]*$/,p=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,h=[\"<\",\">\",'\"',\"`\",\" \",\"\\r\",\"\\n\",\"\\t\"],d=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat(h),g=[\"'\"].concat(d),m=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(g),v=[\"/\",\"?\",\"#\"],y=255,b=/^[+a-z0-9A-Z_-]{0,63}$/,x=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,w={javascript:!0,\"javascript:\":!0},C={javascript:!0,\"javascript:\":!0},T={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0},k=e(\"querystring\");r.prototype.parse=function(e,t,n){if(!l.isString(e))throw new TypeError(\"Parameter 'url' must be a string, not \"+typeof e);var r=e.indexOf(\"?\"),o=r!==-1&&r<e.indexOf(\"#\")?\"?\":\"#\",i=e.split(o),a=/\\\\/g;i[0]=i[0].replace(a,\"/\"),e=i.join(o);var s=e;if(s=s.trim(),!n&&1===e.split(\"#\").length){var f=p.exec(s);if(f)return this.path=s,this.href=s,this.pathname=f[1],f[2]?(this.search=f[2],t?this.query=k.parse(this.search.substr(1)):this.query=this.search.substr(1)):t&&(this.search=\"\",this.query={}),this}var h=c.exec(s);if(h){h=h[0];var d=h.toLowerCase();this.protocol=d,s=s.substr(h.length)}if(n||h||s.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)){var j=\"//\"===s.substr(0,2);!j||h&&C[h]||(s=s.substr(2),this.slashes=!0)}if(!C[h]&&(j||h&&!T[h])){for(var E=-1,N=0;N<v.length;N++){var S=s.indexOf(v[N]);S!==-1&&(E===-1||S<E)&&(E=S)}var A,q;q=E===-1?s.lastIndexOf(\"@\"):s.lastIndexOf(\"@\",E),q!==-1&&(A=s.slice(0,q),s=s.slice(q+1),this.auth=decodeURIComponent(A)),E=-1;for(var N=0;N<m.length;N++){var S=s.indexOf(m[N]);S!==-1&&(E===-1||S<E)&&(E=S)}E===-1&&(E=s.length),this.host=s.slice(0,E),s=s.slice(E),this.parseHost(),this.hostname=this.hostname||\"\";var D=\"[\"===this.hostname[0]&&\"]\"===this.hostname[this.hostname.length-1];if(!D)for(var O=this.hostname.split(/\\./),N=0,L=O.length;N<L;N++){var H=O[N];if(H&&!H.match(b)){for(var F=\"\",P=0,I=H.length;P<I;P++)F+=H.charCodeAt(P)>127?\"x\":H[P];if(!F.match(b)){var R=O.slice(0,N),M=O.slice(N+1),$=H.match(x);$&&(R.push($[1]),M.unshift($[2])),M.length&&(s=\"/\"+M.join(\".\")+s),this.hostname=R.join(\".\");break}}}this.hostname.length>y?this.hostname=\"\":this.hostname=this.hostname.toLowerCase(),D||(this.hostname=u.toASCII(this.hostname));var _=this.port?\":\"+this.port:\"\",W=this.hostname||\"\";this.host=W+_,this.href+=this.host,D&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),\"/\"!==s[0]&&(s=\"/\"+s))}if(!w[d])for(var N=0,L=g.length;N<L;N++){var B=g[N];if(s.indexOf(B)!==-1){var U=encodeURIComponent(B);U===B&&(U=escape(B)),s=s.split(B).join(U)}}var z=s.indexOf(\"#\");z!==-1&&(this.hash=s.substr(z),s=s.slice(0,z));var X=s.indexOf(\"?\");if(X!==-1?(this.search=s.substr(X),this.query=s.substr(X+1),t&&(this.query=k.parse(this.query)),s=s.slice(0,X)):t&&(this.search=\"\",this.query={}),s&&(this.pathname=s),T[d]&&this.hostname&&!this.pathname&&(this.pathname=\"/\"),this.pathname||this.search){var _=this.pathname||\"\",K=this.search||\"\";this.path=_+K}return this.href=this.format(),this},r.prototype.format=function(){var e=this.auth||\"\";e&&(e=encodeURIComponent(e),e=e.replace(/%3A/i,\":\"),e+=\"@\");var t=this.protocol||\"\",n=this.pathname||\"\",r=this.hash||\"\",o=!1,i=\"\";this.host?o=e+this.host:this.hostname&&(o=e+(this.hostname.indexOf(\":\")===-1?this.hostname:\"[\"+this.hostname+\"]\"),this.port&&(o+=\":\"+this.port)),this.query&&l.isObject(this.query)&&Object.keys(this.query).length&&(i=k.stringify(this.query));var a=this.search||i&&\"?\"+i||\"\";return t&&\":\"!==t.substr(-1)&&(t+=\":\"),this.slashes||(!t||T[t])&&o!==!1?(o=\"//\"+(o||\"\"),n&&\"/\"!==n.charAt(0)&&(n=\"/\"+n)):o||(o=\"\"),r&&\"#\"!==r.charAt(0)&&(r=\"#\"+r),a&&\"?\"!==a.charAt(0)&&(a=\"?\"+a),n=n.replace(/[?#]/g,function(e){return encodeURIComponent(e)}),a=a.replace(\"#\",\"%23\"),t+o+n+a+r},r.prototype.resolve=function(e){return this.resolveObject(o(e,!1,!0)).format()},r.prototype.resolveObject=function(e){if(l.isString(e)){var t=new r;t.parse(e,!1,!0),e=t}for(var n=new r,o=Object.keys(this),i=0;i<o.length;i++){var a=o[i];n[a]=this[a]}if(n.hash=e.hash,\"\"===e.href)return n.href=n.format(),n;if(e.slashes&&!e.protocol){for(var s=Object.keys(e),u=0;u<s.length;u++){var c=s[u];\"protocol\"!==c&&(n[c]=e[c])}return T[n.protocol]&&n.hostname&&!n.pathname&&(n.path=n.pathname=\"/\"),n.href=n.format(),n}if(e.protocol&&e.protocol!==n.protocol){if(!T[e.protocol]){for(var f=Object.keys(e),p=0;p<f.length;p++){var h=f[p];n[h]=e[h]}return n.href=n.format(),n}if(n.protocol=e.protocol,e.host||C[e.protocol])n.pathname=e.pathname;else{for(var d=(e.pathname||\"\").split(\"/\");d.length&&!(e.host=d.shift()););e.host||(e.host=\"\"),e.hostname||(e.hostname=\"\"),\"\"!==d[0]&&d.unshift(\"\"),d.length<2&&d.unshift(\"\"),n.pathname=d.join(\"/\")}if(n.search=e.search,n.query=e.query,n.host=e.host||\"\",n.auth=e.auth,n.hostname=e.hostname||e.host,n.port=e.port,n.pathname||n.search){var g=n.pathname||\"\",m=n.search||\"\";n.path=g+m}return n.slashes=n.slashes||e.slashes,n.href=n.format(),n}var v=n.pathname&&\"/\"===n.pathname.charAt(0),y=e.host||e.pathname&&\"/\"===e.pathname.charAt(0),b=y||v||n.host&&e.pathname,x=b,w=n.pathname&&n.pathname.split(\"/\")||[],d=e.pathname&&e.pathname.split(\"/\")||[],k=n.protocol&&!T[n.protocol];if(k&&(n.hostname=\"\",n.port=null,n.host&&(\"\"===w[0]?w[0]=n.host:w.unshift(n.host)),n.host=\"\",e.protocol&&(e.hostname=null,e.port=null,e.host&&(\"\"===d[0]?d[0]=e.host:d.unshift(e.host)),e.host=null),b=b&&(\"\"===d[0]||\"\"===w[0])),y)n.host=e.host||\"\"===e.host?e.host:n.host,n.hostname=e.hostname||\"\"===e.hostname?e.hostname:n.hostname,n.search=e.search,n.query=e.query,w=d;else if(d.length)w||(w=[]),w.pop(),w=w.concat(d),n.search=e.search,n.query=e.query;else if(!l.isNullOrUndefined(e.search)){if(k){n.hostname=n.host=w.shift();var j=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");j&&(n.auth=j.shift(),n.host=n.hostname=j.shift())}return n.search=e.search,n.query=e.query,l.isNull(n.pathname)&&l.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.href=n.format(),n}if(!w.length)return n.pathname=null,n.search?n.path=\"/\"+n.search:n.path=null,n.href=n.format(),n;for(var E=w.slice(-1)[0],N=(n.host||e.host||w.length>1)&&(\".\"===E||\"..\"===E)||\"\"===E,S=0,A=w.length;A>=0;A--)E=w[A],\".\"===E?w.splice(A,1):\"..\"===E?(w.splice(A,1),S++):S&&(w.splice(A,1),S--);if(!b&&!x)for(;S--;S)w.unshift(\"..\");!b||\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0)||w.unshift(\"\"),N&&\"/\"!==w.join(\"/\").substr(-1)&&w.push(\"\");var q=\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0);if(k){n.hostname=n.host=q?\"\":w.length?w.shift():\"\";var j=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");j&&(n.auth=j.shift(),n.host=n.hostname=j.shift())}return b=b||n.host&&w.length,b&&!q&&w.unshift(\"\"),w.length?n.pathname=w.join(\"/\"):(n.pathname=null,n.path=null),l.isNull(n.pathname)&&l.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},r.prototype.parseHost=function(){var e=this.host,t=f.exec(e);t&&(t=t[0],\":\"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},{\"./util\":8,punycode:3,querystring:6}],8:[function(e,t,n){\"use strict\";t.exports={isString:function(e){return\"string\"==typeof e},isObject:function(e){return\"object\"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},{}],9:[function(e,t,n){function r(e){var t=a(e.currentTarget).parent().find(\".dropdown-menu\");t.toggleClass(\"open\"),e.stopPropagation(),e.preventDefault()}function o(e){a(\".dropdown-menu\").removeClass(\"open\")}function i(){a(document).on(\"click\",\".toggle-dropdown\",r),a(document).on(\"click\",\".dropdown-menu\",function(e){e.stopPropagation()}),a(document).on(\"click\",o)}var a=e(\"jquery\");t.exports={init:i}},{jquery:1}],10:[function(e,t,n){function r(){s.init(),i.init(),o.init(),a.init(),u.createButton({index:0,icon:\"fa fa-align-justify\",onClick:function(e){e.preventDefault(),s.toggle()}})}var o=e(\"./dropdown\"),i=e(\"./keyboard\"),a=e(\"./navigation\"),s=e(\"./sidebar\"),u=e(\"./toolbar\"),l=window.gitbook;l.events.on(\"start\",r),l.keyboard=i,l.navigation=a,l.sidebar=s,l.toolbar=u},{\"./dropdown\":9,\"./keyboard\":11,\"./navigation\":13,\"./sidebar\":15,\"./toolbar\":16}],11:[function(e,t,n){function r(e,t){i.bind(e,function(e){return t(),!1})}function o(){r([\"right\"],function(e){a.goNext()}),r([\"left\"],function(e){a.goPrev()}),r([\"s\"],function(e){s.toggle()})}var i=e(\"mousetrap\"),a=e(\"./navigation\"),s=e(\"./sidebar\");t.exports={init:o,bind:r}},{\"./navigation\":13,\"./sidebar\":15,mousetrap:2}],12:[function(e,t,n){function r(e){return o.state.$book.addClass(\"is-loading\"),e.always(function(){o.state.$book.removeClass(\"is-loading\")}),e}var o=window.gitbook;t.exports={show:r}},{}],13:[function(e,t,n){function r(){return T(E.isSmallScreen()?\".book-body\":\".body-inner\")}function o(e){var t=r(),n=0;i(e)&&(e&&(n=u(e)),t.unbind(\"scroll\"),t.animate({scrollTop:n},800,\"swing\",function(){t.scroll(f)}),l(null,e))}function i(e){var t=r(),n=t.find(e);return!!n.length}function a(e){return 0===e.length}function s(e,t){return e.length>0&&e.filter(t).length>0}function u(e){var t=r(),n=t.find(\".page-inner\"),o=t.find(e),i=o.offsetParent(),u=0;if(s([t,n,o,i],a))return 0;u=o.position().top;for(var l=10,c=0;c<l&&(!i.is(n)&&!i.is(i.offsetParent()));c++)o=i,u+=o.position().top,i=o.offsetParent();return Math.floor(u)}function l(e,t){if(e||t||(e=w.first()),t&&(e=w.length>1?w.filter(function(){var e=c(T(this));return e==t}).first():w.first()),!e.is(C)){C=e,w.removeClass(\"active\"),e.addClass(\"active\"),t=c(e);var n=window.location.pathname+window.location.hash,r=window.location.pathname+t;r!=n&&history.replaceState({path:r},null,r)}}function c(e){var t=e.children(\"a\"),n=t.attr(\"href\").split(\"#\")[1];return n&&(n=\"#\"+n),n?n:\"\"}function f(){var e=r(),t=e.scrollTop(),n=e.prop(\"scrollHeight\"),o=e.prop(\"clientHeight\"),i=w.length,a=null;T(w.get().reverse()).each(function(e){var n,r=c(T(this));r&&!a&&(n=u(r),t>=n&&(a=T(this))),e!=i-1||a||(a=T(this))}),a||t||(a=w.first()),t&&n-t==o&&(a=w.last()),l(a)}function p(e,t){var n=k.parse(A),r=k.resolve(window.location.pathname,e),i=k.parse(r),a=i.hash,s=i.pathname!==n.pathname,u=Boolean(i.hostname);if(!S||u)return void(location.href=e);if(!s)return t&&history.pushState({path:r},null,r),o(a);A=r;var l=T.Deferred(function(e){T.ajax({type:\"GET\",url:r,cache:!0,headers:{\"Access-Control-Expose-Headers\":\"X-Current-Location\"},success:function(n,i,s){var u=s.getResponseHeader(\"X-Current-Location\")||r;n=n.replace(/<(\\/?)(html|head|body)([^>]*)>/gi,function(e,t,n,r){return\"<\"+t+\"div\"+(t?\"\":' data-element=\"'+n+'\"')+r+\">\"});var l,c=T(n),f=c.find(\".book\");if(0===f.length){var p=new Error(\"Invalid gitbook page, redirecting...\");return e.reject(p)}t&&history.pushState({path:u},null,u),c=T(n),l=c.find(\"[data-element=head]\"),f=c.find(\".book\"),document.title=l.find(\"title\").text();var h=T(\"head\");h.find(\"link[rel=prev]\").remove(),h.find(\"link[rel=next]\").remove(),h.append(l.find(\"link[rel=prev]\")),h.append(l.find(\"link[rel=next]\"));var g=T(\".book\").attr(\"class\"),m=T(\".book-summary\").scrollTop();f.toggleClass(\"with-summary\",T(\".book\").hasClass(\"with-summary\")),T(\".book\").replaceWith(f),T(\".book\").attr(\"class\",g),T(\".book-summary\").scrollTop(m),N.state.$book=T(\".book\"),d(!a),a&&o(a),e.resolve()}})}).promise();return j.show(l.fail(function(e){console.log(e)}))}function h(){var e,t;e=parseInt(T(\".body-inner\").css(\"width\"),10),t=parseInt(T(\".page-wrapper\").css(\"width\"),10),T(\".navigation-next\").css(\"margin-right\",e-t+\"px\");var n=r();n.unbind(\"scroll\"),n.scroll(f)}function d(e){var t=T(\".book-body\"),n=t.find(\".body-inner\"),o=n.find(\".page-wrapper\");h(),o.focus();var i=r();e!==!1&&i.scrollTop(0),w=T(\".book-summary .summary .chapter\").filter(function(){var e=T(this).children(\"a\"),t=null;if(!e.length)return!1;t=e.attr(\"href\").split(\"#\")[0];var n=k.resolve(window.location.pathname,t);return window.location.pathname==n}),w.length>1?i.scroll(f):C=w.first()}function g(e){return 0===e.button}function m(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function v(e){var t=T(this),n=t.attr(\"target\");if(!m(e)&&g(e)&&!n){e.stopPropagation(),e.preventDefault();var r=t.attr(\"href\");r&&p(r,!0)}}function y(){var e=T(\".navigation-next\").attr(\"href\");e&&p(e,!0)}function b(){var e=T(\".navigation-prev\").attr(\"href\");e&&p(e,!0)}function x(){T.ajaxSetup({cache:!1}),history.replaceState({path:window.location.href},\"\"),window.onpopstate=function(e){if(null!==e.state)return p(e.state.path,!1)},T(document).on(\"click\",\".navigation-prev\",v),T(document).on(\"click\",\".navigation-next\",v),T(document).on(\"click\",\".summary [data-path] a\",v),T(document).on(\"click\",\".page-inner a\",v),T(window).resize(h),d(!1)}var w,C,T=e(\"jquery\"),k=e(\"url\"),j=e(\"./loading\"),E=e(\"./platform\"),N=window.gitbook,S=\"undefined\"!=typeof history.pushState,A=location.href;t.exports={init:x,goNext:y,goPrev:b}},{\"./loading\":12,\"./platform\":14,jquery:1,url:7}],14:[function(e,t,n){var r=e(\"jquery\");t.exports={isMobile:function(){return r(document).width()<=600},isSmallScreen:function(){return r(document).width()<=1240}}},{jquery:1}],15:[function(e,t,n){function r(e,t){null!=l.state&&o()==e||(null==t&&(t=!0),l.state.$book.toggleClass(\"without-animation\",!t),l.state.$book.toggleClass(\"with-summary\",e),l.storage.set(\"sidebar\",o()))}function o(){return l.state.$book.hasClass(\"with-summary\")}function i(){u.isMobile()||r(l.storage.get(\"sidebar\",!0),!1),s(document).on(\"click\",\".book-summary li.chapter a\",function(e){u.isMobile()&&r(!1,!1)})}function a(e){var t=s(\".book-summary\");t.find(\"li\").each(function(){var t=s(this).data(\"path\"),n=null==e||e.indexOf(t)!==-1;s(this).toggle(n),n&&s(this).parents(\"li\").show()})}var s=e(\"jquery\"),u=e(\"./platform\"),l=window.gitbook;t.exports={init:i,isOpen:o,toggle:r,filter:a}},{\"./platform\":14,jquery:1}],16:[function(e,t,n){function r(){return\"btn-\"+g++}function o(e,t,n,r){var o=e.children(t).length;n<0&&(n=Math.max(0,o+1+n)),e.append(r),n<o&&e.children(t).eq(n).before(e.children(t).last())}function i(e){e.preventDefault()}function a(e){var t=p(\"<div>\",{class:\"dropdown-menu\",html:'<div class=\"dropdown-caret\"><span class=\"caret-outer\"></span><span class=\"caret-inner\"></span></div>'});if(\"string\"==typeof e)t.append(e);else{var n=e.map(function(e){return p.isArray(e)?e:[e]});n.forEach(function(e){var n=p(\"<div>\",{class:\"buttons\"}),r=\"size-\"+e.length;e.forEach(function(e){e=p.extend({text:\"\",className:\"\",onClick:i},e||{});var t=p(\"<button>\",{class:\"button \"+r+\" \"+e.className,text:e.text});t.click(e.onClick),n.append(t)}),t.append(n)})}return t}function s(e){return e=p.extend({label:\"\",icon:\"\",text:\"\",position:\"left\",className:\"\",onClick:i,dropdown:null,index:null,id:r()},e||{}),d.push(e),u(e),e.id}function u(e){var t,n=p(\".book-header\"),r=n.find(\"h1\"),i=\"pull-\"+e.position,s=p(\"<a>\",{class:\"btn\",text:e.text?\" \"+e.text:\"\",\"aria-label\":e.label,href:\"#\"});if(s.click(e.onClick),e.icon&&p(\"<i>\",{class:e.icon}).prependTo(s),e.dropdown){var u=p(\"<div>\",{class:\"dropdown \"+i+\" \"+e.className});s.addClass(\"toggle-dropdown\"),u.append(s);var l=a(e.dropdown);l.addClass(\"dropdown-\"+(\"right\"==e.position?\"left\":\"right\")),u.append(l),t=u}else s.addClass(i),s.addClass(e.className),t=s;t.addClass(\"js-toolbar-action\"),p.isNumeric(e.index)&&e.index>=0?o(n,\".btn, .dropdown, h1\",e.index,t):t.insertBefore(r)}function l(){p(\".js-toolbar-action\").remove(),d.forEach(u)}function c(e){d=p.grep(d,function(t){return t.id!=e}),l()}function f(e){d=p.grep(d,function(t){return e.indexOf(t.id)==-1}),l()}var p=e(\"jquery\"),h=window.gitbook,d=[],g=0;h.events.on(\"page.change\",function(){l()}),t.exports={createButton:s,removeButton:c,removeButtons:f}},{jquery:1}]},{},[10]);\n"
  },
  {
    "path": "docs/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>简介 · N_m3u8DL-CLI文档</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"nilaoda\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-donate/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-highlight/website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    \n\n    <style>\n    @media only screen and (max-width: 640px) {\n        .book-header .hidden-mobile {\n            display: none;\n        }\n    }\n    </style>\n    <script>\n        window[\"gitbook-plugin-github-buttons\"] = {\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]};\n    </script>\n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" >\n            \n                <span>\n            \n                    \n                    简介\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"2.1\" >\n            \n                <span>\n            \n                    \n                    入门\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"2.1.1\" data-path=\"Introductory.html\">\n            \n                <a href=\"Introductory.html\">\n            \n                    \n                    使用入门\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"3.1\" >\n            \n                <span>\n            \n                    \n                    进阶\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"3.1.1\" data-path=\"Advanced.html\">\n            \n                <a href=\"Advanced.html\">\n            \n                    \n                    命令行参数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"3.1.2\" data-path=\"SimpleGUI.html\">\n            \n                <a href=\"SimpleGUI.html\">\n            \n                    \n                    SimpleGUI\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n        \n        <li class=\"divider\"></li>\n        \n        \n    \n        <li class=\"chapter \" data-level=\"4.1\" >\n            \n                <span>\n            \n                    \n                    辅助\n            \n                </span>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"4.1.1\" data-path=\"GetM3u8.html\">\n            \n                <a href=\"GetM3u8.html\">\n            \n                    \n                    JS获取m3u8\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"4.1.2\" data-path=\"M3U8URL2File.html\">\n            \n                <a href=\"M3U8URL2File.html\">\n            \n                    \n                    M3U8URL2File\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >简介</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <h1 id=\"nm3u8dl-cli&#x4F7F;&#x7528;&#x8BF4;&#x660E;&#x4E66;\">N_m3u8DL-CLI&#x4F7F;&#x7528;&#x8BF4;&#x660E;&#x4E66;</h1>\n<p><div style=\"text-align:right\"><b>2021&#x5E74;10&#x6708;17&#x65E5;&#x66F4;&#x65B0;</b> | <a href=\"https://github.com/nilaoda\" target=\"_blank\">nilaoda</a>\n</div><br>  </p>\n<p>N_m3u8DL-CLI&#x662F;&#x4E00;&#x6B3E;&#x7528;&#x4E8E;&#x4E0B;&#x8F7D;m3u8&#x7684;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF0C;&#x57FA;&#x4E8E;<code>.NET Framework 4.6</code>&#x6846;&#x67B6;&#x5F00;&#x53D1;&#xFF0C;&#x8C03;&#x7528;&#x7CFB;&#x7EDF;&#x7C7B;&#x5E93;&#x8FDB;&#x884C;HTTP&#x4E0B;&#x8F7D;&#xFF0C;&#x652F;&#x6301;&#x5E38;&#x89C1;&#x7684;m3u8&#x683C;&#x5F0F;&#x4E0B;&#x8F7D;&#xFF0C;&#x652F;&#x6301;&#x4ECE;&#x89C6;&#x9891;&#x4E2D;&#x9009;&#x62E9;&#x4E00;&#x90E8;&#x5206;&#x4E0B;&#x8F7D;&#xFF0C;&#x8FD8;&#x63D0;&#x4F9B;&#x4E30;&#x5BCC;&#x7684;&#x547D;&#x4EE4;&#x884C;&#x9009;&#x9879;&#x4EE5;&#x589E;&#x5F3A;&#x5176;&#x529F;&#x80FD;&#x3002;  </p>\n<h2 id=\"&#x7CFB;&#x7EDF;&#x652F;&#x6301;\">&#x7CFB;&#x7EDF;&#x652F;&#x6301;</h2>\n<ul>\n<li>Windows7&#x4EE5;&#x4E0A;&#x7CFB;&#x7EDF;</li>\n</ul>\n<h2 id=\"&#x7A0B;&#x5E8F;&#x4F9D;&#x8D56;\">&#x7A0B;&#x5E8F;&#x4F9D;&#x8D56;</h2>\n<p>&#x6240;&#x9700;&#x8FD0;&#x884C;&#x65F6;&#x73AF;&#x5883;&#xFF1A;<a href=\"https://dotnet.microsoft.com/download/thank-you/net46-chs\" target=\"_blank\">.NET Framework 4.6</a><br>&#x7528;&#x4E8E;&#x5408;&#x5E76;&#x5206;&#x7247;&#xFF1A;<a href=\"https://ffmpeg.zeranoe.com/builds/\" target=\"_blank\">ffmpeg</a> &#x6216;&#x6211;&#x7F16;&#x8BD1;&#x7684;<a href=\"https://github.com/nilaoda/N_m3u8DL-CLI/releases/download/2.2.0/ffmpeg.exe\" target=\"_blank\">&#x7CBE;&#x7B80;&#x7248;</a></p>\n<h2 id=\"&#x53D1;&#x5E03;&#x9875;&#x9762;\">&#x53D1;&#x5E03;&#x9875;&#x9762;</h2>\n<p><a href=\"https://github.com/nilaoda/N_m3u8DL-CLI/releases\" target=\"_blank\">https://github.com/nilaoda/N_m3u8DL-CLI/releases</a></p>\n\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"简介\",\"level\":\"1.1.1\",\"depth\":2,\"next\":{\"title\":\"入门\",\"level\":\"2.1\",\"depth\":1,\"ref\":\"\",\"articles\":[{\"title\":\"使用入门\",\"level\":\"2.1.1\",\"depth\":2,\"path\":\"Introductory.md\",\"ref\":\"Introductory.md\",\"articles\":[]}]},\"previous\":{\"title\":\"简介\",\"level\":\"1.1\",\"depth\":1,\"ref\":\"\",\"articles\":[{\"title\":\"简介\",\"level\":\"1.1.1\",\"depth\":2,\"path\":\"README.md\",\"ref\":\"README.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"donate\",\"github\",\"github-buttons\",\"-sharing\",\"sharing-plus\"],\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"github\":{\"url\":\"https://github.com/nilaoda\"},\"search\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"lunr\":{\"maxIndexSize\":1000000,\"ignoreSpecialCharacters\":false},\"donate\":{\"alipay\":\"./source/images/alipay.png\",\"alipayText\":\"支付宝\",\"button\":\"赞赏\",\"title\":\"\",\"wechat\":\"\",\"wechatText\":\"微信打赏\"},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"highlight\":{},\"github-buttons\":{\"buttons\":[{\"user\":\"nilaoda\",\"repo\":\"N_m3u8DL-CLI\",\"type\":\"star\",\"size\":\"small\",\"count\":true}]},\"sharing\":{\"qq\":true,\"all\":[\"google\",\"facebook\",\"weibo\",\"twitter\",\"qq\",\"qzone\",\"linkedin\",\"pocket\"],\"douban\":false,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":true,\"linkedin\":false},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false}},\"theme\":\"default\",\"author\":\"nilaoda\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"N_m3u8DL-CLI文档\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"N_m3u8DL-CLI文档\"},\"file\":{\"path\":\"README.md\",\"mtime\":\"2022-07-11T16:10:18.573Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2022-07-11T16:10:30.637Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-donate/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github-buttons/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search-engine.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/lunr.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-lunr/search-lunr.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/search_index.json",
    "content": "{\"index\":{\"version\":\"0.5.12\",\"fields\":[{\"name\":\"title\",\"boost\":10},{\"name\":\"keywords\",\"boost\":15},{\"name\":\"body\",\"boost\":1}],\"ref\":\"url\",\"documentStore\":{\"store\":{\"./\":[\"2021年10月17日更新\",\"4.6框架开发，调用系统类库进行http下载，支持常见的m3u8格式下载，支持从视频中选择一部分下载，还提供丰富的命令行选项以增强其功能。\",\"4.6用于合并分片：ffmpeg\",\"cli/releas\",\"cli使用说明书\",\"cli是一款用于下载m3u8的命令行工具，基于.net\",\"framework\",\"https://github.com/nilaoda/n_m3u8dl\",\"n_m3u8dl\",\"nilaoda\",\"windows7以上系统\",\"|\",\"发布页面\",\"或我编译的精简版\",\"所需运行时环境：.net\",\"程序依赖\",\"简介\",\"系统支持\"],\"Introductory.html\":[\"*.log\",\".\",\"download\",\"log\",\"└──\",\"├──\",\"使用入门\",\"程序默认将视频文件放在了exe同目录的downloads文件夹中，将程序运行日志信息放在了logs目录中。\",\"让我们开始吧\",\"首先，最简单的使用方式是直接双击exe，将你要下载的m3u8文件或m3u8链接复制进去，然后按下回车键。就像这样：正常情况下，程序将产生如下的目录结构：\"],\"Advanced.html\":[\"\\\"\\\"\",\"\\\"\\\",\",\"\\\"audioname\\\":\",\"\\\"audioname\\\":\\\"\\\",\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\aes.m3u8\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\key\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\m.m3u8\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\raw.m3u8\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\小猪佩奇.json\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\小猪佩奇第一集(mgtv).m3u8\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\小猪佩奇第一集.m3u8\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\downloads\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\downloads\\\"，这在没有gui的情况下将十分有用。\",\"\\\"comment\\\":\",\"\\\"comment\\\":\\\"我爱小猪佩奇\\\",\",\"\\\"cookie:mqguid\\\"\",\"\\\"cookie:sessionid=1236983428;cns=xpopqwe305|us\",\"\\\"copyright\\\":\",\"\\\"copyright\\\":\\\"\\\",\",\"\\\"d:\\\\myvideo\\\"\",\"\\\"di5rzxkaaaaaaaaaaaaaaa==\\\"\",\"\\\"encodingtool\\\":\",\"\\\"faststart\\\":\",\"\\\"faststart\\\":\\\"true\\\",\",\"\\\"http://127.0.0.1:8080\\\"\",\"\\\"http://x.x/1.m3u8\\\"\",\"\\\"http://x.x/1.m3u8\\\"将成为n_m3u8dl\",\"\\\"https://apd\",\"\\\"https://moviets.tc.qq.com/p0027jbwye1.321004.ts.m3u8?ver=4\\\"\",\"\\\"mp4\\\",\",\"\\\"muxformat\\\":\",\"\\\"muxformat\\\":\\\"mp4\\\",\",\"\\\"poster\\\":\",\"\\\"poster\\\":\\\"c:\\\\\\\\users\\\\\\\\nilao\\\\\\\\desktop\\\\\\\\小猪佩奇.jpg\\\",\",\"\\\"title\\\":\",\"\\\"title\\\":\\\"小猪佩奇第一集\\\",\",\"\\\"true\\\",\",\"\\\"小猪佩奇第一集\\\"\",\"\\\"文件路径，\\\\需写为\\\\\\\\\\\",\",\"#ext\",\"#extinf:12.000,\",\"#extinf:8.200,\",\"#extm3u\",\"&\",\"(default:\",\"(isom/iso2/avc1/mp41)\",\"(khtml,\",\"(window\",\"...\",\"0\",\"00:10:00\",\"00:23:00\",\"00:25:20\",\"00:25:20的内容\",\"00:30:00\",\"00_p0027jbwye1.321004.1.ts?index=0&start=0&end=12000&brs=0&bre=1137963&ver=4\",\"01:10:10\",\"01_p0027jbwye1.321004.1.ts?index=1&start=12000&end=24000&brs=1137964&bre=2658695&ver=4\",\"02_p0027jbwye1.321004.1.ts?index=2&start=24000&end=32200&brs=2658696&bre=3083011&ver=4\",\"07\",\"072\",\"08t23:12:46.9349258+08:00\",\"1\",\"10\",\"10)\",\"10.0;\",\"100\",\"100]\",\"10]\",\"128解密iv\",\"128解密key\",\"128解密，并使用输入的base64string来作为解密key\",\"128解密，并使用输入的文件来作为解密key\",\"15)\",\"16)\",\"1b75827c3b093392908ce37d3e2c2481.v.smtcdns.com/moviets.tc.qq.com/aaycnil6winh7t1jaihdfjn5ancf7q8mk3qxxqhl\",\"2\",\"2.0.4及以后版本的新功能。可以使你从一段视频中下载你想要的一部分，支持分片参数与时间码参数，具体的使用示例如下：\",\"2.5.1及以后版本的新功能。在直播录制时，这将非常有用。\",\"200\",\"2019\",\"32)\",\"38.6\",\"4\",\"5\",\"7ik/uwmrofz2r5xhiaqxgdgnc2df64gzxntmzvhtgq7mar8xuhpv/iha_kl1szfmdh7rlzcaoqn64fvvl3myzr20lmxkiua2qr7rgjvqms8k6gqi6vhwjuqmurctwxb6kdqyybhdsr1zgiadotcm5wbe36xn9cc34itm7zoyddjjhyh\",\":\",\"[options]\",\"accept\",\"agent\",\"agent:mozilla/5.0\",\"applewebkit/537.36\",\"base\",\"baseurl\",\"chacha20keybase64\",\"chacha20noncebase64\",\"chrome/63.0.3239.132\",\"cli\",\"cli.args.txt，存一些命令行参数，举个例子：\",\"cli，便能双击下载且能保证程序会按照一定的默认行为去正确地工作，像你期待的那样。\",\"cookie:sessionid=1236983428;cns=xpopqwe305\",\"disabledateinfo\",\"disableintegritycheck\",\"display\",\"downloadrang\",\"enableaudioonli\",\"enablebinarymerg\",\"enablechacha20\",\"enabledelafterdon\",\"enablemuxfaststart\",\"enableparseonli\",\"endlist\",\"gecko)\",\"header\",\"help\",\"http://127.0.0.1:8080\",\"information.\",\"isom\",\"kb/\",\"key:valu\",\"lavf58.20.100\",\"liverecdur\",\"maxspe\",\"maxthread\",\"maxthreads和\",\"media\",\"mib\",\"minthread\",\"minthreads指定，默认情况下，这两个值分别是32和16，你可以手动指定它，例如下列命令可将程序线程限制到1：\",\"mpeg\",\"muxsetjson\",\"n_m3u8dl\",\"nomerg\",\"noproxi\",\"noproxy时，此处设置将不生效\",\"nt\",\"options:\",\"playlist\",\"proxyaddress\",\"rang\",\"refer\",\"registerurlprotocol\",\"retrycount\",\"safari/537.36\",\"safari/537.36\\\"\",\"savenam\",\"screen.\",\"sequence:0\",\"stopspe\",\"targetduration:15\",\"timeout\",\"type:vod\",\"unregisterurlprotocol\",\"usage:\",\"usekeybase64\",\"usekeyfil\",\"usekeyiv\",\"user\",\"version\",\"version:3\",\"wfetswfstxa4ijpzcxytycvcrlfiybddiygqnjisijsbu_m0/\\\"\",\"workdir\",\"wow64)\",\"x\",\"ye\",\"{\",\"}\",\"下载视频00:23:00\",\"下载视频的30分钟到结束的内容\",\"下载视频的前10分钟的内容\",\"下载视频的第0个分片到第100个分片，即[0\",\"下载视频的第0个分片到第10个分片，即[0\",\"下载视频的第200个分片到最后一个分片\",\"不检测分片数量是否完整\",\"不自动使用系统代理\",\"不限速\",\"为了丰富软件功能，我提供了很多命令行参数，在本页我将详细介绍这些参数的作用。\",\"仅下载视频的一部分分片或长度\",\"你可以将.m3u8文件的默认打开方式设置为n_m3u8dl\",\"你可能不知道\",\"使用base64字符串定义a\",\"使用hex字符串定义a\",\"使用|分割不同的key&valu\",\"使用命令行参数\",\"使用外部16字节文件定义ae\",\"使用外部json文件定义混流选项\",\"使用本命令后，合并生成的mp4文件将能够在网络传输时边下边看，适用于流媒体。缺点是合并时间会变慢。本命令无需任何参数。\",\"使用本命令后，所有关于mp4合并的参数将会失效，程序将采用二进制合并，即直接拼接服务器提供的raw流，不使用ffmpeg进行混流。本命令无需任何参数。\",\"使用本命令后，程序将只分析用户输入的m3u8文件而不进行下载。本命令无需任何参数。\",\"使用本命令后，程序将只合并音频轨道。本命令无需任何参数。\",\"例如你想要将一个图片作为视频的海报，同时为视频添加标题，你可以在桌面新建一个小猪佩奇.json，并在文件中写入如下内容：\",\"例如，下列命令将使你的视频保存为小猪佩奇第一集.mp4\",\"关闭混流中的日期写入\",\"分\",\"取消注册m3u8dl链接协议\",\"合并时仅封装音频轨道\",\"命令行参数\",\"在mediainfo中，显示如下：\",\"如\",\"如芒果tv的m3u8会验证cookie，必须含有mqguid才能正确访问下载，你可以这样指定：\",\"封面\",\"小猪佩奇第一集\",\"平均混合码率\",\"开启下载后删除临时文件夹的功能\",\"开启二进制合并分片\",\"开启仅解析模式(程序只进行到meta.json)\",\"开启混流mp4的faststart特性\",\"强制使用ae\",\"当下载速度低于此值(单位为kb/s)时，程序进入重试阶段。默认值为0\",\"当然，支持自定义多种请求头，使用|分隔，例如：\",\"当速度低于此值时，重试(单位为kb/s)\",\"录制日期\",\"必要的，它意味着程序将从哪里接收一个地址、文件以开始下载。例如，下列命令将使从指定地址下载一个视频：\",\"我爱小猪佩奇\",\"持续时间\",\"指定一个json文件用于混流，能够识别的格式如下：\",\"指定程序最大重试次数。某些时候我们并不能一次性成功下载所有分片，在一次任务结束后，程序会检测已下载的ts分片数量和m3u8文件中的分片数量是否相等，不一致则进入重试环节。默认值为15\",\"指定程序进行网络请求的超时时长，默认值为10秒\",\"文件大小\",\"本命令无需任何参数。\",\"某些时候，视频服务器会阻止你的请求，除非你能够伪造一些请求头，本命令即可伪造一些请求头，目前支持大部分常见请求头：\",\"格式\",\"格式概况\",\"此命令将指定视频保存的位置，参数是一个文件夹路径。例如，下列命令将使你的视频保存至d:\\\\myvideo：\",\"此命令将指定视频保存的名称，参数是一个有效字符串。通常情况下，视频名称由程序自动识别，假如你想自定义一个名字，可以使用本命令。\",\"此命令常用于下载本地m3u8文件，例如：\",\"此时，如果你的参数只有0个(双击打开程序)或1个(使用命令行调用且只输入了m3u8地址)，程序会自动补充参数，例如n_m3u8dl\",\"注册m3u8dl链接协议\",\"注意，当启用\",\"注意：在使用时间码参数时，格式必须为00:00:00才能被程序正确识别\",\"然后使用如下命令使用它：\",\"现在你可以在程序exe目录下新建n_m3u8dl\",\"用于开启程序的下载完成后自动删除临时目录功能，无需任何参数。\",\"电影名称\",\"直播录制时，达到此长度自动退出软件(hh:mm:ss)\",\"直播流录制长度为10分钟\",\"直播流录制长度为1小时10分钟10秒\",\"禁用自动合并\",\"秒\",\"程序的下载线程数可由\",\"第一个参数\",\"编码程序\",\"编解码器id\",\"设定baseurl\",\"设定存储文件名(不包括后缀)\",\"设定程序工作目录\",\"设定程序的最大线程数\",\"设定程序的最小线程数\",\"设定程序的重试次数\",\"设定程序网络请求的超时时间(单位为秒)\",\"设定请求头，格式\",\"设置http/socks5代理,\",\"设置http代理，配合代理软件使用。默认情况下，程序会使用系统代理；现在你可以自定义一个http地址用作代理了。\",\"设置下载速度上限(单位为kb/s)\",\"设置下载速度上限(单位为kb/s)。默认值为0,\",\"评论\",\"这样可以使程序使用如下请求头：\",\"这样的m3u8文件是无法直接下载的，你需要指定对应的baseurl，就像这样：\",\"这样，你的视频将在windows文件资源管理器中呈现出这样的效果：\",\"首先，第一个参数是\",\"默认情况下，下载合并生成的mp4文件会默认加入一个录制日期，你可以使用本命令来规避此操作。本命令无需任何参数。\",\"默认情况下，下载后会自动合并为mp4文件，你可以使用本命令来规避此操作。本命令无需任何参数。\",\"默认情况下，下载器会使用当前系统的代理设置，你可以使用本命令来规避此操作。本命令无需任何参数。\",\"默认情况下，下载器在下载过程完毕后，会提取下载目录所有ts文件数量与meta.json中读取到的文件数量做比对，如果数量不一致(这意味着丢失了某些分片)，程序将进入重试阶段。你可以使用此选项来规避此操作(不推荐)。\"],\"SimpleGUI.html\":[\"+\",\"1.将m3u8链接每行一个存入一个.txt文件，然后将文件直接拖到m3u8地址文本框，点击go按钮2.将m3u8文件存到一个文件夹中，然后将文件夹直接拖到m3u8地址文本框，点击go按钮3.新建txt,每行以name,url形式写\",\"cli\",\"s\",\"simpleg.exe来自动化生产绝大部分参数，大大提高了下载效率。\",\"simplegui\",\"功能说明\",\"在m3u8地址文本框或视频标题文本框按下回车键时，可触发下载；亦或者在程序界面按下快捷键alt\",\"当m3u8地址文本框不为空时，双击视频标题文本框时，程序将自动识别您输入的m3u8地址并给出一个合适的标题\",\"支持批量下载\",\"欢迎使用simplegui\",\"程序在启动时会自动从剪贴板中寻找url，贴入m3u8地址文本框\",\"程序界面\",\"简介\",\"自动保存配置\",\"鉴于大部分用户在使用命令行程序时感受到比较繁琐的操作体验，我开发了n_m3u8dl\"],\"GetM3u8.html\":[\"js获取m3u8\",\"使用javascript获取m3u8\",\"这里变得空空如也...\"],\"M3U8URL2File.html\":[\"m3u8url2fil\",\"一款帮助你将m3u8链接下载为m3u8文件的小软件。https://github.com/nilaoda/m3u8url2file/releas\",\"程序界面\"]},\"length\":6},\"tokenStore\":{\"root\":{\"0\":{\"0\":{\"docs\":{},\":\":{\"1\":{\"0\":{\"docs\":{},\":\":{\"0\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"2\":{\"3\":{\"docs\":{},\":\":{\"0\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"docs\":{}}},\"5\":{\"docs\":{},\":\":{\"2\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"的\":{\"docs\":{},\"内\":{\"docs\":{},\"容\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"3\":{\"0\":{\"docs\":{},\":\":{\"0\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"_\":{\"docs\":{},\"p\":{\"0\":{\"0\":{\"2\":{\"7\":{\"docs\":{},\"j\":{\"docs\":{},\"b\":{\"docs\":{},\"w\":{\"docs\":{},\"y\":{\"docs\":{},\"e\":{\"1\":{\"docs\":{},\".\":{\"3\":{\"2\":{\"1\":{\"0\":{\"0\":{\"4\":{\"docs\":{},\".\":{\"1\":{\"docs\":{},\".\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\"?\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"d\":{\"docs\":{},\"e\":{\"docs\":{},\"x\":{\"docs\":{},\"=\":{\"0\":{\"docs\":{},\"&\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"t\":{\"docs\":{},\"=\":{\"0\":{\"docs\":{},\"&\":{\"docs\":{},\"e\":{\"docs\":{},\"n\":{\"docs\":{},\"d\":{\"docs\":{},\"=\":{\"1\":{\"2\":{\"0\":{\"0\":{\"0\":{\"docs\":{},\"&\":{\"docs\":{},\"b\":{\"docs\":{},\"r\":{\"docs\":{},\"s\":{\"docs\":{},\"=\":{\"0\":{\"docs\":{},\"&\":{\"docs\":{},\"b\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"=\":{\"1\":{\"1\":{\"3\":{\"7\":{\"9\":{\"6\":{\"3\":{\"docs\":{},\"&\":{\"docs\":{},\"v\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"=\":{\"4\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}},\"docs\":{}}}}}}}}},\"docs\":{}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}},\"1\":{\"docs\":{},\":\":{\"1\":{\"0\":{\"docs\":{},\":\":{\"1\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"_\":{\"docs\":{},\"p\":{\"0\":{\"0\":{\"2\":{\"7\":{\"docs\":{},\"j\":{\"docs\":{},\"b\":{\"docs\":{},\"w\":{\"docs\":{},\"y\":{\"docs\":{},\"e\":{\"1\":{\"docs\":{},\".\":{\"3\":{\"2\":{\"1\":{\"0\":{\"0\":{\"4\":{\"docs\":{},\".\":{\"1\":{\"docs\":{},\".\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\"?\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"d\":{\"docs\":{},\"e\":{\"docs\":{},\"x\":{\"docs\":{},\"=\":{\"1\":{\"docs\":{},\"&\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"t\":{\"docs\":{},\"=\":{\"1\":{\"2\":{\"0\":{\"0\":{\"0\":{\"docs\":{},\"&\":{\"docs\":{},\"e\":{\"docs\":{},\"n\":{\"docs\":{},\"d\":{\"docs\":{},\"=\":{\"2\":{\"4\":{\"0\":{\"0\":{\"0\":{\"docs\":{},\"&\":{\"docs\":{},\"b\":{\"docs\":{},\"r\":{\"docs\":{},\"s\":{\"docs\":{},\"=\":{\"1\":{\"1\":{\"3\":{\"7\":{\"9\":{\"6\":{\"4\":{\"docs\":{},\"&\":{\"docs\":{},\"b\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"=\":{\"2\":{\"6\":{\"5\":{\"8\":{\"6\":{\"9\":{\"5\":{\"docs\":{},\"&\":{\"docs\":{},\"v\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"=\":{\"4\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}}}},\"docs\":{}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}},\"2\":{\"docs\":{},\"_\":{\"docs\":{},\"p\":{\"0\":{\"0\":{\"2\":{\"7\":{\"docs\":{},\"j\":{\"docs\":{},\"b\":{\"docs\":{},\"w\":{\"docs\":{},\"y\":{\"docs\":{},\"e\":{\"1\":{\"docs\":{},\".\":{\"3\":{\"2\":{\"1\":{\"0\":{\"0\":{\"4\":{\"docs\":{},\".\":{\"1\":{\"docs\":{},\".\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\"?\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"d\":{\"docs\":{},\"e\":{\"docs\":{},\"x\":{\"docs\":{},\"=\":{\"2\":{\"docs\":{},\"&\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"t\":{\"docs\":{},\"=\":{\"2\":{\"4\":{\"0\":{\"0\":{\"0\":{\"docs\":{},\"&\":{\"docs\":{},\"e\":{\"docs\":{},\"n\":{\"docs\":{},\"d\":{\"docs\":{},\"=\":{\"3\":{\"2\":{\"2\":{\"0\":{\"0\":{\"docs\":{},\"&\":{\"docs\":{},\"b\":{\"docs\":{},\"r\":{\"docs\":{},\"s\":{\"docs\":{},\"=\":{\"2\":{\"6\":{\"5\":{\"8\":{\"6\":{\"9\":{\"6\":{\"docs\":{},\"&\":{\"docs\":{},\"b\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"=\":{\"3\":{\"0\":{\"8\":{\"3\":{\"0\":{\"1\":{\"1\":{\"docs\":{},\"&\":{\"docs\":{},\"v\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"=\":{\"4\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}}}},\"docs\":{}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}},\"7\":{\"2\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"8\":{\"docs\":{},\"t\":{\"2\":{\"3\":{\"docs\":{},\":\":{\"1\":{\"2\":{\"docs\":{},\":\":{\"4\":{\"6\":{\"docs\":{},\".\":{\"9\":{\"3\":{\"4\":{\"9\":{\"2\":{\"5\":{\"8\":{\"docs\":{},\"+\":{\"0\":{\"8\":{\"docs\":{},\":\":{\"0\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}},\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"1\":{\"0\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"]\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\".\":{\"0\":{\"docs\":{},\";\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}},\"docs\":{}},\"]\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"2\":{\"8\":{\"docs\":{},\"解\":{\"docs\":{},\"密\":{\"docs\":{},\"i\":{\"docs\":{},\"v\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"k\":{\"docs\":{},\"e\":{\"docs\":{},\"y\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}},\"，\":{\"docs\":{},\"并\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"输\":{\"docs\":{},\"入\":{\"docs\":{},\"的\":{\"docs\":{},\"b\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"6\":{\"4\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"r\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"g\":{\"docs\":{},\"来\":{\"docs\":{},\"作\":{\"docs\":{},\"为\":{\"docs\":{},\"解\":{\"docs\":{},\"密\":{\"docs\":{},\"k\":{\"docs\":{},\"e\":{\"docs\":{},\"y\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}},\"docs\":{}},\"docs\":{}}}}},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"来\":{\"docs\":{},\"作\":{\"docs\":{},\"为\":{\"docs\":{},\"解\":{\"docs\":{},\"密\":{\"docs\":{},\"k\":{\"docs\":{},\"e\":{\"docs\":{},\"y\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}},\"5\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"6\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.007389162561576354}},\"b\":{\"7\":{\"5\":{\"8\":{\"2\":{\"7\":{\"docs\":{},\"c\":{\"3\":{\"docs\":{},\"b\":{\"0\":{\"9\":{\"3\":{\"3\":{\"9\":{\"2\":{\"9\":{\"0\":{\"8\":{\"docs\":{},\"c\":{\"docs\":{},\"e\":{\"3\":{\"7\":{\"docs\":{},\"d\":{\"3\":{\"docs\":{},\"e\":{\"2\":{\"docs\":{},\"c\":{\"2\":{\"4\":{\"8\":{\"1\":{\"docs\":{},\".\":{\"docs\":{},\"v\":{\"docs\":{},\".\":{\"docs\":{},\"s\":{\"docs\":{},\"m\":{\"docs\":{},\"t\":{\"docs\":{},\"c\":{\"docs\":{},\"d\":{\"docs\":{},\"n\":{\"docs\":{},\"s\":{\"docs\":{},\".\":{\"docs\":{},\"c\":{\"docs\":{},\"o\":{\"docs\":{},\"m\":{\"docs\":{},\"/\":{\"docs\":{},\"m\":{\"docs\":{},\"o\":{\"docs\":{},\"v\":{\"docs\":{},\"i\":{\"docs\":{},\"e\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\".\":{\"docs\":{},\"t\":{\"docs\":{},\"c\":{\"docs\":{},\".\":{\"docs\":{},\"q\":{\"docs\":{},\"q\":{\"docs\":{},\".\":{\"docs\":{},\"c\":{\"docs\":{},\"o\":{\"docs\":{},\"m\":{\"docs\":{},\"/\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"y\":{\"docs\":{},\"c\":{\"docs\":{},\"n\":{\"docs\":{},\"i\":{\"docs\":{},\"l\":{\"6\":{\"docs\":{},\"w\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"h\":{\"7\":{\"docs\":{},\"t\":{\"1\":{\"docs\":{},\"j\":{\"docs\":{},\"a\":{\"docs\":{},\"i\":{\"docs\":{},\"h\":{\"docs\":{},\"d\":{\"docs\":{},\"f\":{\"docs\":{},\"j\":{\"docs\":{},\"n\":{\"5\":{\"docs\":{},\"a\":{\"docs\":{},\"n\":{\"docs\":{},\"c\":{\"docs\":{},\"f\":{\"7\":{\"docs\":{},\"q\":{\"8\":{\"docs\":{},\"m\":{\"docs\":{},\"k\":{\"3\":{\"docs\":{},\"q\":{\"docs\":{},\"x\":{\"docs\":{},\"x\":{\"docs\":{},\"q\":{\"docs\":{},\"h\":{\"docs\":{},\"l\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"docs\":{}}}},\"docs\":{}}},\"docs\":{}}}}}},\"docs\":{}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\".\":{\"docs\":{},\"将\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"链\":{\"docs\":{},\"接\":{\"docs\":{},\"每\":{\"docs\":{},\"行\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"存\":{\"docs\":{},\"入\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\".\":{\"docs\":{},\"t\":{\"docs\":{},\"x\":{\"docs\":{},\"t\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"，\":{\"docs\":{},\"然\":{\"docs\":{},\"后\":{\"docs\":{},\"将\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"直\":{\"docs\":{},\"接\":{\"docs\":{},\"拖\":{\"docs\":{},\"到\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"地\":{\"docs\":{},\"址\":{\"docs\":{},\"文\":{\"docs\":{},\"本\":{\"docs\":{},\"框\":{\"docs\":{},\"，\":{\"docs\":{},\"点\":{\"docs\":{},\"击\":{\"docs\":{},\"g\":{\"docs\":{},\"o\":{\"docs\":{},\"按\":{\"docs\":{},\"钮\":{\"2\":{\"docs\":{},\".\":{\"docs\":{},\"将\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"存\":{\"docs\":{},\"到\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"夹\":{\"docs\":{},\"中\":{\"docs\":{},\"，\":{\"docs\":{},\"然\":{\"docs\":{},\"后\":{\"docs\":{},\"将\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"夹\":{\"docs\":{},\"直\":{\"docs\":{},\"接\":{\"docs\":{},\"拖\":{\"docs\":{},\"到\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"地\":{\"docs\":{},\"址\":{\"docs\":{},\"文\":{\"docs\":{},\"本\":{\"docs\":{},\"框\":{\"docs\":{},\"，\":{\"docs\":{},\"点\":{\"docs\":{},\"击\":{\"docs\":{},\"g\":{\"docs\":{},\"o\":{\"docs\":{},\"按\":{\"docs\":{},\"钮\":{\"3\":{\"docs\":{},\".\":{\"docs\":{},\"新\":{\"docs\":{},\"建\":{\"docs\":{},\"t\":{\"docs\":{},\"x\":{\"docs\":{},\"t\":{\"docs\":{},\",\":{\"docs\":{},\"每\":{\"docs\":{},\"行\":{\"docs\":{},\"以\":{\"docs\":{},\"n\":{\"docs\":{},\"a\":{\"docs\":{},\"m\":{\"docs\":{},\"e\":{\"docs\":{},\",\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"docs\":{},\"形\":{\"docs\":{},\"式\":{\"docs\":{},\"写\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}},\"docs\":{}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}},\"2\":{\"0\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"1\":{\"9\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"2\":{\"1\":{\"docs\":{},\"年\":{\"1\":{\"0\":{\"docs\":{},\"月\":{\"1\":{\"7\":{\"docs\":{},\"日\":{\"docs\":{},\"更\":{\"docs\":{},\"新\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\".\":{\"0\":{\"docs\":{},\".\":{\"4\":{\"docs\":{},\"及\":{\"docs\":{},\"以\":{\"docs\":{},\"后\":{\"docs\":{},\"版\":{\"docs\":{},\"本\":{\"docs\":{},\"的\":{\"docs\":{},\"新\":{\"docs\":{},\"功\":{\"docs\":{},\"能\":{\"docs\":{},\"。\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"使\":{\"docs\":{},\"你\":{\"docs\":{},\"从\":{\"docs\":{},\"一\":{\"docs\":{},\"段\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"中\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"你\":{\"docs\":{},\"想\":{\"docs\":{},\"要\":{\"docs\":{},\"的\":{\"docs\":{},\"一\":{\"docs\":{},\"部\":{\"docs\":{},\"分\":{\"docs\":{},\"，\":{\"docs\":{},\"支\":{\"docs\":{},\"持\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"与\":{\"docs\":{},\"时\":{\"docs\":{},\"间\":{\"docs\":{},\"码\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"，\":{\"docs\":{},\"具\":{\"docs\":{},\"体\":{\"docs\":{},\"的\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"示\":{\"docs\":{},\"例\":{\"docs\":{},\"如\":{\"docs\":{},\"下\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"5\":{\"docs\":{},\".\":{\"1\":{\"docs\":{},\"及\":{\"docs\":{},\"以\":{\"docs\":{},\"后\":{\"docs\":{},\"版\":{\"docs\":{},\"本\":{\"docs\":{},\"的\":{\"docs\":{},\"新\":{\"docs\":{},\"功\":{\"docs\":{},\"能\":{\"docs\":{},\"。\":{\"docs\":{},\"在\":{\"docs\":{},\"直\":{\"docs\":{},\"播\":{\"docs\":{},\"录\":{\"docs\":{},\"制\":{\"docs\":{},\"时\":{\"docs\":{},\"，\":{\"docs\":{},\"这\":{\"docs\":{},\"将\":{\"docs\":{},\"非\":{\"docs\":{},\"常\":{\"docs\":{},\"有\":{\"docs\":{},\"用\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}},\"3\":{\"2\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"8\":{\"docs\":{},\".\":{\"6\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}}},\"docs\":{}},\"4\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\".\":{\"6\":{\"docs\":{},\"框\":{\"docs\":{},\"架\":{\"docs\":{},\"开\":{\"docs\":{},\"发\":{\"docs\":{},\"，\":{\"docs\":{},\"调\":{\"docs\":{},\"用\":{\"docs\":{},\"系\":{\"docs\":{},\"统\":{\"docs\":{},\"类\":{\"docs\":{},\"库\":{\"docs\":{},\"进\":{\"docs\":{},\"行\":{\"docs\":{},\"h\":{\"docs\":{},\"t\":{\"docs\":{},\"t\":{\"docs\":{},\"p\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"，\":{\"docs\":{},\"支\":{\"docs\":{},\"持\":{\"docs\":{},\"常\":{\"docs\":{},\"见\":{\"docs\":{},\"的\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"格\":{\"docs\":{},\"式\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"，\":{\"docs\":{},\"支\":{\"docs\":{},\"持\":{\"docs\":{},\"从\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"中\":{\"docs\":{},\"选\":{\"docs\":{},\"择\":{\"docs\":{},\"一\":{\"docs\":{},\"部\":{\"docs\":{},\"分\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"，\":{\"docs\":{},\"还\":{\"docs\":{},\"提\":{\"docs\":{},\"供\":{\"docs\":{},\"丰\":{\"docs\":{},\"富\":{\"docs\":{},\"的\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"行\":{\"docs\":{},\"选\":{\"docs\":{},\"项\":{\"docs\":{},\"以\":{\"docs\":{},\"增\":{\"docs\":{},\"强\":{\"docs\":{},\"其\":{\"docs\":{},\"功\":{\"docs\":{},\"能\":{\"docs\":{},\"。\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}},\"用\":{\"docs\":{},\"于\":{\"docs\":{},\"合\":{\"docs\":{},\"并\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"：\":{\"docs\":{},\"f\":{\"docs\":{},\"f\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"docs\":{},\"e\":{\"docs\":{},\"g\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}}}}}}}}}}}},\"docs\":{}}},\"5\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"7\":{\"docs\":{},\"i\":{\"docs\":{},\"k\":{\"docs\":{},\"/\":{\"docs\":{},\"u\":{\"docs\":{},\"w\":{\"docs\":{},\"m\":{\"docs\":{},\"r\":{\"docs\":{},\"o\":{\"docs\":{},\"f\":{\"docs\":{},\"z\":{\"2\":{\"docs\":{},\"r\":{\"5\":{\"docs\":{},\"x\":{\"docs\":{},\"h\":{\"docs\":{},\"i\":{\"docs\":{},\"a\":{\"docs\":{},\"q\":{\"docs\":{},\"x\":{\"docs\":{},\"g\":{\"docs\":{},\"d\":{\"docs\":{},\"g\":{\"docs\":{},\"n\":{\"docs\":{},\"c\":{\"2\":{\"docs\":{},\"d\":{\"docs\":{},\"f\":{\"6\":{\"4\":{\"docs\":{},\"g\":{\"docs\":{},\"z\":{\"docs\":{},\"x\":{\"docs\":{},\"n\":{\"docs\":{},\"t\":{\"docs\":{},\"m\":{\"docs\":{},\"z\":{\"docs\":{},\"v\":{\"docs\":{},\"h\":{\"docs\":{},\"t\":{\"docs\":{},\"g\":{\"docs\":{},\"q\":{\"7\":{\"docs\":{},\"m\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"8\":{\"docs\":{},\"x\":{\"docs\":{},\"u\":{\"docs\":{},\"h\":{\"docs\":{},\"p\":{\"docs\":{},\"v\":{\"docs\":{},\"/\":{\"docs\":{},\"i\":{\"docs\":{},\"h\":{\"docs\":{},\"a\":{\"docs\":{},\"_\":{\"docs\":{},\"k\":{\"docs\":{},\"l\":{\"1\":{\"docs\":{},\"s\":{\"docs\":{},\"z\":{\"docs\":{},\"f\":{\"docs\":{},\"m\":{\"docs\":{},\"d\":{\"docs\":{},\"h\":{\"7\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"docs\":{},\"z\":{\"docs\":{},\"c\":{\"docs\":{},\"a\":{\"docs\":{},\"o\":{\"docs\":{},\"q\":{\"docs\":{},\"n\":{\"6\":{\"4\":{\"docs\":{},\"f\":{\"docs\":{},\"v\":{\"docs\":{},\"v\":{\"docs\":{},\"l\":{\"3\":{\"docs\":{},\"m\":{\"docs\":{},\"y\":{\"docs\":{},\"z\":{\"docs\":{},\"r\":{\"2\":{\"0\":{\"docs\":{},\"l\":{\"docs\":{},\"m\":{\"docs\":{},\"x\":{\"docs\":{},\"k\":{\"docs\":{},\"i\":{\"docs\":{},\"u\":{\"docs\":{},\"a\":{\"2\":{\"docs\":{},\"q\":{\"docs\":{},\"r\":{\"7\":{\"docs\":{},\"r\":{\"docs\":{},\"g\":{\"docs\":{},\"j\":{\"docs\":{},\"v\":{\"docs\":{},\"q\":{\"docs\":{},\"m\":{\"docs\":{},\"s\":{\"8\":{\"docs\":{},\"k\":{\"6\":{\"docs\":{},\"g\":{\"docs\":{},\"q\":{\"docs\":{},\"i\":{\"6\":{\"docs\":{},\"v\":{\"docs\":{},\"h\":{\"docs\":{},\"w\":{\"docs\":{},\"j\":{\"docs\":{},\"u\":{\"docs\":{},\"q\":{\"docs\":{},\"m\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"c\":{\"docs\":{},\"t\":{\"docs\":{},\"w\":{\"docs\":{},\"x\":{\"docs\":{},\"b\":{\"6\":{\"docs\":{},\"k\":{\"docs\":{},\"d\":{\"docs\":{},\"q\":{\"docs\":{},\"y\":{\"docs\":{},\"y\":{\"docs\":{},\"b\":{\"docs\":{},\"h\":{\"docs\":{},\"d\":{\"docs\":{},\"s\":{\"docs\":{},\"r\":{\"1\":{\"docs\":{},\"z\":{\"docs\":{},\"g\":{\"docs\":{},\"i\":{\"docs\":{},\"a\":{\"docs\":{},\"d\":{\"docs\":{},\"o\":{\"docs\":{},\"t\":{\"docs\":{},\"c\":{\"docs\":{},\"m\":{\"5\":{\"docs\":{},\"w\":{\"docs\":{},\"b\":{\"docs\":{},\"e\":{\"3\":{\"6\":{\"docs\":{},\"x\":{\"docs\":{},\"n\":{\"9\":{\"docs\":{},\"c\":{\"docs\":{},\"c\":{\"3\":{\"4\":{\"docs\":{},\"i\":{\"docs\":{},\"t\":{\"docs\":{},\"m\":{\"7\":{\"docs\":{},\"z\":{\"docs\":{},\"o\":{\"docs\":{},\"y\":{\"docs\":{},\"d\":{\"docs\":{},\"d\":{\"docs\":{},\"j\":{\"docs\":{},\"j\":{\"docs\":{},\"h\":{\"docs\":{},\"y\":{\"docs\":{},\"h\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}},\"docs\":{}}}}},\"docs\":{}},\"docs\":{}}}},\"docs\":{}}}},\"docs\":{}},\"docs\":{}}}}},\"docs\":{}}}}}}}}}}},\"docs\":{}}}}}}}}}}}},\"docs\":{}}}}}}}}}}}}}}}},\"docs\":{}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}},\"docs\":{}}}},\"docs\":{}}}}}}}}},\"docs\":{}},\"docs\":{}}}}}},\"docs\":{}}}}}},\"docs\":{}},\"docs\":{}}}}}}}}}},\"docs\":{}}}}}}}},\"docs\":{}}}}}}}}}}}}}},\"docs\":{}}}}},\"docs\":{}}}}}}}}}}}}}},\"docs\":{}},\"docs\":{}}}},\"docs\":{}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}},\"docs\":{},\"c\":{\"docs\":{},\"l\":{\"docs\":{},\"i\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.03940886699507389},\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}},\"/\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"l\":{\"docs\":{},\"e\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}}}}},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"说\":{\"docs\":{},\"明\":{\"docs\":{},\"书\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}}},\"是\":{\"docs\":{},\"一\":{\"docs\":{},\"款\":{\"docs\":{},\"用\":{\"docs\":{},\"于\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"的\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"行\":{\"docs\":{},\"工\":{\"docs\":{},\"具\":{\"docs\":{},\"，\":{\"docs\":{},\"基\":{\"docs\":{},\"于\":{\"docs\":{},\".\":{\"docs\":{},\"n\":{\"docs\":{},\"e\":{\"docs\":{},\"t\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}},\".\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"g\":{\"docs\":{},\"s\":{\"docs\":{},\".\":{\"docs\":{},\"t\":{\"docs\":{},\"x\":{\"docs\":{},\"t\":{\"docs\":{},\"，\":{\"docs\":{},\"存\":{\"docs\":{},\"一\":{\"docs\":{},\"些\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"行\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"，\":{\"docs\":{},\"举\":{\"docs\":{},\"个\":{\"docs\":{},\"例\":{\"docs\":{},\"子\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}},\"，\":{\"docs\":{},\"便\":{\"docs\":{},\"能\":{\"docs\":{},\"双\":{\"docs\":{},\"击\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"且\":{\"docs\":{},\"能\":{\"docs\":{},\"保\":{\"docs\":{},\"证\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"会\":{\"docs\":{},\"按\":{\"docs\":{},\"照\":{\"docs\":{},\"一\":{\"docs\":{},\"定\":{\"docs\":{},\"的\":{\"docs\":{},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"行\":{\"docs\":{},\"为\":{\"docs\":{},\"去\":{\"docs\":{},\"正\":{\"docs\":{},\"确\":{\"docs\":{},\"地\":{\"docs\":{},\"工\":{\"docs\":{},\"作\":{\"docs\":{},\"，\":{\"docs\":{},\"像\":{\"docs\":{},\"你\":{\"docs\":{},\"期\":{\"docs\":{},\"待\":{\"docs\":{},\"的\":{\"docs\":{},\"那\":{\"docs\":{},\"样\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"h\":{\"docs\":{},\"a\":{\"docs\":{},\"c\":{\"docs\":{},\"h\":{\"docs\":{},\"a\":{\"2\":{\"0\":{\"docs\":{},\"k\":{\"docs\":{},\"e\":{\"docs\":{},\"y\":{\"docs\":{},\"b\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"6\":{\"4\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}},\"docs\":{}},\"docs\":{}}}}}}}},\"n\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"c\":{\"docs\":{},\"e\":{\"docs\":{},\"b\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"6\":{\"4\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}},\"docs\":{}},\"docs\":{}}}}}}}}}}},\"docs\":{}},\"docs\":{}}}}},\"r\":{\"docs\":{},\"o\":{\"docs\":{},\"m\":{\"docs\":{},\"e\":{\"docs\":{},\"/\":{\"6\":{\"3\":{\"docs\":{},\".\":{\"0\":{\"docs\":{},\".\":{\"3\":{\"2\":{\"3\":{\"9\":{\"docs\":{},\".\":{\"1\":{\"3\":{\"2\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}}}}}},\"o\":{\"docs\":{},\"o\":{\"docs\":{},\"k\":{\"docs\":{},\"i\":{\"docs\":{},\"e\":{\"docs\":{},\":\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"docs\":{},\"s\":{\"docs\":{},\"s\":{\"docs\":{},\"i\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"i\":{\"docs\":{},\"d\":{\"docs\":{},\"=\":{\"1\":{\"2\":{\"3\":{\"6\":{\"9\":{\"8\":{\"3\":{\"4\":{\"2\":{\"8\":{\"docs\":{},\";\":{\"docs\":{},\"c\":{\"docs\":{},\"n\":{\"docs\":{},\"s\":{\"docs\":{},\"=\":{\"docs\":{},\"x\":{\"docs\":{},\"p\":{\"docs\":{},\"o\":{\"docs\":{},\"p\":{\"docs\":{},\"q\":{\"docs\":{},\"w\":{\"docs\":{},\"e\":{\"3\":{\"0\":{\"5\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}}}}}}},\"f\":{\"docs\":{},\"r\":{\"docs\":{},\"a\":{\"docs\":{},\"m\":{\"docs\":{},\"e\":{\"docs\":{},\"w\":{\"docs\":{},\"o\":{\"docs\":{},\"r\":{\"docs\":{},\"k\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.10526315789473684}}}}}}}}}}},\"h\":{\"docs\":{},\"t\":{\"docs\":{},\"t\":{\"docs\":{},\"p\":{\"docs\":{},\"s\":{\"docs\":{},\":\":{\"docs\":{},\"/\":{\"docs\":{},\"/\":{\"docs\":{},\"g\":{\"docs\":{},\"i\":{\"docs\":{},\"t\":{\"docs\":{},\"h\":{\"docs\":{},\"u\":{\"docs\":{},\"b\":{\"docs\":{},\".\":{\"docs\":{},\"c\":{\"docs\":{},\"o\":{\"docs\":{},\"m\":{\"docs\":{},\"/\":{\"docs\":{},\"n\":{\"docs\":{},\"i\":{\"docs\":{},\"l\":{\"docs\":{},\"a\":{\"docs\":{},\"o\":{\"docs\":{},\"d\":{\"docs\":{},\"a\":{\"docs\":{},\"/\":{\"docs\":{},\"n\":{\"docs\":{},\"_\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"d\":{\"docs\":{},\"l\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}},\":\":{\"docs\":{},\"/\":{\"docs\":{},\"/\":{\"1\":{\"2\":{\"7\":{\"docs\":{},\".\":{\"0\":{\"docs\":{},\".\":{\"0\":{\"docs\":{},\".\":{\"1\":{\"docs\":{},\":\":{\"8\":{\"0\":{\"8\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}}},\"docs\":{}}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}},\"e\":{\"docs\":{},\"a\":{\"docs\":{},\"d\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.009852216748768473}}}}}},\"l\":{\"docs\":{},\"p\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}},\"n\":{\"docs\":{},\"_\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"d\":{\"docs\":{},\"l\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.10526315789473684},\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.034482758620689655}}}}},\"docs\":{}}},\"docs\":{}}},\"i\":{\"docs\":{},\"l\":{\"docs\":{},\"a\":{\"docs\":{},\"o\":{\"docs\":{},\"d\":{\"docs\":{},\"a\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}}}},\"o\":{\"docs\":{},\"m\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"g\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}},\"p\":{\"docs\":{},\"r\":{\"docs\":{},\"o\":{\"docs\":{},\"x\":{\"docs\":{},\"i\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.009852216748768473}}},\"y\":{\"docs\":{},\"时\":{\"docs\":{},\"，\":{\"docs\":{},\"此\":{\"docs\":{},\"处\":{\"docs\":{},\"设\":{\"docs\":{},\"置\":{\"docs\":{},\"将\":{\"docs\":{},\"不\":{\"docs\":{},\"生\":{\"docs\":{},\"效\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}},\"t\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}},\"w\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"d\":{\"docs\":{},\"o\":{\"docs\":{},\"w\":{\"docs\":{},\"s\":{\"7\":{\"docs\":{},\"以\":{\"docs\":{},\"上\":{\"docs\":{},\"系\":{\"docs\":{},\"统\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}}},\"docs\":{}}}}}}},\"f\":{\"docs\":{},\"e\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\"w\":{\"docs\":{},\"f\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"x\":{\"docs\":{},\"a\":{\"4\":{\"docs\":{},\"i\":{\"docs\":{},\"j\":{\"docs\":{},\"p\":{\"docs\":{},\"z\":{\"docs\":{},\"c\":{\"docs\":{},\"x\":{\"docs\":{},\"y\":{\"docs\":{},\"t\":{\"docs\":{},\"y\":{\"docs\":{},\"c\":{\"docs\":{},\"v\":{\"docs\":{},\"c\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"docs\":{},\"f\":{\"docs\":{},\"i\":{\"docs\":{},\"y\":{\"docs\":{},\"b\":{\"docs\":{},\"d\":{\"docs\":{},\"d\":{\"docs\":{},\"i\":{\"docs\":{},\"y\":{\"docs\":{},\"g\":{\"docs\":{},\"q\":{\"docs\":{},\"n\":{\"docs\":{},\"j\":{\"docs\":{},\"i\":{\"docs\":{},\"s\":{\"docs\":{},\"i\":{\"docs\":{},\"j\":{\"docs\":{},\"s\":{\"docs\":{},\"b\":{\"docs\":{},\"u\":{\"docs\":{},\"_\":{\"docs\":{},\"m\":{\"0\":{\"docs\":{},\"/\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}}}}}}}}}},\"o\":{\"docs\":{},\"r\":{\"docs\":{},\"k\":{\"docs\":{},\"d\":{\"docs\":{},\"i\":{\"docs\":{},\"r\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.012315270935960592}}}}}}},\"w\":{\"6\":{\"4\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}},\"docs\":{}},\"docs\":{}}}},\"|\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}},\"发\":{\"docs\":{},\"布\":{\"docs\":{},\"页\":{\"docs\":{},\"面\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}},\"或\":{\"docs\":{},\"我\":{\"docs\":{},\"编\":{\"docs\":{},\"译\":{\"docs\":{},\"的\":{\"docs\":{},\"精\":{\"docs\":{},\"简\":{\"docs\":{},\"版\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}}}}}},\"所\":{\"docs\":{},\"需\":{\"docs\":{},\"运\":{\"docs\":{},\"行\":{\"docs\":{},\"时\":{\"docs\":{},\"环\":{\"docs\":{},\"境\":{\"docs\":{},\"：\":{\"docs\":{},\".\":{\"docs\":{},\"n\":{\"docs\":{},\"e\":{\"docs\":{},\"t\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}}}}}}}}}},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"依\":{\"docs\":{},\"赖\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"将\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"放\":{\"docs\":{},\"在\":{\"docs\":{},\"了\":{\"docs\":{},\"e\":{\"docs\":{},\"x\":{\"docs\":{},\"e\":{\"docs\":{},\"同\":{\"docs\":{},\"目\":{\"docs\":{},\"录\":{\"docs\":{},\"的\":{\"docs\":{},\"d\":{\"docs\":{},\"o\":{\"docs\":{},\"w\":{\"docs\":{},\"n\":{\"docs\":{},\"l\":{\"docs\":{},\"o\":{\"docs\":{},\"a\":{\"docs\":{},\"d\":{\"docs\":{},\"s\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"夹\":{\"docs\":{},\"中\":{\"docs\":{},\"，\":{\"docs\":{},\"将\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"运\":{\"docs\":{},\"行\":{\"docs\":{},\"日\":{\"docs\":{},\"志\":{\"docs\":{},\"信\":{\"docs\":{},\"息\":{\"docs\":{},\"放\":{\"docs\":{},\"在\":{\"docs\":{},\"了\":{\"docs\":{},\"l\":{\"docs\":{},\"o\":{\"docs\":{},\"g\":{\"docs\":{},\"s\":{\"docs\":{},\"目\":{\"docs\":{},\"录\":{\"docs\":{},\"中\":{\"docs\":{},\"。\":{\"docs\":{\"Introductory.html\":{\"ref\":\"Introductory.html\",\"tf\":0.1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"的\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"线\":{\"docs\":{},\"程\":{\"docs\":{},\"数\":{\"docs\":{},\"可\":{\"docs\":{},\"由\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}},\"在\":{\"docs\":{},\"启\":{\"docs\":{},\"动\":{\"docs\":{},\"时\":{\"docs\":{},\"会\":{\"docs\":{},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"从\":{\"docs\":{},\"剪\":{\"docs\":{},\"贴\":{\"docs\":{},\"板\":{\"docs\":{},\"中\":{\"docs\":{},\"寻\":{\"docs\":{},\"找\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"docs\":{},\"，\":{\"docs\":{},\"贴\":{\"docs\":{},\"入\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"地\":{\"docs\":{},\"址\":{\"docs\":{},\"文\":{\"docs\":{},\"本\":{\"docs\":{},\"框\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}},\"界\":{\"docs\":{},\"面\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667},\"M3U8URL2File.html\":{\"ref\":\"M3U8URL2File.html\",\"tf\":0.3333333333333333}}}}}},\"简\":{\"docs\":{},\"介\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":10},\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}},\"系\":{\"docs\":{},\"统\":{\"docs\":{},\"支\":{\"docs\":{},\"持\":{\"docs\":{\"./\":{\"ref\":\"./\",\"tf\":0.05263157894736842}}}}}},\"*\":{\"docs\":{},\".\":{\"docs\":{},\"l\":{\"docs\":{},\"o\":{\"docs\":{},\"g\":{\"docs\":{\"Introductory.html\":{\"ref\":\"Introductory.html\",\"tf\":0.1}}}}}}},\".\":{\"docs\":{\"Introductory.html\":{\"ref\":\"Introductory.html\",\"tf\":0.1}},\".\":{\"docs\":{},\".\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.012315270935960592}}}}},\"d\":{\"docs\":{},\"o\":{\"docs\":{},\"w\":{\"docs\":{},\"n\":{\"docs\":{},\"l\":{\"docs\":{},\"o\":{\"docs\":{},\"a\":{\"docs\":{},\"d\":{\"docs\":{\"Introductory.html\":{\"ref\":\"Introductory.html\",\"tf\":0.1}},\"r\":{\"docs\":{},\"a\":{\"docs\":{},\"n\":{\"docs\":{},\"g\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.024630541871921183}}}}}}}}}}}}},\"i\":{\"docs\":{},\"s\":{\"docs\":{},\"a\":{\"docs\":{},\"b\":{\"docs\":{},\"l\":{\"docs\":{},\"e\":{\"docs\":{},\"d\":{\"docs\":{},\"a\":{\"docs\":{},\"t\":{\"docs\":{},\"e\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"f\":{\"docs\":{},\"o\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.009852216748768473}}}}}}}}}},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"t\":{\"docs\":{},\"e\":{\"docs\":{},\"g\":{\"docs\":{},\"r\":{\"docs\":{},\"i\":{\"docs\":{},\"t\":{\"docs\":{},\"y\":{\"docs\":{},\"c\":{\"docs\":{},\"h\":{\"docs\":{},\"e\":{\"docs\":{},\"c\":{\"docs\":{},\"k\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}}}}}}}}}}}}}},\"p\":{\"docs\":{},\"l\":{\"docs\":{},\"a\":{\"docs\":{},\"y\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}}},\"l\":{\"docs\":{},\"o\":{\"docs\":{},\"g\":{\"docs\":{\"Introductory.html\":{\"ref\":\"Introductory.html\",\"tf\":0.1}}}},\"a\":{\"docs\":{},\"v\":{\"docs\":{},\"f\":{\"5\":{\"8\":{\"docs\":{},\".\":{\"2\":{\"0\":{\"docs\":{},\".\":{\"1\":{\"0\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}}},\"i\":{\"docs\":{},\"v\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"c\":{\"docs\":{},\"d\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}}}}}},\"└\":{\"docs\":{},\"─\":{\"docs\":{},\"─\":{\"docs\":{\"Introductory.html\":{\"ref\":\"Introductory.html\",\"tf\":0.2}}}}},\"├\":{\"docs\":{},\"─\":{\"docs\":{},\"─\":{\"docs\":{\"Introductory.html\":{\"ref\":\"Introductory.html\",\"tf\":0.1}}}}},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"入\":{\"docs\":{},\"门\":{\"docs\":{\"Introductory.html\":{\"ref\":\"Introductory.html\",\"tf\":10}}}},\"b\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"6\":{\"4\":{\"docs\":{},\"字\":{\"docs\":{},\"符\":{\"docs\":{},\"串\":{\"docs\":{},\"定\":{\"docs\":{},\"义\":{\"docs\":{},\"a\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"docs\":{}},\"docs\":{}}}}},\"h\":{\"docs\":{},\"e\":{\"docs\":{},\"x\":{\"docs\":{},\"字\":{\"docs\":{},\"符\":{\"docs\":{},\"串\":{\"docs\":{},\"定\":{\"docs\":{},\"义\":{\"docs\":{},\"a\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}},\"|\":{\"docs\":{},\"分\":{\"docs\":{},\"割\":{\"docs\":{},\"不\":{\"docs\":{},\"同\":{\"docs\":{},\"的\":{\"docs\":{},\"k\":{\"docs\":{},\"e\":{\"docs\":{},\"y\":{\"docs\":{},\"&\":{\"docs\":{},\"v\":{\"docs\":{},\"a\":{\"docs\":{},\"l\":{\"docs\":{},\"u\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"行\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}},\"外\":{\"docs\":{},\"部\":{\"1\":{\"6\":{\"docs\":{},\"字\":{\"docs\":{},\"节\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"定\":{\"docs\":{},\"义\":{\"docs\":{},\"a\":{\"docs\":{},\"e\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}},\"docs\":{}},\"docs\":{},\"j\":{\"docs\":{},\"s\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"定\":{\"docs\":{},\"义\":{\"docs\":{},\"混\":{\"docs\":{},\"流\":{\"docs\":{},\"选\":{\"docs\":{},\"项\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"后\":{\"docs\":{},\"，\":{\"docs\":{},\"合\":{\"docs\":{},\"并\":{\"docs\":{},\"生\":{\"docs\":{},\"成\":{\"docs\":{},\"的\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"4\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"将\":{\"docs\":{},\"能\":{\"docs\":{},\"够\":{\"docs\":{},\"在\":{\"docs\":{},\"网\":{\"docs\":{},\"络\":{\"docs\":{},\"传\":{\"docs\":{},\"输\":{\"docs\":{},\"时\":{\"docs\":{},\"边\":{\"docs\":{},\"下\":{\"docs\":{},\"边\":{\"docs\":{},\"看\":{\"docs\":{},\"，\":{\"docs\":{},\"适\":{\"docs\":{},\"用\":{\"docs\":{},\"于\":{\"docs\":{},\"流\":{\"docs\":{},\"媒\":{\"docs\":{},\"体\":{\"docs\":{},\"。\":{\"docs\":{},\"缺\":{\"docs\":{},\"点\":{\"docs\":{},\"是\":{\"docs\":{},\"合\":{\"docs\":{},\"并\":{\"docs\":{},\"时\":{\"docs\":{},\"间\":{\"docs\":{},\"会\":{\"docs\":{},\"变\":{\"docs\":{},\"慢\":{\"docs\":{},\"。\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"无\":{\"docs\":{},\"需\":{\"docs\":{},\"任\":{\"docs\":{},\"何\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}}}}}}},\"所\":{\"docs\":{},\"有\":{\"docs\":{},\"关\":{\"docs\":{},\"于\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"4\":{\"docs\":{},\"合\":{\"docs\":{},\"并\":{\"docs\":{},\"的\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"将\":{\"docs\":{},\"会\":{\"docs\":{},\"失\":{\"docs\":{},\"效\":{\"docs\":{},\"，\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"将\":{\"docs\":{},\"采\":{\"docs\":{},\"用\":{\"docs\":{},\"二\":{\"docs\":{},\"进\":{\"docs\":{},\"制\":{\"docs\":{},\"合\":{\"docs\":{},\"并\":{\"docs\":{},\"，\":{\"docs\":{},\"即\":{\"docs\":{},\"直\":{\"docs\":{},\"接\":{\"docs\":{},\"拼\":{\"docs\":{},\"接\":{\"docs\":{},\"服\":{\"docs\":{},\"务\":{\"docs\":{},\"器\":{\"docs\":{},\"提\":{\"docs\":{},\"供\":{\"docs\":{},\"的\":{\"docs\":{},\"r\":{\"docs\":{},\"a\":{\"docs\":{},\"w\":{\"docs\":{},\"流\":{\"docs\":{},\"，\":{\"docs\":{},\"不\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"f\":{\"docs\":{},\"f\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"docs\":{},\"e\":{\"docs\":{},\"g\":{\"docs\":{},\"进\":{\"docs\":{},\"行\":{\"docs\":{},\"混\":{\"docs\":{},\"流\":{\"docs\":{},\"。\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"无\":{\"docs\":{},\"需\":{\"docs\":{},\"任\":{\"docs\":{},\"何\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}}}}}},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"将\":{\"docs\":{},\"只\":{\"docs\":{},\"分\":{\"docs\":{},\"析\":{\"docs\":{},\"用\":{\"docs\":{},\"户\":{\"docs\":{},\"输\":{\"docs\":{},\"入\":{\"docs\":{},\"的\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"而\":{\"docs\":{},\"不\":{\"docs\":{},\"进\":{\"docs\":{},\"行\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"。\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"无\":{\"docs\":{},\"需\":{\"docs\":{},\"任\":{\"docs\":{},\"何\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}},\"合\":{\"docs\":{},\"并\":{\"docs\":{},\"音\":{\"docs\":{},\"频\":{\"docs\":{},\"轨\":{\"docs\":{},\"道\":{\"docs\":{},\"。\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"无\":{\"docs\":{},\"需\":{\"docs\":{},\"任\":{\"docs\":{},\"何\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"j\":{\"docs\":{},\"a\":{\"docs\":{},\"v\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"c\":{\"docs\":{},\"r\":{\"docs\":{},\"i\":{\"docs\":{},\"p\":{\"docs\":{},\"t\":{\"docs\":{},\"获\":{\"docs\":{},\"取\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{\"GetM3u8.html\":{\"ref\":\"GetM3u8.html\",\"tf\":0.5}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}},\"让\":{\"docs\":{},\"我\":{\"docs\":{},\"们\":{\"docs\":{},\"开\":{\"docs\":{},\"始\":{\"docs\":{},\"吧\":{\"docs\":{\"Introductory.html\":{\"ref\":\"Introductory.html\",\"tf\":0.1}}}}}}}},\"首\":{\"docs\":{},\"先\":{\"docs\":{},\"，\":{\"docs\":{},\"最\":{\"docs\":{},\"简\":{\"docs\":{},\"单\":{\"docs\":{},\"的\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"方\":{\"docs\":{},\"式\":{\"docs\":{},\"是\":{\"docs\":{},\"直\":{\"docs\":{},\"接\":{\"docs\":{},\"双\":{\"docs\":{},\"击\":{\"docs\":{},\"e\":{\"docs\":{},\"x\":{\"docs\":{},\"e\":{\"docs\":{},\"，\":{\"docs\":{},\"将\":{\"docs\":{},\"你\":{\"docs\":{},\"要\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"的\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"或\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"链\":{\"docs\":{},\"接\":{\"docs\":{},\"复\":{\"docs\":{},\"制\":{\"docs\":{},\"进\":{\"docs\":{},\"去\":{\"docs\":{},\"，\":{\"docs\":{},\"然\":{\"docs\":{},\"后\":{\"docs\":{},\"按\":{\"docs\":{},\"下\":{\"docs\":{},\"回\":{\"docs\":{},\"车\":{\"docs\":{},\"键\":{\"docs\":{},\"。\":{\"docs\":{},\"就\":{\"docs\":{},\"像\":{\"docs\":{},\"这\":{\"docs\":{},\"样\":{\"docs\":{},\"：\":{\"docs\":{},\"正\":{\"docs\":{},\"常\":{\"docs\":{},\"情\":{\"docs\":{},\"况\":{\"docs\":{},\"下\":{\"docs\":{},\"，\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"将\":{\"docs\":{},\"产\":{\"docs\":{},\"生\":{\"docs\":{},\"如\":{\"docs\":{},\"下\":{\"docs\":{},\"的\":{\"docs\":{},\"目\":{\"docs\":{},\"录\":{\"docs\":{},\"结\":{\"docs\":{},\"构\":{\"docs\":{},\"：\":{\"docs\":{\"Introductory.html\":{\"ref\":\"Introductory.html\",\"tf\":0.1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}},\"第\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"是\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}},\"\\\"\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.007389162561576354}}}},\"a\":{\"docs\":{},\"u\":{\"docs\":{},\"d\":{\"docs\":{},\"i\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"a\":{\"docs\":{},\"m\":{\"docs\":{},\"e\":{\"docs\":{},\"\\\"\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"\\\"\":{\"docs\":{},\"\\\"\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}},\"c\":{\"docs\":{},\":\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"u\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"s\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"n\":{\"docs\":{},\"i\":{\"docs\":{},\"l\":{\"docs\":{},\"a\":{\"docs\":{},\"o\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"d\":{\"docs\":{},\"e\":{\"docs\":{},\"s\":{\"docs\":{},\"k\":{\"docs\":{},\"t\":{\"docs\":{},\"o\":{\"docs\":{},\"p\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"a\":{\"docs\":{},\"e\":{\"docs\":{},\"s\":{\"docs\":{},\".\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}},\"docs\":{}}},\"docs\":{}}}}}},\"k\":{\"docs\":{},\"e\":{\"docs\":{},\"y\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"m\":{\"docs\":{},\".\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}}},\"docs\":{}}}},\"r\":{\"docs\":{},\"a\":{\"docs\":{},\"w\":{\"docs\":{},\".\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}}},\"docs\":{}}}}}},\"小\":{\"docs\":{},\"猪\":{\"docs\":{},\"佩\":{\"docs\":{},\"奇\":{\"docs\":{},\".\":{\"docs\":{},\"j\":{\"docs\":{},\"s\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}},\"第\":{\"docs\":{},\"一\":{\"docs\":{},\"集\":{\"docs\":{},\"(\":{\"docs\":{},\"m\":{\"docs\":{},\"g\":{\"docs\":{},\"t\":{\"docs\":{},\"v\":{\"docs\":{},\")\":{\"docs\":{},\".\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}}},\"docs\":{}}}}}}}}},\".\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.014778325123152709}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}},\"o\":{\"docs\":{},\"w\":{\"docs\":{},\"n\":{\"docs\":{},\"l\":{\"docs\":{},\"o\":{\"docs\":{},\"a\":{\"docs\":{},\"d\":{\"docs\":{},\"s\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"，\":{\"docs\":{},\"这\":{\"docs\":{},\"在\":{\"docs\":{},\"没\":{\"docs\":{},\"有\":{\"docs\":{},\"g\":{\"docs\":{},\"u\":{\"docs\":{},\"i\":{\"docs\":{},\"的\":{\"docs\":{},\"情\":{\"docs\":{},\"况\":{\"docs\":{},\"下\":{\"docs\":{},\"将\":{\"docs\":{},\"十\":{\"docs\":{},\"分\":{\"docs\":{},\"有\":{\"docs\":{},\"用\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"o\":{\"docs\":{},\"m\":{\"docs\":{},\"m\":{\"docs\":{},\"e\":{\"docs\":{},\"n\":{\"docs\":{},\"t\":{\"docs\":{},\"\\\"\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"\\\"\":{\"docs\":{},\"我\":{\"docs\":{},\"爱\":{\"docs\":{},\"小\":{\"docs\":{},\"猪\":{\"docs\":{},\"佩\":{\"docs\":{},\"奇\":{\"docs\":{},\"\\\"\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}},\"o\":{\"docs\":{},\"k\":{\"docs\":{},\"i\":{\"docs\":{},\"e\":{\"docs\":{},\":\":{\"docs\":{},\"m\":{\"docs\":{},\"q\":{\"docs\":{},\"g\":{\"docs\":{},\"u\":{\"docs\":{},\"i\":{\"docs\":{},\"d\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"s\":{\"docs\":{},\"e\":{\"docs\":{},\"s\":{\"docs\":{},\"s\":{\"docs\":{},\"i\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"i\":{\"docs\":{},\"d\":{\"docs\":{},\"=\":{\"1\":{\"2\":{\"3\":{\"6\":{\"9\":{\"8\":{\"3\":{\"4\":{\"2\":{\"8\":{\"docs\":{},\";\":{\"docs\":{},\"c\":{\"docs\":{},\"n\":{\"docs\":{},\"s\":{\"docs\":{},\"=\":{\"docs\":{},\"x\":{\"docs\":{},\"p\":{\"docs\":{},\"o\":{\"docs\":{},\"p\":{\"docs\":{},\"q\":{\"docs\":{},\"w\":{\"docs\":{},\"e\":{\"3\":{\"0\":{\"5\":{\"docs\":{},\"|\":{\"docs\":{},\"u\":{\"docs\":{},\"s\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}}}}},\"p\":{\"docs\":{},\"y\":{\"docs\":{},\"r\":{\"docs\":{},\"i\":{\"docs\":{},\"g\":{\"docs\":{},\"h\":{\"docs\":{},\"t\":{\"docs\":{},\"\\\"\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"\\\"\":{\"docs\":{},\"\\\"\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}},\"d\":{\"docs\":{},\":\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"m\":{\"docs\":{},\"y\":{\"docs\":{},\"v\":{\"docs\":{},\"i\":{\"docs\":{},\"d\":{\"docs\":{},\"e\":{\"docs\":{},\"o\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}},\"i\":{\"5\":{\"docs\":{},\"r\":{\"docs\":{},\"z\":{\"docs\":{},\"x\":{\"docs\":{},\"k\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"a\":{\"docs\":{},\"=\":{\"docs\":{},\"=\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"e\":{\"docs\":{},\"n\":{\"docs\":{},\"c\":{\"docs\":{},\"o\":{\"docs\":{},\"d\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"g\":{\"docs\":{},\"t\":{\"docs\":{},\"o\":{\"docs\":{},\"o\":{\"docs\":{},\"l\":{\"docs\":{},\"\\\"\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}},\"f\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"t\":{\"docs\":{},\"\\\"\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"\\\"\":{\"docs\":{},\"t\":{\"docs\":{},\"r\":{\"docs\":{},\"u\":{\"docs\":{},\"e\":{\"docs\":{},\"\\\"\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}},\"h\":{\"docs\":{},\"t\":{\"docs\":{},\"t\":{\"docs\":{},\"p\":{\"docs\":{},\":\":{\"docs\":{},\"/\":{\"docs\":{},\"/\":{\"1\":{\"2\":{\"7\":{\"docs\":{},\".\":{\"0\":{\"docs\":{},\".\":{\"0\":{\"docs\":{},\".\":{\"1\":{\"docs\":{},\":\":{\"8\":{\"0\":{\"8\":{\"0\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}}},\"docs\":{}}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{},\"x\":{\"docs\":{},\".\":{\"docs\":{},\"x\":{\"docs\":{},\"/\":{\"1\":{\"docs\":{},\".\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"将\":{\"docs\":{},\"成\":{\"docs\":{},\"为\":{\"docs\":{},\"n\":{\"docs\":{},\"_\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"d\":{\"docs\":{},\"l\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}},\"docs\":{}}},\"docs\":{}}}},\"docs\":{}}}}}}}},\"s\":{\"docs\":{},\":\":{\"docs\":{},\"/\":{\"docs\":{},\"/\":{\"docs\":{},\"a\":{\"docs\":{},\"p\":{\"docs\":{},\"d\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"m\":{\"docs\":{},\"o\":{\"docs\":{},\"v\":{\"docs\":{},\"i\":{\"docs\":{},\"e\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\".\":{\"docs\":{},\"t\":{\"docs\":{},\"c\":{\"docs\":{},\".\":{\"docs\":{},\"q\":{\"docs\":{},\"q\":{\"docs\":{},\".\":{\"docs\":{},\"c\":{\"docs\":{},\"o\":{\"docs\":{},\"m\":{\"docs\":{},\"/\":{\"docs\":{},\"p\":{\"0\":{\"0\":{\"2\":{\"7\":{\"docs\":{},\"j\":{\"docs\":{},\"b\":{\"docs\":{},\"w\":{\"docs\":{},\"y\":{\"docs\":{},\"e\":{\"1\":{\"docs\":{},\".\":{\"3\":{\"2\":{\"1\":{\"0\":{\"0\":{\"4\":{\"docs\":{},\".\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\".\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"?\":{\"docs\":{},\"v\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"=\":{\"4\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"m\":{\"docs\":{},\"p\":{\"4\":{\"docs\":{},\"\\\"\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"docs\":{}},\"u\":{\"docs\":{},\"x\":{\"docs\":{},\"f\":{\"docs\":{},\"o\":{\"docs\":{},\"r\":{\"docs\":{},\"m\":{\"docs\":{},\"a\":{\"docs\":{},\"t\":{\"docs\":{},\"\\\"\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"\\\"\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"4\":{\"docs\":{},\"\\\"\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"docs\":{}}}}}}}}}}}}}}},\"p\":{\"docs\":{},\"o\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"\\\"\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"\\\"\":{\"docs\":{},\"c\":{\"docs\":{},\":\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"u\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"s\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"n\":{\"docs\":{},\"i\":{\"docs\":{},\"l\":{\"docs\":{},\"a\":{\"docs\":{},\"o\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"d\":{\"docs\":{},\"e\":{\"docs\":{},\"s\":{\"docs\":{},\"k\":{\"docs\":{},\"t\":{\"docs\":{},\"o\":{\"docs\":{},\"p\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"小\":{\"docs\":{},\"猪\":{\"docs\":{},\"佩\":{\"docs\":{},\"奇\":{\"docs\":{},\".\":{\"docs\":{},\"j\":{\"docs\":{},\"p\":{\"docs\":{},\"g\":{\"docs\":{},\"\\\"\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"t\":{\"docs\":{},\"i\":{\"docs\":{},\"t\":{\"docs\":{},\"l\":{\"docs\":{},\"e\":{\"docs\":{},\"\\\"\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"\\\"\":{\"docs\":{},\"小\":{\"docs\":{},\"猪\":{\"docs\":{},\"佩\":{\"docs\":{},\"奇\":{\"docs\":{},\"第\":{\"docs\":{},\"一\":{\"docs\":{},\"集\":{\"docs\":{},\"\\\"\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}},\"r\":{\"docs\":{},\"u\":{\"docs\":{},\"e\":{\"docs\":{},\"\\\"\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}},\"小\":{\"docs\":{},\"猪\":{\"docs\":{},\"佩\":{\"docs\":{},\"奇\":{\"docs\":{},\"第\":{\"docs\":{},\"一\":{\"docs\":{},\"集\":{\"docs\":{},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.007389162561576354}}}}}}}}}},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"路\":{\"docs\":{},\"径\":{\"docs\":{},\"，\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"需\":{\"docs\":{},\"写\":{\"docs\":{},\"为\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"\\\"\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}},\"#\":{\"docs\":{},\"e\":{\"docs\":{},\"x\":{\"docs\":{},\"t\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.012315270935960592}},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"f\":{\"docs\":{},\":\":{\"1\":{\"2\":{\"docs\":{},\".\":{\"0\":{\"0\":{\"0\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"8\":{\"docs\":{},\".\":{\"2\":{\"0\":{\"0\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}}},\"docs\":{}}}}},\"m\":{\"3\":{\"docs\":{},\"u\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}}}}}},\"&\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"(\":{\"docs\":{},\"d\":{\"docs\":{},\"e\":{\"docs\":{},\"f\":{\"docs\":{},\"a\":{\"docs\":{},\"u\":{\"docs\":{},\"l\":{\"docs\":{},\"t\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.009852216748768473}}}}}}}}}},\"i\":{\"docs\":{},\"s\":{\"docs\":{},\"o\":{\"docs\":{},\"m\":{\"docs\":{},\"/\":{\"docs\":{},\"i\":{\"docs\":{},\"s\":{\"docs\":{},\"o\":{\"2\":{\"docs\":{},\"/\":{\"docs\":{},\"a\":{\"docs\":{},\"v\":{\"docs\":{},\"c\":{\"1\":{\"docs\":{},\"/\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"4\":{\"1\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}},\"docs\":{}}}}},\"docs\":{}}}}}},\"docs\":{}}}}}}}}},\"k\":{\"docs\":{},\"h\":{\"docs\":{},\"t\":{\"docs\":{},\"m\":{\"docs\":{},\"l\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}},\"w\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"d\":{\"docs\":{},\"o\":{\"docs\":{},\"w\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}}},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.027093596059113302}}},\"[\":{\"docs\":{},\"o\":{\"docs\":{},\"p\":{\"docs\":{},\"t\":{\"docs\":{},\"i\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"s\":{\"docs\":{},\"]\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}},\"a\":{\"docs\":{},\"c\":{\"docs\":{},\"c\":{\"docs\":{},\"e\":{\"docs\":{},\"p\":{\"docs\":{},\"t\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}},\"g\":{\"docs\":{},\"e\":{\"docs\":{},\"n\":{\"docs\":{},\"t\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\":\":{\"docs\":{},\"m\":{\"docs\":{},\"o\":{\"docs\":{},\"z\":{\"docs\":{},\"i\":{\"docs\":{},\"l\":{\"docs\":{},\"l\":{\"docs\":{},\"a\":{\"docs\":{},\"/\":{\"5\":{\"docs\":{},\".\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}},\"p\":{\"docs\":{},\"p\":{\"docs\":{},\"l\":{\"docs\":{},\"e\":{\"docs\":{},\"w\":{\"docs\":{},\"e\":{\"docs\":{},\"b\":{\"docs\":{},\"k\":{\"docs\":{},\"i\":{\"docs\":{},\"t\":{\"docs\":{},\"/\":{\"5\":{\"3\":{\"7\":{\"docs\":{},\".\":{\"3\":{\"6\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}},\"b\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.007389162561576354}}}}}}}}},\"e\":{\"docs\":{},\"n\":{\"docs\":{},\"a\":{\"docs\":{},\"b\":{\"docs\":{},\"l\":{\"docs\":{},\"e\":{\"docs\":{},\"a\":{\"docs\":{},\"u\":{\"docs\":{},\"d\":{\"docs\":{},\"i\":{\"docs\":{},\"o\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"l\":{\"docs\":{},\"i\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}}}}},\"b\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"y\":{\"docs\":{},\"m\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"g\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}}}}}},\"c\":{\"docs\":{},\"h\":{\"docs\":{},\"a\":{\"docs\":{},\"c\":{\"docs\":{},\"h\":{\"docs\":{},\"a\":{\"2\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}},\"docs\":{}},\"docs\":{}}}}}}},\"d\":{\"docs\":{},\"e\":{\"docs\":{},\"l\":{\"docs\":{},\"a\":{\"docs\":{},\"f\":{\"docs\":{},\"t\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"d\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.009852216748768473}}}}}}}}}}}}},\"m\":{\"docs\":{},\"u\":{\"docs\":{},\"x\":{\"docs\":{},\"f\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"t\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}}}}}}}},\"p\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"l\":{\"docs\":{},\"i\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}}}}}}}}},\"d\":{\"docs\":{},\"l\":{\"docs\":{},\"i\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"g\":{\"docs\":{},\"e\":{\"docs\":{},\"c\":{\"docs\":{},\"k\":{\"docs\":{},\"o\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"f\":{\"docs\":{},\"o\":{\"docs\":{},\"r\":{\"docs\":{},\"m\":{\"docs\":{},\"a\":{\"docs\":{},\"t\":{\"docs\":{},\"i\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\".\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}},\"s\":{\"docs\":{},\"o\":{\"docs\":{},\"m\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"k\":{\"docs\":{},\"b\":{\"docs\":{},\"/\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"e\":{\"docs\":{},\"y\":{\"docs\":{},\":\":{\"docs\":{},\"v\":{\"docs\":{},\"a\":{\"docs\":{},\"l\":{\"docs\":{},\"u\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"2\":{\"docs\":{},\"f\":{\"docs\":{},\"i\":{\"docs\":{},\"l\":{\"docs\":{\"M3U8URL2File.html\":{\"ref\":\"M3U8URL2File.html\",\"tf\":10.333333333333334}}}}}},\"docs\":{}}}}},\"docs\":{}}},\"docs\":{},\"a\":{\"docs\":{},\"x\":{\"docs\":{},\"s\":{\"docs\":{},\"p\":{\"docs\":{},\"e\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}},\"t\":{\"docs\":{},\"h\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"a\":{\"docs\":{},\"d\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.007389162561576354}},\"s\":{\"docs\":{},\"和\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}},\"e\":{\"docs\":{},\"d\":{\"docs\":{},\"i\":{\"docs\":{},\"a\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}},\"i\":{\"docs\":{},\"b\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"n\":{\"docs\":{},\"t\":{\"docs\":{},\"h\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"a\":{\"docs\":{},\"d\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.007389162561576354}},\"s\":{\"docs\":{},\"指\":{\"docs\":{},\"定\":{\"docs\":{},\"，\":{\"docs\":{},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"情\":{\"docs\":{},\"况\":{\"docs\":{},\"下\":{\"docs\":{},\"，\":{\"docs\":{},\"这\":{\"docs\":{},\"两\":{\"docs\":{},\"个\":{\"docs\":{},\"值\":{\"docs\":{},\"分\":{\"docs\":{},\"别\":{\"docs\":{},\"是\":{\"3\":{\"2\":{\"docs\":{},\"和\":{\"1\":{\"6\":{\"docs\":{},\"，\":{\"docs\":{},\"你\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"手\":{\"docs\":{},\"动\":{\"docs\":{},\"指\":{\"docs\":{},\"定\":{\"docs\":{},\"它\":{\"docs\":{},\"，\":{\"docs\":{},\"例\":{\"docs\":{},\"如\":{\"docs\":{},\"下\":{\"docs\":{},\"列\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"可\":{\"docs\":{},\"将\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"线\":{\"docs\":{},\"程\":{\"docs\":{},\"限\":{\"docs\":{},\"制\":{\"docs\":{},\"到\":{\"1\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}},\"p\":{\"docs\":{},\"e\":{\"docs\":{},\"g\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"u\":{\"docs\":{},\"x\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"docs\":{},\"t\":{\"docs\":{},\"j\":{\"docs\":{},\"s\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.007389162561576354}}}}}}}}}}}},\"o\":{\"docs\":{},\"p\":{\"docs\":{},\"t\":{\"docs\":{},\"i\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"s\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}},\"p\":{\"docs\":{},\"l\":{\"docs\":{},\"a\":{\"docs\":{},\"y\":{\"docs\":{},\"l\":{\"docs\":{},\"i\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"r\":{\"docs\":{},\"o\":{\"docs\":{},\"x\":{\"docs\":{},\"y\":{\"docs\":{},\"a\":{\"docs\":{},\"d\":{\"docs\":{},\"d\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"s\":{\"docs\":{},\"s\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.007389162561576354}}}}}}}}}}}}}},\"r\":{\"docs\":{},\"a\":{\"docs\":{},\"n\":{\"docs\":{},\"g\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"e\":{\"docs\":{},\"f\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"g\":{\"docs\":{},\"i\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"docs\":{},\"p\":{\"docs\":{},\"r\":{\"docs\":{},\"o\":{\"docs\":{},\"t\":{\"docs\":{},\"o\":{\"docs\":{},\"c\":{\"docs\":{},\"o\":{\"docs\":{},\"l\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}},\"t\":{\"docs\":{},\"r\":{\"docs\":{},\"y\":{\"docs\":{},\"c\":{\"docs\":{},\"o\":{\"docs\":{},\"u\":{\"docs\":{},\"n\":{\"docs\":{},\"t\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}}}}}},\"s\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}},\"a\":{\"docs\":{},\"f\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"i\":{\"docs\":{},\"/\":{\"5\":{\"3\":{\"7\":{\"docs\":{},\".\":{\"3\":{\"6\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"\\\"\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}},\"v\":{\"docs\":{},\"e\":{\"docs\":{},\"n\":{\"docs\":{},\"a\":{\"docs\":{},\"m\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.012315270935960592}}}}}}}},\"c\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"e\":{\"docs\":{},\"n\":{\"docs\":{},\".\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}},\"e\":{\"docs\":{},\"q\":{\"docs\":{},\"u\":{\"docs\":{},\"e\":{\"docs\":{},\"n\":{\"docs\":{},\"c\":{\"docs\":{},\"e\":{\"docs\":{},\":\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}}}}}}}}},\"t\":{\"docs\":{},\"o\":{\"docs\":{},\"p\":{\"docs\":{},\"s\":{\"docs\":{},\"p\":{\"docs\":{},\"e\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}},\"i\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"docs\":{},\"l\":{\"docs\":{},\"e\":{\"docs\":{},\"g\":{\"docs\":{},\".\":{\"docs\":{},\"e\":{\"docs\":{},\"x\":{\"docs\":{},\"e\":{\"docs\":{},\"来\":{\"docs\":{},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"化\":{\"docs\":{},\"生\":{\"docs\":{},\"产\":{\"docs\":{},\"绝\":{\"docs\":{},\"大\":{\"docs\":{},\"部\":{\"docs\":{},\"分\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"，\":{\"docs\":{},\"大\":{\"docs\":{},\"大\":{\"docs\":{},\"提\":{\"docs\":{},\"高\":{\"docs\":{},\"了\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"效\":{\"docs\":{},\"率\":{\"docs\":{},\"。\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"u\":{\"docs\":{},\"i\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":10}}}}}}}}}}},\"t\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"g\":{\"docs\":{},\"e\":{\"docs\":{},\"t\":{\"docs\":{},\"d\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"a\":{\"docs\":{},\"t\":{\"docs\":{},\"i\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\":\":{\"1\":{\"5\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}}}},\"i\":{\"docs\":{},\"m\":{\"docs\":{},\"e\":{\"docs\":{},\"o\":{\"docs\":{},\"u\":{\"docs\":{},\"t\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}},\"y\":{\"docs\":{},\"p\":{\"docs\":{},\"e\":{\"docs\":{},\":\":{\"docs\":{},\"v\":{\"docs\":{},\"o\":{\"docs\":{},\"d\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}},\"u\":{\"docs\":{},\"n\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"g\":{\"docs\":{},\"i\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"docs\":{},\"p\":{\"docs\":{},\"r\":{\"docs\":{},\"o\":{\"docs\":{},\"t\":{\"docs\":{},\"o\":{\"docs\":{},\"c\":{\"docs\":{},\"o\":{\"docs\":{},\"l\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}},\"s\":{\"docs\":{},\"a\":{\"docs\":{},\"g\":{\"docs\":{},\"e\":{\"docs\":{},\":\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"e\":{\"docs\":{},\"k\":{\"docs\":{},\"e\":{\"docs\":{},\"y\":{\"docs\":{},\"b\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"6\":{\"4\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.007389162561576354}}},\"docs\":{}},\"docs\":{}}}}},\"f\":{\"docs\":{},\"i\":{\"docs\":{},\"l\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.007389162561576354}}}}},\"i\":{\"docs\":{},\"v\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}},\"r\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}},\"v\":{\"docs\":{},\"e\":{\"docs\":{},\"r\":{\"docs\":{},\"s\":{\"docs\":{},\"i\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}},\":\":{\"3\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}}}}}}}}},\"x\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.012315270935960592}}},\"y\":{\"docs\":{},\"e\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"{\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}},\"}\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"0\":{\"0\":{\"docs\":{},\":\":{\"2\":{\"3\":{\"docs\":{},\":\":{\"0\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{},\"的\":{\"3\":{\"0\":{\"docs\":{},\"分\":{\"docs\":{},\"钟\":{\"docs\":{},\"到\":{\"docs\":{},\"结\":{\"docs\":{},\"束\":{\"docs\":{},\"的\":{\"docs\":{},\"内\":{\"docs\":{},\"容\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}},\"docs\":{}},\"docs\":{},\"前\":{\"1\":{\"0\":{\"docs\":{},\"分\":{\"docs\":{},\"钟\":{\"docs\":{},\"的\":{\"docs\":{},\"内\":{\"docs\":{},\"容\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}},\"docs\":{}},\"docs\":{}},\"第\":{\"0\":{\"docs\":{},\"个\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"到\":{\"docs\":{},\"第\":{\"1\":{\"0\":{\"0\":{\"docs\":{},\"个\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"，\":{\"docs\":{},\"即\":{\"docs\":{},\"[\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}}}}}}}},\"docs\":{},\"个\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"，\":{\"docs\":{},\"即\":{\"docs\":{},\"[\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}}}}}}}},\"docs\":{}},\"docs\":{}}}}}}},\"2\":{\"0\":{\"0\":{\"docs\":{},\"个\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"到\":{\"docs\":{},\"最\":{\"docs\":{},\"后\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}},\"docs\":{}},\"docs\":{}},\"docs\":{}}}}}}},\"不\":{\"docs\":{},\"检\":{\"docs\":{},\"测\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"数\":{\"docs\":{},\"量\":{\"docs\":{},\"是\":{\"docs\":{},\"否\":{\"docs\":{},\"完\":{\"docs\":{},\"整\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"系\":{\"docs\":{},\"统\":{\"docs\":{},\"代\":{\"docs\":{},\"理\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}},\"限\":{\"docs\":{},\"速\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"为\":{\"docs\":{},\"了\":{\"docs\":{},\"丰\":{\"docs\":{},\"富\":{\"docs\":{},\"软\":{\"docs\":{},\"件\":{\"docs\":{},\"功\":{\"docs\":{},\"能\":{\"docs\":{},\"，\":{\"docs\":{},\"我\":{\"docs\":{},\"提\":{\"docs\":{},\"供\":{\"docs\":{},\"了\":{\"docs\":{},\"很\":{\"docs\":{},\"多\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"行\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"，\":{\"docs\":{},\"在\":{\"docs\":{},\"本\":{\"docs\":{},\"页\":{\"docs\":{},\"我\":{\"docs\":{},\"将\":{\"docs\":{},\"详\":{\"docs\":{},\"细\":{\"docs\":{},\"介\":{\"docs\":{},\"绍\":{\"docs\":{},\"这\":{\"docs\":{},\"些\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"的\":{\"docs\":{},\"作\":{\"docs\":{},\"用\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"仅\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"的\":{\"docs\":{},\"一\":{\"docs\":{},\"部\":{\"docs\":{},\"分\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"或\":{\"docs\":{},\"长\":{\"docs\":{},\"度\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}},\"你\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"将\":{\"docs\":{},\".\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"的\":{\"docs\":{},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"打\":{\"docs\":{},\"开\":{\"docs\":{},\"方\":{\"docs\":{},\"式\":{\"docs\":{},\"设\":{\"docs\":{},\"置\":{\"docs\":{},\"为\":{\"docs\":{},\"n\":{\"docs\":{},\"_\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"d\":{\"docs\":{},\"l\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}},\"能\":{\"docs\":{},\"不\":{\"docs\":{},\"知\":{\"docs\":{},\"道\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}},\"例\":{\"docs\":{},\"如\":{\"docs\":{},\"你\":{\"docs\":{},\"想\":{\"docs\":{},\"要\":{\"docs\":{},\"将\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"图\":{\"docs\":{},\"片\":{\"docs\":{},\"作\":{\"docs\":{},\"为\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"的\":{\"docs\":{},\"海\":{\"docs\":{},\"报\":{\"docs\":{},\"，\":{\"docs\":{},\"同\":{\"docs\":{},\"时\":{\"docs\":{},\"为\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"添\":{\"docs\":{},\"加\":{\"docs\":{},\"标\":{\"docs\":{},\"题\":{\"docs\":{},\"，\":{\"docs\":{},\"你\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"在\":{\"docs\":{},\"桌\":{\"docs\":{},\"面\":{\"docs\":{},\"新\":{\"docs\":{},\"建\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"小\":{\"docs\":{},\"猪\":{\"docs\":{},\"佩\":{\"docs\":{},\"奇\":{\"docs\":{},\".\":{\"docs\":{},\"j\":{\"docs\":{},\"s\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"，\":{\"docs\":{},\"并\":{\"docs\":{},\"在\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"中\":{\"docs\":{},\"写\":{\"docs\":{},\"入\":{\"docs\":{},\"如\":{\"docs\":{},\"下\":{\"docs\":{},\"内\":{\"docs\":{},\"容\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"，\":{\"docs\":{},\"下\":{\"docs\":{},\"列\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"将\":{\"docs\":{},\"使\":{\"docs\":{},\"你\":{\"docs\":{},\"的\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"保\":{\"docs\":{},\"存\":{\"docs\":{},\"为\":{\"docs\":{},\"小\":{\"docs\":{},\"猪\":{\"docs\":{},\"佩\":{\"docs\":{},\"奇\":{\"docs\":{},\"第\":{\"docs\":{},\"一\":{\"docs\":{},\"集\":{\"docs\":{},\".\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"4\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}},\"关\":{\"docs\":{},\"闭\":{\"docs\":{},\"混\":{\"docs\":{},\"流\":{\"docs\":{},\"中\":{\"docs\":{},\"的\":{\"docs\":{},\"日\":{\"docs\":{},\"期\":{\"docs\":{},\"写\":{\"docs\":{},\"入\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}},\"分\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"取\":{\"docs\":{},\"消\":{\"docs\":{},\"注\":{\"docs\":{},\"册\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"d\":{\"docs\":{},\"l\":{\"docs\":{},\"链\":{\"docs\":{},\"接\":{\"docs\":{},\"协\":{\"docs\":{},\"议\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}},\"合\":{\"docs\":{},\"并\":{\"docs\":{},\"时\":{\"docs\":{},\"仅\":{\"docs\":{},\"封\":{\"docs\":{},\"装\":{\"docs\":{},\"音\":{\"docs\":{},\"频\":{\"docs\":{},\"轨\":{\"docs\":{},\"道\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"行\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":10}}}}}}},\"在\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"地\":{\"docs\":{},\"址\":{\"docs\":{},\"文\":{\"docs\":{},\"本\":{\"docs\":{},\"框\":{\"docs\":{},\"或\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"标\":{\"docs\":{},\"题\":{\"docs\":{},\"文\":{\"docs\":{},\"本\":{\"docs\":{},\"框\":{\"docs\":{},\"按\":{\"docs\":{},\"下\":{\"docs\":{},\"回\":{\"docs\":{},\"车\":{\"docs\":{},\"键\":{\"docs\":{},\"时\":{\"docs\":{},\"，\":{\"docs\":{},\"可\":{\"docs\":{},\"触\":{\"docs\":{},\"发\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"；\":{\"docs\":{},\"亦\":{\"docs\":{},\"或\":{\"docs\":{},\"者\":{\"docs\":{},\"在\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"界\":{\"docs\":{},\"面\":{\"docs\":{},\"按\":{\"docs\":{},\"下\":{\"docs\":{},\"快\":{\"docs\":{},\"捷\":{\"docs\":{},\"键\":{\"docs\":{},\"a\":{\"docs\":{},\"l\":{\"docs\":{},\"t\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{},\"e\":{\"docs\":{},\"d\":{\"docs\":{},\"i\":{\"docs\":{},\"a\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"f\":{\"docs\":{},\"o\":{\"docs\":{},\"中\":{\"docs\":{},\"，\":{\"docs\":{},\"显\":{\"docs\":{},\"示\":{\"docs\":{},\"如\":{\"docs\":{},\"下\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}},\"如\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"芒\":{\"docs\":{},\"果\":{\"docs\":{},\"t\":{\"docs\":{},\"v\":{\"docs\":{},\"的\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"会\":{\"docs\":{},\"验\":{\"docs\":{},\"证\":{\"docs\":{},\"c\":{\"docs\":{},\"o\":{\"docs\":{},\"o\":{\"docs\":{},\"k\":{\"docs\":{},\"i\":{\"docs\":{},\"e\":{\"docs\":{},\"，\":{\"docs\":{},\"必\":{\"docs\":{},\"须\":{\"docs\":{},\"含\":{\"docs\":{},\"有\":{\"docs\":{},\"m\":{\"docs\":{},\"q\":{\"docs\":{},\"g\":{\"docs\":{},\"u\":{\"docs\":{},\"i\":{\"docs\":{},\"d\":{\"docs\":{},\"才\":{\"docs\":{},\"能\":{\"docs\":{},\"正\":{\"docs\":{},\"确\":{\"docs\":{},\"访\":{\"docs\":{},\"问\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"，\":{\"docs\":{},\"你\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"这\":{\"docs\":{},\"样\":{\"docs\":{},\"指\":{\"docs\":{},\"定\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}},\"封\":{\"docs\":{},\"面\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"小\":{\"docs\":{},\"猪\":{\"docs\":{},\"佩\":{\"docs\":{},\"奇\":{\"docs\":{},\"第\":{\"docs\":{},\"一\":{\"docs\":{},\"集\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"平\":{\"docs\":{},\"均\":{\"docs\":{},\"混\":{\"docs\":{},\"合\":{\"docs\":{},\"码\":{\"docs\":{},\"率\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}},\"开\":{\"docs\":{},\"启\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"后\":{\"docs\":{},\"删\":{\"docs\":{},\"除\":{\"docs\":{},\"临\":{\"docs\":{},\"时\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"夹\":{\"docs\":{},\"的\":{\"docs\":{},\"功\":{\"docs\":{},\"能\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}},\"二\":{\"docs\":{},\"进\":{\"docs\":{},\"制\":{\"docs\":{},\"合\":{\"docs\":{},\"并\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"仅\":{\"docs\":{},\"解\":{\"docs\":{},\"析\":{\"docs\":{},\"模\":{\"docs\":{},\"式\":{\"docs\":{},\"(\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"只\":{\"docs\":{},\"进\":{\"docs\":{},\"行\":{\"docs\":{},\"到\":{\"docs\":{},\"m\":{\"docs\":{},\"e\":{\"docs\":{},\"t\":{\"docs\":{},\"a\":{\"docs\":{},\".\":{\"docs\":{},\"j\":{\"docs\":{},\"s\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}},\"混\":{\"docs\":{},\"流\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"4\":{\"docs\":{},\"的\":{\"docs\":{},\"f\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\"t\":{\"docs\":{},\"a\":{\"docs\":{},\"r\":{\"docs\":{},\"t\":{\"docs\":{},\"特\":{\"docs\":{},\"性\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}},\"docs\":{}}}}}}},\"强\":{\"docs\":{},\"制\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"a\":{\"docs\":{},\"e\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0049261083743842365}}}}}}}},\"当\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"速\":{\"docs\":{},\"度\":{\"docs\":{},\"低\":{\"docs\":{},\"于\":{\"docs\":{},\"此\":{\"docs\":{},\"值\":{\"docs\":{},\"(\":{\"docs\":{},\"单\":{\"docs\":{},\"位\":{\"docs\":{},\"为\":{\"docs\":{},\"k\":{\"docs\":{},\"b\":{\"docs\":{},\"/\":{\"docs\":{},\"s\":{\"docs\":{},\")\":{\"docs\":{},\"时\":{\"docs\":{},\"，\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"进\":{\"docs\":{},\"入\":{\"docs\":{},\"重\":{\"docs\":{},\"试\":{\"docs\":{},\"阶\":{\"docs\":{},\"段\":{\"docs\":{},\"。\":{\"docs\":{},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"值\":{\"docs\":{},\"为\":{\"0\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"然\":{\"docs\":{},\"，\":{\"docs\":{},\"支\":{\"docs\":{},\"持\":{\"docs\":{},\"自\":{\"docs\":{},\"定\":{\"docs\":{},\"义\":{\"docs\":{},\"多\":{\"docs\":{},\"种\":{\"docs\":{},\"请\":{\"docs\":{},\"求\":{\"docs\":{},\"头\":{\"docs\":{},\"，\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"|\":{\"docs\":{},\"分\":{\"docs\":{},\"隔\":{\"docs\":{},\"，\":{\"docs\":{},\"例\":{\"docs\":{},\"如\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}},\"速\":{\"docs\":{},\"度\":{\"docs\":{},\"低\":{\"docs\":{},\"于\":{\"docs\":{},\"此\":{\"docs\":{},\"值\":{\"docs\":{},\"时\":{\"docs\":{},\"，\":{\"docs\":{},\"重\":{\"docs\":{},\"试\":{\"docs\":{},\"(\":{\"docs\":{},\"单\":{\"docs\":{},\"位\":{\"docs\":{},\"为\":{\"docs\":{},\"k\":{\"docs\":{},\"b\":{\"docs\":{},\"/\":{\"docs\":{},\"s\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"地\":{\"docs\":{},\"址\":{\"docs\":{},\"文\":{\"docs\":{},\"本\":{\"docs\":{},\"框\":{\"docs\":{},\"不\":{\"docs\":{},\"为\":{\"docs\":{},\"空\":{\"docs\":{},\"时\":{\"docs\":{},\"，\":{\"docs\":{},\"双\":{\"docs\":{},\"击\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"标\":{\"docs\":{},\"题\":{\"docs\":{},\"文\":{\"docs\":{},\"本\":{\"docs\":{},\"框\":{\"docs\":{},\"时\":{\"docs\":{},\"，\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"将\":{\"docs\":{},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"识\":{\"docs\":{},\"别\":{\"docs\":{},\"您\":{\"docs\":{},\"输\":{\"docs\":{},\"入\":{\"docs\":{},\"的\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"地\":{\"docs\":{},\"址\":{\"docs\":{},\"并\":{\"docs\":{},\"给\":{\"docs\":{},\"出\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"合\":{\"docs\":{},\"适\":{\"docs\":{},\"的\":{\"docs\":{},\"标\":{\"docs\":{},\"题\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}},\"录\":{\"docs\":{},\"制\":{\"docs\":{},\"日\":{\"docs\":{},\"期\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"必\":{\"docs\":{},\"要\":{\"docs\":{},\"的\":{\"docs\":{},\"，\":{\"docs\":{},\"它\":{\"docs\":{},\"意\":{\"docs\":{},\"味\":{\"docs\":{},\"着\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"将\":{\"docs\":{},\"从\":{\"docs\":{},\"哪\":{\"docs\":{},\"里\":{\"docs\":{},\"接\":{\"docs\":{},\"收\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"地\":{\"docs\":{},\"址\":{\"docs\":{},\"、\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"以\":{\"docs\":{},\"开\":{\"docs\":{},\"始\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"。\":{\"docs\":{},\"例\":{\"docs\":{},\"如\":{\"docs\":{},\"，\":{\"docs\":{},\"下\":{\"docs\":{},\"列\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"将\":{\"docs\":{},\"使\":{\"docs\":{},\"从\":{\"docs\":{},\"指\":{\"docs\":{},\"定\":{\"docs\":{},\"地\":{\"docs\":{},\"址\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"我\":{\"docs\":{},\"爱\":{\"docs\":{},\"小\":{\"docs\":{},\"猪\":{\"docs\":{},\"佩\":{\"docs\":{},\"奇\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}},\"持\":{\"docs\":{},\"续\":{\"docs\":{},\"时\":{\"docs\":{},\"间\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"指\":{\"docs\":{},\"定\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"j\":{\"docs\":{},\"s\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"用\":{\"docs\":{},\"于\":{\"docs\":{},\"混\":{\"docs\":{},\"流\":{\"docs\":{},\"，\":{\"docs\":{},\"能\":{\"docs\":{},\"够\":{\"docs\":{},\"识\":{\"docs\":{},\"别\":{\"docs\":{},\"的\":{\"docs\":{},\"格\":{\"docs\":{},\"式\":{\"docs\":{},\"如\":{\"docs\":{},\"下\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"最\":{\"docs\":{},\"大\":{\"docs\":{},\"重\":{\"docs\":{},\"试\":{\"docs\":{},\"次\":{\"docs\":{},\"数\":{\"docs\":{},\"。\":{\"docs\":{},\"某\":{\"docs\":{},\"些\":{\"docs\":{},\"时\":{\"docs\":{},\"候\":{\"docs\":{},\"我\":{\"docs\":{},\"们\":{\"docs\":{},\"并\":{\"docs\":{},\"不\":{\"docs\":{},\"能\":{\"docs\":{},\"一\":{\"docs\":{},\"次\":{\"docs\":{},\"性\":{\"docs\":{},\"成\":{\"docs\":{},\"功\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"所\":{\"docs\":{},\"有\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"，\":{\"docs\":{},\"在\":{\"docs\":{},\"一\":{\"docs\":{},\"次\":{\"docs\":{},\"任\":{\"docs\":{},\"务\":{\"docs\":{},\"结\":{\"docs\":{},\"束\":{\"docs\":{},\"后\":{\"docs\":{},\"，\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"会\":{\"docs\":{},\"检\":{\"docs\":{},\"测\":{\"docs\":{},\"已\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"的\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"数\":{\"docs\":{},\"量\":{\"docs\":{},\"和\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"中\":{\"docs\":{},\"的\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\"数\":{\"docs\":{},\"量\":{\"docs\":{},\"是\":{\"docs\":{},\"否\":{\"docs\":{},\"相\":{\"docs\":{},\"等\":{\"docs\":{},\"，\":{\"docs\":{},\"不\":{\"docs\":{},\"一\":{\"docs\":{},\"致\":{\"docs\":{},\"则\":{\"docs\":{},\"进\":{\"docs\":{},\"入\":{\"docs\":{},\"重\":{\"docs\":{},\"试\":{\"docs\":{},\"环\":{\"docs\":{},\"节\":{\"docs\":{},\"。\":{\"docs\":{},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"值\":{\"docs\":{},\"为\":{\"1\":{\"5\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"进\":{\"docs\":{},\"行\":{\"docs\":{},\"网\":{\"docs\":{},\"络\":{\"docs\":{},\"请\":{\"docs\":{},\"求\":{\"docs\":{},\"的\":{\"docs\":{},\"超\":{\"docs\":{},\"时\":{\"docs\":{},\"时\":{\"docs\":{},\"长\":{\"docs\":{},\"，\":{\"docs\":{},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"值\":{\"docs\":{},\"为\":{\"1\":{\"0\":{\"docs\":{},\"秒\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}}}}}}}}}},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"大\":{\"docs\":{},\"小\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"无\":{\"docs\":{},\"需\":{\"docs\":{},\"任\":{\"docs\":{},\"何\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}},\"某\":{\"docs\":{},\"些\":{\"docs\":{},\"时\":{\"docs\":{},\"候\":{\"docs\":{},\"，\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"服\":{\"docs\":{},\"务\":{\"docs\":{},\"器\":{\"docs\":{},\"会\":{\"docs\":{},\"阻\":{\"docs\":{},\"止\":{\"docs\":{},\"你\":{\"docs\":{},\"的\":{\"docs\":{},\"请\":{\"docs\":{},\"求\":{\"docs\":{},\"，\":{\"docs\":{},\"除\":{\"docs\":{},\"非\":{\"docs\":{},\"你\":{\"docs\":{},\"能\":{\"docs\":{},\"够\":{\"docs\":{},\"伪\":{\"docs\":{},\"造\":{\"docs\":{},\"一\":{\"docs\":{},\"些\":{\"docs\":{},\"请\":{\"docs\":{},\"求\":{\"docs\":{},\"头\":{\"docs\":{},\"，\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"即\":{\"docs\":{},\"可\":{\"docs\":{},\"伪\":{\"docs\":{},\"造\":{\"docs\":{},\"一\":{\"docs\":{},\"些\":{\"docs\":{},\"请\":{\"docs\":{},\"求\":{\"docs\":{},\"头\":{\"docs\":{},\"，\":{\"docs\":{},\"目\":{\"docs\":{},\"前\":{\"docs\":{},\"支\":{\"docs\":{},\"持\":{\"docs\":{},\"大\":{\"docs\":{},\"部\":{\"docs\":{},\"分\":{\"docs\":{},\"常\":{\"docs\":{},\"见\":{\"docs\":{},\"请\":{\"docs\":{},\"求\":{\"docs\":{},\"头\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"格\":{\"docs\":{},\"式\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"概\":{\"docs\":{},\"况\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"此\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"将\":{\"docs\":{},\"指\":{\"docs\":{},\"定\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"保\":{\"docs\":{},\"存\":{\"docs\":{},\"的\":{\"docs\":{},\"位\":{\"docs\":{},\"置\":{\"docs\":{},\"，\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"是\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"夹\":{\"docs\":{},\"路\":{\"docs\":{},\"径\":{\"docs\":{},\"。\":{\"docs\":{},\"例\":{\"docs\":{},\"如\":{\"docs\":{},\"，\":{\"docs\":{},\"下\":{\"docs\":{},\"列\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"将\":{\"docs\":{},\"使\":{\"docs\":{},\"你\":{\"docs\":{},\"的\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"保\":{\"docs\":{},\"存\":{\"docs\":{},\"至\":{\"docs\":{},\"d\":{\"docs\":{},\":\":{\"docs\":{},\"\\\\\":{\"docs\":{},\"m\":{\"docs\":{},\"y\":{\"docs\":{},\"v\":{\"docs\":{},\"i\":{\"docs\":{},\"d\":{\"docs\":{},\"e\":{\"docs\":{},\"o\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"名\":{\"docs\":{},\"称\":{\"docs\":{},\"，\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"是\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"有\":{\"docs\":{},\"效\":{\"docs\":{},\"字\":{\"docs\":{},\"符\":{\"docs\":{},\"串\":{\"docs\":{},\"。\":{\"docs\":{},\"通\":{\"docs\":{},\"常\":{\"docs\":{},\"情\":{\"docs\":{},\"况\":{\"docs\":{},\"下\":{\"docs\":{},\"，\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"名\":{\"docs\":{},\"称\":{\"docs\":{},\"由\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"识\":{\"docs\":{},\"别\":{\"docs\":{},\"，\":{\"docs\":{},\"假\":{\"docs\":{},\"如\":{\"docs\":{},\"你\":{\"docs\":{},\"想\":{\"docs\":{},\"自\":{\"docs\":{},\"定\":{\"docs\":{},\"义\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"名\":{\"docs\":{},\"字\":{\"docs\":{},\"，\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"常\":{\"docs\":{},\"用\":{\"docs\":{},\"于\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"本\":{\"docs\":{},\"地\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"，\":{\"docs\":{},\"例\":{\"docs\":{},\"如\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}},\"时\":{\"docs\":{},\"，\":{\"docs\":{},\"如\":{\"docs\":{},\"果\":{\"docs\":{},\"你\":{\"docs\":{},\"的\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"只\":{\"docs\":{},\"有\":{\"0\":{\"docs\":{},\"个\":{\"docs\":{},\"(\":{\"docs\":{},\"双\":{\"docs\":{},\"击\":{\"docs\":{},\"打\":{\"docs\":{},\"开\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\")\":{\"docs\":{},\"或\":{\"1\":{\"docs\":{},\"个\":{\"docs\":{},\"(\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"行\":{\"docs\":{},\"调\":{\"docs\":{},\"用\":{\"docs\":{},\"且\":{\"docs\":{},\"只\":{\"docs\":{},\"输\":{\"docs\":{},\"入\":{\"docs\":{},\"了\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"地\":{\"docs\":{},\"址\":{\"docs\":{},\")\":{\"docs\":{},\"，\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"会\":{\"docs\":{},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"补\":{\"docs\":{},\"充\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"，\":{\"docs\":{},\"例\":{\"docs\":{},\"如\":{\"docs\":{},\"n\":{\"docs\":{},\"_\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"d\":{\"docs\":{},\"l\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}},\"docs\":{}}}}}}}}}}}},\"docs\":{}}}}}}}}}}}},\"注\":{\"docs\":{},\"册\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"d\":{\"docs\":{},\"l\":{\"docs\":{},\"链\":{\"docs\":{},\"接\":{\"docs\":{},\"协\":{\"docs\":{},\"议\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"docs\":{}}},\"docs\":{}}},\"意\":{\"docs\":{},\"，\":{\"docs\":{},\"当\":{\"docs\":{},\"启\":{\"docs\":{},\"用\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"：\":{\"docs\":{},\"在\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"时\":{\"docs\":{},\"间\":{\"docs\":{},\"码\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"时\":{\"docs\":{},\"，\":{\"docs\":{},\"格\":{\"docs\":{},\"式\":{\"docs\":{},\"必\":{\"docs\":{},\"须\":{\"docs\":{},\"为\":{\"0\":{\"0\":{\"docs\":{},\":\":{\"0\":{\"0\":{\"docs\":{},\":\":{\"0\":{\"0\":{\"docs\":{},\"才\":{\"docs\":{},\"能\":{\"docs\":{},\"被\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"正\":{\"docs\":{},\"确\":{\"docs\":{},\"识\":{\"docs\":{},\"别\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}},\"docs\":{}},\"docs\":{}}}}}}}}}}}}}}}}}}},\"然\":{\"docs\":{},\"后\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"如\":{\"docs\":{},\"下\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"它\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}},\"现\":{\"docs\":{},\"在\":{\"docs\":{},\"你\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"在\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"e\":{\"docs\":{},\"x\":{\"docs\":{},\"e\":{\"docs\":{},\"目\":{\"docs\":{},\"录\":{\"docs\":{},\"下\":{\"docs\":{},\"新\":{\"docs\":{},\"建\":{\"docs\":{},\"n\":{\"docs\":{},\"_\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"d\":{\"docs\":{},\"l\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}},\"用\":{\"docs\":{},\"于\":{\"docs\":{},\"开\":{\"docs\":{},\"启\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"的\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"完\":{\"docs\":{},\"成\":{\"docs\":{},\"后\":{\"docs\":{},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"删\":{\"docs\":{},\"除\":{\"docs\":{},\"临\":{\"docs\":{},\"时\":{\"docs\":{},\"目\":{\"docs\":{},\"录\":{\"docs\":{},\"功\":{\"docs\":{},\"能\":{\"docs\":{},\"，\":{\"docs\":{},\"无\":{\"docs\":{},\"需\":{\"docs\":{},\"任\":{\"docs\":{},\"何\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"电\":{\"docs\":{},\"影\":{\"docs\":{},\"名\":{\"docs\":{},\"称\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"直\":{\"docs\":{},\"播\":{\"docs\":{},\"录\":{\"docs\":{},\"制\":{\"docs\":{},\"时\":{\"docs\":{},\"，\":{\"docs\":{},\"达\":{\"docs\":{},\"到\":{\"docs\":{},\"此\":{\"docs\":{},\"长\":{\"docs\":{},\"度\":{\"docs\":{},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"退\":{\"docs\":{},\"出\":{\"docs\":{},\"软\":{\"docs\":{},\"件\":{\"docs\":{},\"(\":{\"docs\":{},\"h\":{\"docs\":{},\"h\":{\"docs\":{},\":\":{\"docs\":{},\"m\":{\"docs\":{},\"m\":{\"docs\":{},\":\":{\"docs\":{},\"s\":{\"docs\":{},\"s\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}},\"流\":{\"docs\":{},\"录\":{\"docs\":{},\"制\":{\"docs\":{},\"长\":{\"docs\":{},\"度\":{\"docs\":{},\"为\":{\"1\":{\"0\":{\"docs\":{},\"分\":{\"docs\":{},\"钟\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"docs\":{},\"小\":{\"docs\":{},\"时\":{\"1\":{\"0\":{\"docs\":{},\"分\":{\"docs\":{},\"钟\":{\"1\":{\"0\":{\"docs\":{},\"秒\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}},\"docs\":{}}}},\"docs\":{}},\"docs\":{}}}},\"docs\":{}}}}}}}}},\"禁\":{\"docs\":{},\"用\":{\"docs\":{},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"合\":{\"docs\":{},\"并\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}},\"秒\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}},\"第\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}},\"编\":{\"docs\":{},\"码\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}},\"解\":{\"docs\":{},\"码\":{\"docs\":{},\"器\":{\"docs\":{},\"i\":{\"docs\":{},\"d\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}},\"设\":{\"docs\":{},\"定\":{\"docs\":{},\"b\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"存\":{\"docs\":{},\"储\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"名\":{\"docs\":{},\"(\":{\"docs\":{},\"不\":{\"docs\":{},\"包\":{\"docs\":{},\"括\":{\"docs\":{},\"后\":{\"docs\":{},\"缀\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"工\":{\"docs\":{},\"作\":{\"docs\":{},\"目\":{\"docs\":{},\"录\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"的\":{\"docs\":{},\"最\":{\"docs\":{},\"大\":{\"docs\":{},\"线\":{\"docs\":{},\"程\":{\"docs\":{},\"数\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"小\":{\"docs\":{},\"线\":{\"docs\":{},\"程\":{\"docs\":{},\"数\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}},\"重\":{\"docs\":{},\"试\":{\"docs\":{},\"次\":{\"docs\":{},\"数\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}},\"网\":{\"docs\":{},\"络\":{\"docs\":{},\"请\":{\"docs\":{},\"求\":{\"docs\":{},\"的\":{\"docs\":{},\"超\":{\"docs\":{},\"时\":{\"docs\":{},\"时\":{\"docs\":{},\"间\":{\"docs\":{},\"(\":{\"docs\":{},\"单\":{\"docs\":{},\"位\":{\"docs\":{},\"为\":{\"docs\":{},\"秒\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}},\"请\":{\"docs\":{},\"求\":{\"docs\":{},\"头\":{\"docs\":{},\"，\":{\"docs\":{},\"格\":{\"docs\":{},\"式\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}},\"置\":{\"docs\":{},\"h\":{\"docs\":{},\"t\":{\"docs\":{},\"t\":{\"docs\":{},\"p\":{\"docs\":{},\"/\":{\"docs\":{},\"s\":{\"docs\":{},\"o\":{\"docs\":{},\"c\":{\"docs\":{},\"k\":{\"docs\":{},\"s\":{\"5\":{\"docs\":{},\"代\":{\"docs\":{},\"理\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}},\"docs\":{}}}}}}},\"代\":{\"docs\":{},\"理\":{\"docs\":{},\"，\":{\"docs\":{},\"配\":{\"docs\":{},\"合\":{\"docs\":{},\"代\":{\"docs\":{},\"理\":{\"docs\":{},\"软\":{\"docs\":{},\"件\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"。\":{\"docs\":{},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"情\":{\"docs\":{},\"况\":{\"docs\":{},\"下\":{\"docs\":{},\"，\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"会\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"系\":{\"docs\":{},\"统\":{\"docs\":{},\"代\":{\"docs\":{},\"理\":{\"docs\":{},\"；\":{\"docs\":{},\"现\":{\"docs\":{},\"在\":{\"docs\":{},\"你\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"自\":{\"docs\":{},\"定\":{\"docs\":{},\"义\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"h\":{\"docs\":{},\"t\":{\"docs\":{},\"t\":{\"docs\":{},\"p\":{\"docs\":{},\"地\":{\"docs\":{},\"址\":{\"docs\":{},\"用\":{\"docs\":{},\"作\":{\"docs\":{},\"代\":{\"docs\":{},\"理\":{\"docs\":{},\"了\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"速\":{\"docs\":{},\"度\":{\"docs\":{},\"上\":{\"docs\":{},\"限\":{\"docs\":{},\"(\":{\"docs\":{},\"单\":{\"docs\":{},\"位\":{\"docs\":{},\"为\":{\"docs\":{},\"k\":{\"docs\":{},\"b\":{\"docs\":{},\"/\":{\"docs\":{},\"s\":{\"docs\":{},\")\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}},\"。\":{\"docs\":{},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"值\":{\"docs\":{},\"为\":{\"0\":{\"docs\":{},\",\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}},\"评\":{\"docs\":{},\"论\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}},\"这\":{\"docs\":{},\"样\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"使\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"如\":{\"docs\":{},\"下\":{\"docs\":{},\"请\":{\"docs\":{},\"求\":{\"docs\":{},\"头\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}},\"的\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"是\":{\"docs\":{},\"无\":{\"docs\":{},\"法\":{\"docs\":{},\"直\":{\"docs\":{},\"接\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"的\":{\"docs\":{},\"，\":{\"docs\":{},\"你\":{\"docs\":{},\"需\":{\"docs\":{},\"要\":{\"docs\":{},\"指\":{\"docs\":{},\"定\":{\"docs\":{},\"对\":{\"docs\":{},\"应\":{\"docs\":{},\"的\":{\"docs\":{},\"b\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{},\"e\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"docs\":{},\"，\":{\"docs\":{},\"就\":{\"docs\":{},\"像\":{\"docs\":{},\"这\":{\"docs\":{},\"样\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}},\"，\":{\"docs\":{},\"你\":{\"docs\":{},\"的\":{\"docs\":{},\"视\":{\"docs\":{},\"频\":{\"docs\":{},\"将\":{\"docs\":{},\"在\":{\"docs\":{},\"w\":{\"docs\":{},\"i\":{\"docs\":{},\"n\":{\"docs\":{},\"d\":{\"docs\":{},\"o\":{\"docs\":{},\"w\":{\"docs\":{},\"s\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"资\":{\"docs\":{},\"源\":{\"docs\":{},\"管\":{\"docs\":{},\"理\":{\"docs\":{},\"器\":{\"docs\":{},\"中\":{\"docs\":{},\"呈\":{\"docs\":{},\"现\":{\"docs\":{},\"出\":{\"docs\":{},\"这\":{\"docs\":{},\"样\":{\"docs\":{},\"的\":{\"docs\":{},\"效\":{\"docs\":{},\"果\":{\"docs\":{},\"：\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"里\":{\"docs\":{},\"变\":{\"docs\":{},\"得\":{\"docs\":{},\"空\":{\"docs\":{},\"空\":{\"docs\":{},\"如\":{\"docs\":{},\"也\":{\"docs\":{},\".\":{\"docs\":{},\".\":{\"docs\":{},\".\":{\"docs\":{\"GetM3u8.html\":{\"ref\":\"GetM3u8.html\",\"tf\":0.5}}}}}}}}}}}}},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"情\":{\"docs\":{},\"况\":{\"docs\":{},\"下\":{\"docs\":{},\"，\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"合\":{\"docs\":{},\"并\":{\"docs\":{},\"生\":{\"docs\":{},\"成\":{\"docs\":{},\"的\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"4\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"会\":{\"docs\":{},\"默\":{\"docs\":{},\"认\":{\"docs\":{},\"加\":{\"docs\":{},\"入\":{\"docs\":{},\"一\":{\"docs\":{},\"个\":{\"docs\":{},\"录\":{\"docs\":{},\"制\":{\"docs\":{},\"日\":{\"docs\":{},\"期\":{\"docs\":{},\"，\":{\"docs\":{},\"你\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"来\":{\"docs\":{},\"规\":{\"docs\":{},\"避\":{\"docs\":{},\"此\":{\"docs\":{},\"操\":{\"docs\":{},\"作\":{\"docs\":{},\"。\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"无\":{\"docs\":{},\"需\":{\"docs\":{},\"任\":{\"docs\":{},\"何\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}}}}}}},\"后\":{\"docs\":{},\"会\":{\"docs\":{},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"合\":{\"docs\":{},\"并\":{\"docs\":{},\"为\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"4\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"，\":{\"docs\":{},\"你\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"来\":{\"docs\":{},\"规\":{\"docs\":{},\"避\":{\"docs\":{},\"此\":{\"docs\":{},\"操\":{\"docs\":{},\"作\":{\"docs\":{},\"。\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"无\":{\"docs\":{},\"需\":{\"docs\":{},\"任\":{\"docs\":{},\"何\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}}}}}}}}},\"器\":{\"docs\":{},\"会\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"当\":{\"docs\":{},\"前\":{\"docs\":{},\"系\":{\"docs\":{},\"统\":{\"docs\":{},\"的\":{\"docs\":{},\"代\":{\"docs\":{},\"理\":{\"docs\":{},\"设\":{\"docs\":{},\"置\":{\"docs\":{},\"，\":{\"docs\":{},\"你\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"来\":{\"docs\":{},\"规\":{\"docs\":{},\"避\":{\"docs\":{},\"此\":{\"docs\":{},\"操\":{\"docs\":{},\"作\":{\"docs\":{},\"。\":{\"docs\":{},\"本\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"无\":{\"docs\":{},\"需\":{\"docs\":{},\"任\":{\"docs\":{},\"何\":{\"docs\":{},\"参\":{\"docs\":{},\"数\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"在\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"过\":{\"docs\":{},\"程\":{\"docs\":{},\"完\":{\"docs\":{},\"毕\":{\"docs\":{},\"后\":{\"docs\":{},\"，\":{\"docs\":{},\"会\":{\"docs\":{},\"提\":{\"docs\":{},\"取\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"目\":{\"docs\":{},\"录\":{\"docs\":{},\"所\":{\"docs\":{},\"有\":{\"docs\":{},\"t\":{\"docs\":{},\"s\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"数\":{\"docs\":{},\"量\":{\"docs\":{},\"与\":{\"docs\":{},\"m\":{\"docs\":{},\"e\":{\"docs\":{},\"t\":{\"docs\":{},\"a\":{\"docs\":{},\".\":{\"docs\":{},\"j\":{\"docs\":{},\"s\":{\"docs\":{},\"o\":{\"docs\":{},\"n\":{\"docs\":{},\"中\":{\"docs\":{},\"读\":{\"docs\":{},\"取\":{\"docs\":{},\"到\":{\"docs\":{},\"的\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"数\":{\"docs\":{},\"量\":{\"docs\":{},\"做\":{\"docs\":{},\"比\":{\"docs\":{},\"对\":{\"docs\":{},\"，\":{\"docs\":{},\"如\":{\"docs\":{},\"果\":{\"docs\":{},\"数\":{\"docs\":{},\"量\":{\"docs\":{},\"不\":{\"docs\":{},\"一\":{\"docs\":{},\"致\":{\"docs\":{},\"(\":{\"docs\":{},\"这\":{\"docs\":{},\"意\":{\"docs\":{},\"味\":{\"docs\":{},\"着\":{\"docs\":{},\"丢\":{\"docs\":{},\"失\":{\"docs\":{},\"了\":{\"docs\":{},\"某\":{\"docs\":{},\"些\":{\"docs\":{},\"分\":{\"docs\":{},\"片\":{\"docs\":{},\")\":{\"docs\":{},\"，\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"将\":{\"docs\":{},\"进\":{\"docs\":{},\"入\":{\"docs\":{},\"重\":{\"docs\":{},\"试\":{\"docs\":{},\"阶\":{\"docs\":{},\"段\":{\"docs\":{},\"。\":{\"docs\":{},\"你\":{\"docs\":{},\"可\":{\"docs\":{},\"以\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"此\":{\"docs\":{},\"选\":{\"docs\":{},\"项\":{\"docs\":{},\"来\":{\"docs\":{},\"规\":{\"docs\":{},\"避\":{\"docs\":{},\"此\":{\"docs\":{},\"操\":{\"docs\":{},\"作\":{\"docs\":{},\"(\":{\"docs\":{},\"不\":{\"docs\":{},\"推\":{\"docs\":{},\"荐\":{\"docs\":{},\")\":{\"docs\":{},\"。\":{\"docs\":{\"Advanced.html\":{\"ref\":\"Advanced.html\",\"tf\":0.0024630541871921183}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"+\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}},\"功\":{\"docs\":{},\"能\":{\"docs\":{},\"说\":{\"docs\":{},\"明\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}}}},\"支\":{\"docs\":{},\"持\":{\"docs\":{},\"批\":{\"docs\":{},\"量\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}}}}}},\"欢\":{\"docs\":{},\"迎\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"s\":{\"docs\":{},\"i\":{\"docs\":{},\"m\":{\"docs\":{},\"p\":{\"docs\":{},\"l\":{\"docs\":{},\"e\":{\"docs\":{},\"g\":{\"docs\":{},\"u\":{\"docs\":{},\"i\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}}}}}}}}}}}}},\"自\":{\"docs\":{},\"动\":{\"docs\":{},\"保\":{\"docs\":{},\"存\":{\"docs\":{},\"配\":{\"docs\":{},\"置\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}}}}}},\"鉴\":{\"docs\":{},\"于\":{\"docs\":{},\"大\":{\"docs\":{},\"部\":{\"docs\":{},\"分\":{\"docs\":{},\"用\":{\"docs\":{},\"户\":{\"docs\":{},\"在\":{\"docs\":{},\"使\":{\"docs\":{},\"用\":{\"docs\":{},\"命\":{\"docs\":{},\"令\":{\"docs\":{},\"行\":{\"docs\":{},\"程\":{\"docs\":{},\"序\":{\"docs\":{},\"时\":{\"docs\":{},\"感\":{\"docs\":{},\"受\":{\"docs\":{},\"到\":{\"docs\":{},\"比\":{\"docs\":{},\"较\":{\"docs\":{},\"繁\":{\"docs\":{},\"琐\":{\"docs\":{},\"的\":{\"docs\":{},\"操\":{\"docs\":{},\"作\":{\"docs\":{},\"体\":{\"docs\":{},\"验\":{\"docs\":{},\"，\":{\"docs\":{},\"我\":{\"docs\":{},\"开\":{\"docs\":{},\"发\":{\"docs\":{},\"了\":{\"docs\":{},\"n\":{\"docs\":{},\"_\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"d\":{\"docs\":{},\"l\":{\"docs\":{\"SimpleGUI.html\":{\"ref\":\"SimpleGUI.html\",\"tf\":0.06666666666666667}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"j\":{\"docs\":{},\"s\":{\"docs\":{},\"获\":{\"docs\":{},\"取\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{\"GetM3u8.html\":{\"ref\":\"GetM3u8.html\",\"tf\":10}}},\"docs\":{}}},\"docs\":{}}}}}},\"一\":{\"docs\":{},\"款\":{\"docs\":{},\"帮\":{\"docs\":{},\"助\":{\"docs\":{},\"你\":{\"docs\":{},\"将\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"链\":{\"docs\":{},\"接\":{\"docs\":{},\"下\":{\"docs\":{},\"载\":{\"docs\":{},\"为\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"文\":{\"docs\":{},\"件\":{\"docs\":{},\"的\":{\"docs\":{},\"小\":{\"docs\":{},\"软\":{\"docs\":{},\"件\":{\"docs\":{},\"。\":{\"docs\":{},\"h\":{\"docs\":{},\"t\":{\"docs\":{},\"t\":{\"docs\":{},\"p\":{\"docs\":{},\"s\":{\"docs\":{},\":\":{\"docs\":{},\"/\":{\"docs\":{},\"/\":{\"docs\":{},\"g\":{\"docs\":{},\"i\":{\"docs\":{},\"t\":{\"docs\":{},\"h\":{\"docs\":{},\"u\":{\"docs\":{},\"b\":{\"docs\":{},\".\":{\"docs\":{},\"c\":{\"docs\":{},\"o\":{\"docs\":{},\"m\":{\"docs\":{},\"/\":{\"docs\":{},\"n\":{\"docs\":{},\"i\":{\"docs\":{},\"l\":{\"docs\":{},\"a\":{\"docs\":{},\"o\":{\"docs\":{},\"d\":{\"docs\":{},\"a\":{\"docs\":{},\"/\":{\"docs\":{},\"m\":{\"3\":{\"docs\":{},\"u\":{\"8\":{\"docs\":{},\"u\":{\"docs\":{},\"r\":{\"docs\":{},\"l\":{\"2\":{\"docs\":{},\"f\":{\"docs\":{},\"i\":{\"docs\":{},\"l\":{\"docs\":{},\"e\":{\"docs\":{},\"/\":{\"docs\":{},\"r\":{\"docs\":{},\"e\":{\"docs\":{},\"l\":{\"docs\":{},\"e\":{\"docs\":{},\"a\":{\"docs\":{},\"s\":{\"docs\":{\"M3U8URL2File.html\":{\"ref\":\"M3U8URL2File.html\",\"tf\":0.3333333333333333}}}}}}}}}}}}}},\"docs\":{}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}},\"docs\":{}}},\"docs\":{}}}}}}}}},\"length\":314},\"corpusTokens\":[\"\\\"\\\"\",\"\\\"\\\",\",\"\\\"audioname\\\":\",\"\\\"audioname\\\":\\\"\\\",\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\aes.m3u8\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\key\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\m.m3u8\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\raw.m3u8\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\小猪佩奇.json\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\小猪佩奇第一集(mgtv).m3u8\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\desktop\\\\小猪佩奇第一集.m3u8\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\downloads\\\"\",\"\\\"c:\\\\users\\\\nilao\\\\downloads\\\"，这在没有gui的情况下将十分有用。\",\"\\\"comment\\\":\",\"\\\"comment\\\":\\\"我爱小猪佩奇\\\",\",\"\\\"cookie:mqguid\\\"\",\"\\\"cookie:sessionid=1236983428;cns=xpopqwe305|us\",\"\\\"copyright\\\":\",\"\\\"copyright\\\":\\\"\\\",\",\"\\\"d:\\\\myvideo\\\"\",\"\\\"di5rzxkaaaaaaaaaaaaaaa==\\\"\",\"\\\"encodingtool\\\":\",\"\\\"faststart\\\":\",\"\\\"faststart\\\":\\\"true\\\",\",\"\\\"http://127.0.0.1:8080\\\"\",\"\\\"http://x.x/1.m3u8\\\"\",\"\\\"http://x.x/1.m3u8\\\"将成为n_m3u8dl\",\"\\\"https://apd\",\"\\\"https://moviets.tc.qq.com/p0027jbwye1.321004.ts.m3u8?ver=4\\\"\",\"\\\"mp4\\\",\",\"\\\"muxformat\\\":\",\"\\\"muxformat\\\":\\\"mp4\\\",\",\"\\\"poster\\\":\",\"\\\"poster\\\":\\\"c:\\\\\\\\users\\\\\\\\nilao\\\\\\\\desktop\\\\\\\\小猪佩奇.jpg\\\",\",\"\\\"title\\\":\",\"\\\"title\\\":\\\"小猪佩奇第一集\\\",\",\"\\\"true\\\",\",\"\\\"小猪佩奇第一集\\\"\",\"\\\"文件路径，\\\\需写为\\\\\\\\\\\",\",\"#ext\",\"#extinf:12.000,\",\"#extinf:8.200,\",\"#extm3u\",\"&\",\"(default:\",\"(isom/iso2/avc1/mp41)\",\"(khtml,\",\"(window\",\"*.log\",\"+\",\".\",\"...\",\"0\",\"00:10:00\",\"00:23:00\",\"00:25:20\",\"00:25:20的内容\",\"00:30:00\",\"00_p0027jbwye1.321004.1.ts?index=0&start=0&end=12000&brs=0&bre=1137963&ver=4\",\"01:10:10\",\"01_p0027jbwye1.321004.1.ts?index=1&start=12000&end=24000&brs=1137964&bre=2658695&ver=4\",\"02_p0027jbwye1.321004.1.ts?index=2&start=24000&end=32200&brs=2658696&bre=3083011&ver=4\",\"07\",\"072\",\"08t23:12:46.9349258+08:00\",\"1\",\"1.将m3u8链接每行一个存入一个.txt文件，然后将文件直接拖到m3u8地址文本框，点击go按钮2.将m3u8文件存到一个文件夹中，然后将文件夹直接拖到m3u8地址文本框，点击go按钮3.新建txt,每行以name,url形式写\",\"10\",\"10)\",\"10.0;\",\"100\",\"100]\",\"10]\",\"128解密iv\",\"128解密key\",\"128解密，并使用输入的base64string来作为解密key\",\"128解密，并使用输入的文件来作为解密key\",\"15)\",\"16)\",\"1b75827c3b093392908ce37d3e2c2481.v.smtcdns.com/moviets.tc.qq.com/aaycnil6winh7t1jaihdfjn5ancf7q8mk3qxxqhl\",\"2\",\"2.0.4及以后版本的新功能。可以使你从一段视频中下载你想要的一部分，支持分片参数与时间码参数，具体的使用示例如下：\",\"2.5.1及以后版本的新功能。在直播录制时，这将非常有用。\",\"200\",\"2019\",\"2021年10月17日更新\",\"32)\",\"38.6\",\"4\",\"4.6框架开发，调用系统类库进行http下载，支持常见的m3u8格式下载，支持从视频中选择一部分下载，还提供丰富的命令行选项以增强其功能。\",\"4.6用于合并分片：ffmpeg\",\"5\",\"7ik/uwmrofz2r5xhiaqxgdgnc2df64gzxntmzvhtgq7mar8xuhpv/iha_kl1szfmdh7rlzcaoqn64fvvl3myzr20lmxkiua2qr7rgjvqms8k6gqi6vhwjuqmurctwxb6kdqyybhdsr1zgiadotcm5wbe36xn9cc34itm7zoyddjjhyh\",\":\",\"[options]\",\"accept\",\"agent\",\"agent:mozilla/5.0\",\"applewebkit/537.36\",\"base\",\"baseurl\",\"chacha20keybase64\",\"chacha20noncebase64\",\"chrome/63.0.3239.132\",\"cli\",\"cli.args.txt，存一些命令行参数，举个例子：\",\"cli/releas\",\"cli使用说明书\",\"cli是一款用于下载m3u8的命令行工具，基于.net\",\"cli，便能双击下载且能保证程序会按照一定的默认行为去正确地工作，像你期待的那样。\",\"cookie:sessionid=1236983428;cns=xpopqwe305\",\"disabledateinfo\",\"disableintegritycheck\",\"display\",\"download\",\"downloadrang\",\"enableaudioonli\",\"enablebinarymerg\",\"enablechacha20\",\"enabledelafterdon\",\"enablemuxfaststart\",\"enableparseonli\",\"endlist\",\"framework\",\"gecko)\",\"header\",\"help\",\"http://127.0.0.1:8080\",\"https://github.com/nilaoda/n_m3u8dl\",\"information.\",\"isom\",\"js获取m3u8\",\"kb/\",\"key:valu\",\"lavf58.20.100\",\"liverecdur\",\"log\",\"m3u8url2fil\",\"maxspe\",\"maxthread\",\"maxthreads和\",\"media\",\"mib\",\"minthread\",\"minthreads指定，默认情况下，这两个值分别是32和16，你可以手动指定它，例如下列命令可将程序线程限制到1：\",\"mpeg\",\"muxsetjson\",\"n_m3u8dl\",\"nilaoda\",\"nomerg\",\"noproxi\",\"noproxy时，此处设置将不生效\",\"nt\",\"options:\",\"playlist\",\"proxyaddress\",\"rang\",\"refer\",\"registerurlprotocol\",\"retrycount\",\"s\",\"safari/537.36\",\"safari/537.36\\\"\",\"savenam\",\"screen.\",\"sequence:0\",\"simpleg.exe来自动化生产绝大部分参数，大大提高了下载效率。\",\"simplegui\",\"stopspe\",\"targetduration:15\",\"timeout\",\"type:vod\",\"unregisterurlprotocol\",\"usage:\",\"usekeybase64\",\"usekeyfil\",\"usekeyiv\",\"user\",\"version\",\"version:3\",\"wfetswfstxa4ijpzcxytycvcrlfiybddiygqnjisijsbu_m0/\\\"\",\"windows7以上系统\",\"workdir\",\"wow64)\",\"x\",\"ye\",\"{\",\"|\",\"}\",\"└──\",\"├──\",\"一款帮助你将m3u8链接下载为m3u8文件的小软件。https://github.com/nilaoda/m3u8url2file/releas\",\"下载视频00:23:00\",\"下载视频的30分钟到结束的内容\",\"下载视频的前10分钟的内容\",\"下载视频的第0个分片到第100个分片，即[0\",\"下载视频的第0个分片到第10个分片，即[0\",\"下载视频的第200个分片到最后一个分片\",\"不检测分片数量是否完整\",\"不自动使用系统代理\",\"不限速\",\"为了丰富软件功能，我提供了很多命令行参数，在本页我将详细介绍这些参数的作用。\",\"仅下载视频的一部分分片或长度\",\"你可以将.m3u8文件的默认打开方式设置为n_m3u8dl\",\"你可能不知道\",\"使用base64字符串定义a\",\"使用hex字符串定义a\",\"使用javascript获取m3u8\",\"使用|分割不同的key&valu\",\"使用入门\",\"使用命令行参数\",\"使用外部16字节文件定义ae\",\"使用外部json文件定义混流选项\",\"使用本命令后，合并生成的mp4文件将能够在网络传输时边下边看，适用于流媒体。缺点是合并时间会变慢。本命令无需任何参数。\",\"使用本命令后，所有关于mp4合并的参数将会失效，程序将采用二进制合并，即直接拼接服务器提供的raw流，不使用ffmpeg进行混流。本命令无需任何参数。\",\"使用本命令后，程序将只分析用户输入的m3u8文件而不进行下载。本命令无需任何参数。\",\"使用本命令后，程序将只合并音频轨道。本命令无需任何参数。\",\"例如你想要将一个图片作为视频的海报，同时为视频添加标题，你可以在桌面新建一个小猪佩奇.json，并在文件中写入如下内容：\",\"例如，下列命令将使你的视频保存为小猪佩奇第一集.mp4\",\"关闭混流中的日期写入\",\"分\",\"功能说明\",\"发布页面\",\"取消注册m3u8dl链接协议\",\"合并时仅封装音频轨道\",\"命令行参数\",\"在m3u8地址文本框或视频标题文本框按下回车键时，可触发下载；亦或者在程序界面按下快捷键alt\",\"在mediainfo中，显示如下：\",\"如\",\"如芒果tv的m3u8会验证cookie，必须含有mqguid才能正确访问下载，你可以这样指定：\",\"封面\",\"小猪佩奇第一集\",\"平均混合码率\",\"开启下载后删除临时文件夹的功能\",\"开启二进制合并分片\",\"开启仅解析模式(程序只进行到meta.json)\",\"开启混流mp4的faststart特性\",\"强制使用ae\",\"当m3u8地址文本框不为空时，双击视频标题文本框时，程序将自动识别您输入的m3u8地址并给出一个合适的标题\",\"当下载速度低于此值(单位为kb/s)时，程序进入重试阶段。默认值为0\",\"当然，支持自定义多种请求头，使用|分隔，例如：\",\"当速度低于此值时，重试(单位为kb/s)\",\"录制日期\",\"必要的，它意味着程序将从哪里接收一个地址、文件以开始下载。例如，下列命令将使从指定地址下载一个视频：\",\"我爱小猪佩奇\",\"或我编译的精简版\",\"所需运行时环境：.net\",\"持续时间\",\"指定一个json文件用于混流，能够识别的格式如下：\",\"指定程序最大重试次数。某些时候我们并不能一次性成功下载所有分片，在一次任务结束后，程序会检测已下载的ts分片数量和m3u8文件中的分片数量是否相等，不一致则进入重试环节。默认值为15\",\"指定程序进行网络请求的超时时长，默认值为10秒\",\"支持批量下载\",\"文件大小\",\"本命令无需任何参数。\",\"某些时候，视频服务器会阻止你的请求，除非你能够伪造一些请求头，本命令即可伪造一些请求头，目前支持大部分常见请求头：\",\"格式\",\"格式概况\",\"欢迎使用simplegui\",\"此命令将指定视频保存的位置，参数是一个文件夹路径。例如，下列命令将使你的视频保存至d:\\\\myvideo：\",\"此命令将指定视频保存的名称，参数是一个有效字符串。通常情况下，视频名称由程序自动识别，假如你想自定义一个名字，可以使用本命令。\",\"此命令常用于下载本地m3u8文件，例如：\",\"此时，如果你的参数只有0个(双击打开程序)或1个(使用命令行调用且只输入了m3u8地址)，程序会自动补充参数，例如n_m3u8dl\",\"注册m3u8dl链接协议\",\"注意，当启用\",\"注意：在使用时间码参数时，格式必须为00:00:00才能被程序正确识别\",\"然后使用如下命令使用它：\",\"现在你可以在程序exe目录下新建n_m3u8dl\",\"用于开启程序的下载完成后自动删除临时目录功能，无需任何参数。\",\"电影名称\",\"直播录制时，达到此长度自动退出软件(hh:mm:ss)\",\"直播流录制长度为10分钟\",\"直播流录制长度为1小时10分钟10秒\",\"禁用自动合并\",\"秒\",\"程序依赖\",\"程序在启动时会自动从剪贴板中寻找url，贴入m3u8地址文本框\",\"程序界面\",\"程序的下载线程数可由\",\"程序默认将视频文件放在了exe同目录的downloads文件夹中，将程序运行日志信息放在了logs目录中。\",\"第一个参数\",\"简介\",\"系统支持\",\"编码程序\",\"编解码器id\",\"自动保存配置\",\"让我们开始吧\",\"设定baseurl\",\"设定存储文件名(不包括后缀)\",\"设定程序工作目录\",\"设定程序的最大线程数\",\"设定程序的最小线程数\",\"设定程序的重试次数\",\"设定程序网络请求的超时时间(单位为秒)\",\"设定请求头，格式\",\"设置http/socks5代理,\",\"设置http代理，配合代理软件使用。默认情况下，程序会使用系统代理；现在你可以自定义一个http地址用作代理了。\",\"设置下载速度上限(单位为kb/s)\",\"设置下载速度上限(单位为kb/s)。默认值为0,\",\"评论\",\"这样可以使程序使用如下请求头：\",\"这样的m3u8文件是无法直接下载的，你需要指定对应的baseurl，就像这样：\",\"这样，你的视频将在windows文件资源管理器中呈现出这样的效果：\",\"这里变得空空如也...\",\"鉴于大部分用户在使用命令行程序时感受到比较繁琐的操作体验，我开发了n_m3u8dl\",\"首先，最简单的使用方式是直接双击exe，将你要下载的m3u8文件或m3u8链接复制进去，然后按下回车键。就像这样：正常情况下，程序将产生如下的目录结构：\",\"首先，第一个参数是\",\"默认情况下，下载合并生成的mp4文件会默认加入一个录制日期，你可以使用本命令来规避此操作。本命令无需任何参数。\",\"默认情况下，下载后会自动合并为mp4文件，你可以使用本命令来规避此操作。本命令无需任何参数。\",\"默认情况下，下载器会使用当前系统的代理设置，你可以使用本命令来规避此操作。本命令无需任何参数。\",\"默认情况下，下载器在下载过程完毕后，会提取下载目录所有ts文件数量与meta.json中读取到的文件数量做比对，如果数量不一致(这意味着丢失了某些分片)，程序将进入重试阶段。你可以使用此选项来规避此操作(不推荐)。\"],\"pipeline\":[\"stopWordFilter\",\"stemmer\"]},\"store\":{\"./\":{\"url\":\"./\",\"title\":\"简介\",\"keywords\":\"\",\"body\":\"N_m3u8DL-CLI使用说明书\\n2021年10月17日更新 | nilaoda\\n  \\nN_m3u8DL-CLI是一款用于下载m3u8的命令行工具，基于.NET Framework 4.6框架开发，调用系统类库进行HTTP下载，支持常见的m3u8格式下载，支持从视频中选择一部分下载，还提供丰富的命令行选项以增强其功能。  \\n系统支持\\n\\nWindows7以上系统\\n\\n程序依赖\\n所需运行时环境：.NET Framework 4.6用于合并分片：ffmpeg 或我编译的精简版\\n发布页面\\nhttps://github.com/nilaoda/N_m3u8DL-CLI/releases\\n\"},\"Introductory.html\":{\"url\":\"Introductory.html\",\"title\":\"使用入门\",\"keywords\":\"\",\"body\":\"让我们开始吧\\n首先，最简单的使用方式是直接双击EXE，将你要下载的m3u8文件或m3u8链接复制进去，然后按下回车键。就像这样：正常情况下，程序将产生如下的目录结构：\\n.\\n├── Downloads\\n└── Logs\\n    └── *.log\\n程序默认将视频文件放在了EXE同目录的Downloads文件夹中，将程序运行日志信息放在了Logs目录中。\\n\"},\"Advanced.html\":{\"url\":\"Advanced.html\",\"title\":\"命令行参数\",\"keywords\":\"\",\"body\":\"使用命令行参数\\n为了丰富软件功能，我提供了很多命令行参数，在本页我将详细介绍这些参数的作用。\\nN_m3u8DL-CLI\\n\\nUSAGE:\\n\\n  N_m3u8DL-CLI  [OPTIONS]\\n\\nOPTIONS:\\n\\n  --workDir                  设定程序工作目录\\n  --saveName                 设定存储文件名(不包括后缀)\\n  --baseUrl                  设定Baseurl\\n  --headers                  设定请求头，格式 key:value 使用|分割不同的key&value\\n  --maxThreads               (Default: 32) 设定程序的最大线程数\\n  --minThreads               (Default: 16) 设定程序的最小线程数\\n  --retryCount               (Default: 15) 设定程序的重试次数\\n  --timeOut                  (Default: 10) 设定程序网络请求的超时时间(单位为秒)\\n  --muxSetJson               使用外部json文件定义混流选项\\n  --useKeyFile               使用外部16字节文件定义AES-128解密KEY\\n  --useKeyBase64             使用Base64字符串定义AES-128解密KEY\\n  --useKeyIV                 使用HEX字符串定义AES-128解密IV\\n  --downloadRange            仅下载视频的一部分分片或长度\\n  --liveRecDur               直播录制时，达到此长度自动退出软件(HH:MM:SS)\\n  --stopSpeed                当速度低于此值时，重试(单位为KB/s)\\n  --maxSpeed                 设置下载速度上限(单位为KB/s)\\n  --proxyAddress             设置HTTP/SOCKS5代理, 如 http://127.0.0.1:8080\\n  --enableDelAfterDone       开启下载后删除临时文件夹的功能\\n  --enableMuxFastStart       开启混流mp4的FastStart特性\\n  --enableBinaryMerge        开启二进制合并分片\\n  --enableParseOnly          开启仅解析模式(程序只进行到meta.json)\\n  --enableAudioOnly          合并时仅封装音频轨道\\n  --disableDateInfo          关闭混流中的日期写入\\n  --disableIntegrityCheck    不检测分片数量是否完整\\n  --noMerge                  禁用自动合并\\n  --noProxy                  不自动使用系统代理\\n  --registerUrlProtocol      注册m3u8dl链接协议\\n  --unregisterUrlProtocol    取消注册m3u8dl链接协议\\n  --enableChaCha20           enableChaCha20\\n  --chaCha20KeyBase64        ChaCha20KeyBase64\\n  --chaCha20NonceBase64      ChaCha20NonceBase64\\n  --help                     Display this help screen.\\n  --version                  Display version information.\\n第一个参数\\n首先，第一个参数是 必要的，它意味着程序将从哪里接收一个地址、文件以开始下载。例如，下列命令将使从指定地址下载一个视频：  \\nN_m3u8DL-CLI \\\"https://moviets.tc.qq.com/p0027jbwye1.321004.ts.m3u8?ver=4\\\"\\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\小猪佩奇第一集.m3u8\\\"\\n--workDir\\n此命令将指定视频保存的位置，参数是一个文件夹路径。例如，下列命令将使你的视频保存至D:\\\\MyVideo：\\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\小猪佩奇第一集.m3u8\\\" --workDir \\\"D:\\\\MyVideo\\\"\\n--saveName\\n此命令将指定视频保存的名称，参数是一个有效字符串。通常情况下，视频名称由程序自动识别，假如你想自定义一个名字，可以使用本命令。\\n例如，下列命令将使你的视频保存为小猪佩奇第一集.mp4\\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\小猪佩奇第一集.m3u8\\\" --saveName \\\"小猪佩奇第一集\\\"\\n--baseUrl\\n此命令常用于下载本地m3u8文件，例如：\\n#EXTM3U\\n#EXT-X-VERSION:3\\n#EXT-X-MEDIA-SEQUENCE:0\\n#EXT-X-TARGETDURATION:15\\n#EXT-X-PLAYLIST-TYPE:VOD\\n#EXTINF:12.000,\\n00_p0027jbwye1.321004.1.ts?index=0&start=0&end=12000&brs=0&bre=1137963&ver=4\\n#EXTINF:12.000,\\n01_p0027jbwye1.321004.1.ts?index=1&start=12000&end=24000&brs=1137964&bre=2658695&ver=4\\n#EXTINF:8.200,\\n02_p0027jbwye1.321004.1.ts?index=2&start=24000&end=32200&brs=2658696&bre=3083011&ver=4\\n...\\n...\\n#EXT-X-ENDLIST\\n这样的m3u8文件是无法直接下载的，你需要指定对应的baseUrl，就像这样：\\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\raw.m3u8\\\" --baseUrl \\\"https://apd-1b75827c3b093392908ce37d3e2c2481.v.smtcdns.com/moviets.tc.qq.com/AaycNil6WINh7T1JAIHdFjn5ANcF7Q8mk3QXxQHl-7Ik/uwMROfz2r5xhIaQXGdGnC2df64gZXNTMZvhtgq7maR8xuHpV/ihA_Kl1SzFmdh7RlzCAOqn64fVVL3Myzr20LmxKiuA2qr7rgjvqMS8k6gQI6VHwjuQMUrctWXB6kDQYYbHDsR1ZGIaDOtcm5wbE36xN9CC34Itm7ZoYdDjJHYH-wfETSwFsTXa4iJpZcXytyCVCRlFIyBdDIYgqNJiSIJsBu_m0/\\\"\\n--headers\\n某些时候，视频服务器会阻止你的请求，除非你能够伪造一些请求头，本命令即可伪造一些请求头，目前支持大部分常见请求头：\\nReferer\\nUser-Agent\\nRange\\nAccept\\n...\\n如芒果TV的m3u8会验证Cookie，必须含有MQGUID才能正确访问下载，你可以这样指定：\\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\小猪佩奇第一集(MGTV).m3u8\\\" --headers \\\"Cookie:MQGUID\\\"\\n当然，支持自定义多种请求头，使用|分隔，例如：\\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\M.m3u8\\\" --headers \\\"Cookie:sessionId=1236983428;cns=xpopqwe305|User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\\\"\\n这样可以使程序使用如下请求头：\\n...\\nCookie:sessionId=1236983428;cns=xpopqwe305\\nUser-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\\n...\\n--maxThreads & --minThreads\\n程序的下载线程数可由--maxThreads和--minThreads指定，默认情况下，这两个值分别是32和16，你可以手动指定它，例如下列命令可将程序线程限制到1：\\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\小猪佩奇第一集.m3u8\\\" --maxThreads 1 --minThreads 1\\n--retryCount\\n指定程序最大重试次数。某些时候我们并不能一次性成功下载所有分片，在一次任务结束后，程序会检测已下载的TS分片数量和m3u8文件中的分片数量是否相等，不一致则进入重试环节。默认值为15\\n--timeOut\\n指定程序进行网络请求的超时时长，默认值为10秒\\n--muxSetJson\\n指定一个json文件用于混流，能够识别的格式如下：\\n{\\n    \\\"muxFormat\\\": \\\"mp4\\\", \\n    \\\"fastStart\\\": \\\"True\\\", \\n    \\\"poster\\\": \\\"文件路径，\\\\需写为\\\\\\\\\\\", \\n    \\\"audioName\\\": \\\"\\\", \\n    \\\"title\\\": \\\"\\\", \\n    \\\"copyright\\\": \\\"\\\", \\n    \\\"comment\\\": \\\"\\\"\\n}\\n例如你想要将一个图片作为视频的海报，同时为视频添加标题，你可以在桌面新建一个小猪佩奇.json，并在文件中写入如下内容：\\n{\\n    \\\"muxFormat\\\":\\\"mp4\\\",\\n    \\\"fastStart\\\":\\\"True\\\",\\n    \\\"poster\\\":\\\"C:\\\\\\\\Users\\\\\\\\nilao\\\\\\\\Desktop\\\\\\\\小猪佩奇.jpg\\\",\\n    \\\"audioName\\\":\\\"\\\",\\n    \\\"title\\\":\\\"小猪佩奇第一集\\\",\\n    \\\"copyright\\\":\\\"\\\",\\n    \\\"comment\\\":\\\"我爱小猪佩奇\\\",\\n    \\\"encodingTool\\\": \\\"\\\"\\n}\\n然后使用如下命令使用它：\\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\小猪佩奇第一集.m3u8\\\" --saveName \\\"小猪佩奇第一集\\\" --muxSetJson \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\小猪佩奇.json\\\"\\n这样，你的视频将在Windows文件资源管理器中呈现出这样的效果：  \\n\\n在Mediainfo中，显示如下：\\n格式                                       : MPEG-4\\n格式概况                                     : Base Media\\n编解码器ID                                   : isom (isom/iso2/avc1/mp41)\\n文件大小                                     : 38.6 MiB\\n持续时间                                     : 5 分 2 秒\\n平均混合码率                                   : 1 072 kb/s\\n电影名称                                     : 小猪佩奇第一集\\n录制日期                                     : 2019-07-08T23:12:46.9349258+08:00\\n编码程序                                     : Lavf58.20.100\\n封面                                       : Yes\\n评论                                       : 我爱小猪佩奇\\n--useKeyBase64\\n强制使用AES-128解密，并使用输入的Base64String来作为解密KEY\\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\AES.m3u8\\\" --useKeyBase64 \\\"di5rZXkAAAAAAAAAAAAAAA==\\\"\\n--useKeyFile\\n强制使用AES-128解密，并使用输入的文件来作为解密KEY\\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\AES.m3u8\\\" --useKeyFile \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\key\\\"\\n--downloadRange\\n2.0.4及以后版本的新功能。可以使你从一段视频中下载你想要的一部分，支持分片参数与时间码参数，具体的使用示例如下：\\n--downloadRange 0-10\\n下载视频的第0个分片到第10个分片，即[0-10]\\n\\n--downloadRange 200-\\n下载视频的第200个分片到最后一个分片\\n\\n--downloadRange  -100\\n下载视频的第0个分片到第100个分片，即[0-100]\\n\\n--downloadRange 00:23:00-00:25:20\\n下载视频00:23:00-00:25:20的内容\\n\\n--downloadRange -00:10:00\\n下载视频的前10分钟的内容\\n\\n--downloadRange 00:30:00-\\n下载视频的30分钟到结束的内容\\n\\n注意：在使用时间码参数时，格式必须为00:00:00才能被程序正确识别\\n--liveRecDur\\n2.5.1及以后版本的新功能。在直播录制时，这将非常有用。\\n--downloadRange 00:10:00\\n直播流录制长度为10分钟\\n\\n--downloadRange 01:10:10\\n直播流录制长度为1小时10分钟10秒\\n--stopSpeed\\n当下载速度低于此值(单位为KB/s)时，程序进入重试阶段。默认值为0\\n--maxSpeed\\n设置下载速度上限(单位为KB/s)。默认值为0, 不限速\\n--proxyAddress\\n设置HTTP代理，配合代理软件使用。默认情况下，程序会使用系统代理；现在你可以自定义一个http地址用作代理了。  \\nN_m3u8DL-CLI \\\"C:\\\\Users\\\\nilao\\\\Desktop\\\\小猪佩奇第一集.m3u8\\\" --saveName \\\"小猪佩奇第一集\\\" --proxyAddress \\\"http://127.0.0.1:8080\\\"\\n注意，当启用--noProxy时，此处设置将不生效\\n--enableDelAfterDone\\n用于开启程序的下载完成后自动删除临时目录功能，无需任何参数。\\n--enableMuxFastStart\\n使用本命令后，合并生成的mp4文件将能够在网络传输时边下边看，适用于流媒体。缺点是合并时间会变慢。本命令无需任何参数。\\n--enableBinaryMerge\\n使用本命令后，所有关于mp4合并的参数将会失效，程序将采用二进制合并，即直接拼接服务器提供的Raw流，不使用ffmpeg进行混流。本命令无需任何参数。\\n--enableParseOnly\\n使用本命令后，程序将只分析用户输入的m3u8文件而不进行下载。本命令无需任何参数。\\n--enableAudioOnly\\n使用本命令后，程序将只合并音频轨道。本命令无需任何参数。\\n--disableDateInfo\\n默认情况下，下载合并生成的mp4文件会默认加入一个录制日期，你可以使用本命令来规避此操作。本命令无需任何参数。\\n--noMerge\\n默认情况下，下载后会自动合并为mp4文件，你可以使用本命令来规避此操作。本命令无需任何参数。\\n--noProxy\\n默认情况下，下载器会使用当前系统的代理设置，你可以使用本命令来规避此操作。本命令无需任何参数。\\n--disableIntegrityCheck\\n默认情况下，下载器在下载过程完毕后，会提取下载目录所有ts文件数量与meta.json中读取到的文件数量做比对，如果数量不一致(这意味着丢失了某些分片)，程序将进入重试阶段。你可以使用此选项来规避此操作(不推荐)。\\n本命令无需任何参数。\\n你可能不知道\\n现在你可以在程序EXE目录下新建N_m3u8DL-CLI.args.txt，存一些命令行参数，举个例子：\\n--enableDelAfterDone --disableDateInfo --noProxy --workDir \\\"C:\\\\Users\\\\nilao\\\\Downloads\\\"\\n此时，如果你的参数只有0个(双击打开程序)或1个(使用命令行调用且只输入了m3u8地址)，程序会自动补充参数，例如N_m3u8DL-CLI \\\"http://x.x/1.m3u8\\\"将成为N_m3u8DL-CLI \\\"http://x.x/1.m3u8\\\" --enableDelAfterDone --disableDateInfo --noProxy --workDir \\\"C:\\\\Users\\\\nilao\\\\Downloads\\\"，这在没有GUI的情况下将十分有用。  \\n你可以将.m3u8文件的默认打开方式设置为N_m3u8DL-CLI，便能双击下载且能保证程序会按照一定的默认行为去正确地工作，像你期待的那样。\\n\"},\"SimpleGUI.html\":{\"url\":\"SimpleGUI.html\",\"title\":\"SimpleGUI\",\"keywords\":\"\",\"body\":\"欢迎使用SimpleGUI\\n简介\\n鉴于大部分用户在使用命令行程序时感受到比较繁琐的操作体验，我开发了N_m3u8DL-CLI-SimpleG.exe来自动化生产绝大部分参数，大大提高了下载效率。\\n程序界面\\n\\n功能说明\\n\\n程序在启动时会自动从剪贴板中寻找URL，贴入M3U8地址文本框\\n当M3U8地址文本框不为空时，双击视频标题文本框时，程序将自动识别您输入的m3u8地址并给出一个合适的标题\\n支持批量下载\\n1.将m3u8链接每行一个存入一个.txt文件，然后将文件直接拖到M3U8地址文本框，点击GO按钮2.将m3u8文件存到一个文件夹中，然后将文件夹直接拖到M3U8地址文本框，点击GO按钮3.新建txt,每行以name,url形式写\\n\\n\\n在M3U8地址文本框或视频标题文本框按下回车键时，可触发下载；亦或者在程序界面按下快捷键Alt + S\\n自动保存配置\\n\\n\"},\"GetM3u8.html\":{\"url\":\"GetM3u8.html\",\"title\":\"JS获取m3u8\",\"keywords\":\"\",\"body\":\"使用Javascript获取m3u8\\n这里变得空空如也...\\n\"},\"M3U8URL2File.html\":{\"url\":\"M3U8URL2File.html\",\"title\":\"M3U8URL2File\",\"keywords\":\"\",\"body\":\"M3U8URL2File\\n一款帮助你将m3u8链接下载为m3u8文件的小软件。https://github.com/nilaoda/M3U8URL2File/releases\\n程序界面\\n\\n\"}}}"
  }
]