// This is a TextMate grammar distributed by `starry-night`. // This grammar is developed at // // and licensed `isc`. // See for more info. /** * @import {Grammar} from '@wooorm/starry-night' */ /** @type {Grammar} */ const grammar = { dependencies: ['etc', 'source.hosts'], extensions: [], injections: { 'L:source.torrc meta.entry.accountingstart.torrc': { patterns: [ { captures: { 1: {patterns: [{include: '#unit'}]}, 2: {name: 'constant.numeric.day-of-month.torrc'}, 3: {name: 'constant.numeric.time.torrc'}, 4: {name: 'punctuation.separator.time.torrc'} }, match: '(?i)(?<=AccountingStart)\\s+(day|week|month)(?:\\s+(\\d{1,2}))?\\s+((?:\\d{2}(:)\\d{2}))(?=\\s*(?:$|#))' } ] }, 'L:source.torrc meta.entry.controlsocket.torrc': { patterns: [ { captures: {1: {name: 'constant.numeric.disable-option.torrc'}}, match: '(?i)(?<=ControlSocket)\\s+(0)(?=\\s*(?:$|#))' } ] }, 'L:source.torrc meta.entry.schedulers.torrc': { patterns: [ { captures: { 1: { patterns: [ {match: '\\w+', name: 'constant.language.scheduler-type.torrc'}, {include: 'etc#comma'} ] } }, match: '(?i)(?<=Schedulers)\\s+(?!\\s*,\\s*)((?:\\s*(?:,\\s*)?(?:KISTLite|KIST|Vanilla))++)(?=\\s*(?:$|#))' } ] }, 'L:source.torrc source.embedded.abnf meta.ruleset': { patterns: [ { match: '(?<==)\\s+(Any character except.+)', name: 'string.comment.freeform-rule-specifier.abnf' } ] } }, names: ['tor-config', 'torrc'], patterns: [ { applyEndPatternLast: true, begin: '\\A(?=[ \\t]*$|This document)', end: '(?=\\S)', patterns: [ { begin: '^(?=This document specifies the current format and semantics of the torrc)', end: '(?=A)B', name: 'meta.document.torrc-spec', patterns: [ { begin: '(?i)^(\\s*)((1\\.)\\s+File\\s+Syntax)[ \\t]*$', beginCaptures: { 1: { name: 'punctuation.whitespace.leading.indentation.torrc-spec' }, 2: {name: 'markup.heading.1.numbered.torrc-spec'}, 3: {name: 'constant.numeric.section-number.torrc-spec'} }, contentName: 'source.embedded.abnf', end: '(?=^(?:(?!\\s)|\\1)(?:\\d+\\.)+\\s+)', name: 'meta.section.file-syntax.torrc-spec', patterns: [{include: 'source.abnf'}] }, { begin: '(?i)^(\\s*)(((?:\\d+\\.){2})\\s+Syntax\\s+examples)[ \\t]*$', beginCaptures: { 1: { name: 'punctuation.whitespace.leading.indentation.torrc-spec' }, 2: {name: 'markup.heading.2.numbered.torrc-spec'}, 3: {name: 'constant.numeric.section-number.torrc-spec'} }, contentName: 'source.embedded.torrc', end: '(?=A)B', name: 'meta.section.syntax-examples.torrc-spec', patterns: [{include: 'source.torrc#main'}] }, { begin: '(?i)^(\\s*)((\\d+\\.)\\s+(?!Syntax\\s+examples\\s*$)\\S.*)[ \\t]*$', beginCaptures: { 1: { name: 'punctuation.whitespace.leading.indentation.torrc-spec' }, 2: {name: 'markup.heading.1.numbered.torrc-spec'}, 3: {name: 'constant.numeric.section-number.torrc-spec'} }, contentName: 'text.embedded.plain', end: '(?=^(?:(?!\\s)|\\1)(?:\\d+\\.)+\\s+)', name: 'meta.section.other.torrc-spec', patterns: [] } ] } ] }, {include: '#main'} ], repository: { address: { patterns: [ { captures: { 1: {patterns: [{include: 'source.hosts#modern'}]}, 2: {patterns: [{include: 'etc#colon'}]}, 3: {name: 'punctuation.definition.address.begin.torrc'}, 4: {patterns: [{include: 'etc#ipv4'}]}, 5: {patterns: [{include: 'etc#ipv6'}]}, 6: {patterns: [{include: '#port'}]}, 7: {name: 'punctuation.definition.address.end.torrc'} }, match: '(?ix)\n(?:\n\t# “hostname:…”\n\t([^\\[\\]\\s:#,]+) (:)\n\t|\n\t# No first part, just match anything that quacks like an IP addy\n\t(?=\\[)\n)\n\n# DRY and TextMate-friendly hack to assert balanced but optional brackets\n(?:\n\t# If an opening bracket follows, require an accompanying closing bracket \n\t(?= \\[ [^\\[\\]\\s,\\#]*+ \\])\n\t|\n\t# Otherwise, avoid matching unbalanced brackets\n\t(?!\\[)\n)\n\n(\\[)?\n(?: (\\d{1,3}(?:\\.\\d{1,3})+) # IPv4 address\n| (:*[0-9A-F]+(?::+[0-9A-F]*)*+) # IPv6 address\n| (\\d+) # Port?\n)\n(\\])?\n(?=\\s|,|$|\\#)', name: 'meta.address.torrc' }, { captures: { 1: {name: 'punctuation.definition.ipv6-address.begin.torrc'}, 2: {patterns: [{include: 'etc#ipv6'}]}, 3: {name: 'punctuation.definition.ipv6-address.end.torrc'}, 4: {name: 'meta.cidr-notation'}, 5: {name: 'keyword.operator.assignment.cidr'}, 6: {patterns: [{include: 'etc#intNoExp'}]} }, match: '(\\[)([^\\[\\]]+)(\\])((/)(\\d+))' } ] }, anyIP: { captures: { 0: { patterns: [ { match: '\\*(\\d)', name: 'keyword.operator.wildcard.match-ipv$1.torrc' }, {match: '\\*', name: 'keyword.operator.wildcard.match-all.torrc'}, {include: 'etc#colon'} ] } }, match: '\\*[46]?(?::\\*)?' }, cc: { captures: { 1: {name: 'punctuation.definition.country-code.begin.torrc'}, 3: {name: 'constant.character.escape.wildcard.match-any.torrc'}, 4: {name: 'punctuation.definition.country-code.end.torrc'} }, match: '(\\{)(?:([A-Za-z]{2})|(\\?\\?))(\\})', name: 'constant.language.country-code.${2:/downcase}.torrc' }, comment: { begin: '#', beginCaptures: {0: {name: 'punctuation.definition.comment.torrc'}}, end: '$', name: 'comment.line.number-sign.torrc' }, commentEmbedded: { begin: '[ \\t]*(?=#)', contentName: 'comment.line.number-sign.embedded.torrc', end: '(?!\\G)^', patterns: [{match: '\\G#', name: 'punctuation.definition.comment.torrc'}] }, entry: { begin: '^\\s*(?:(/)|(\\+))?((?:[^\\s#\\0\\\\]|\\\\(?!$))++)', beginCaptures: { 1: {name: 'keyword.operator.flag.clear-value.torrc'}, 2: {name: 'keyword.operator.flag.append-value.torrc'}, 3: {name: 'variable.assignment.entry.torrc'} }, end: '(?!\\G)', name: 'meta.entry.${3:/downcase/asciify}.torrc', patterns: [ { begin: '(?ix)\n# Unitless\n(?<= AddressDisableIPv6\n| AllowNonRFC953Hostnames\n| AssumeReachableIPv6\n| AssumeReachable\n| AuthDirHasIPv6Connectivity\n| AuthDirListBadExits\n| AuthDirListMiddleOnly\n| AuthDirMaxServersPerAddr\n| AuthDirPinKeys\n| AuthDirRejectRequestsUnderLoad\n| AuthDirSharedRandomness\n| AuthDirTestEd25519LinkKeys\n| AuthDirTestReachability\n| AuthoritativeDirectory\n| AutomapHostsOnResolve\n| AvoidDiskWrites\n| BridgeAuthoritativeDir\n| BridgeRecordUsageByCountry\n| BridgeRelay\n| CacheDirectoryGroupReadable\n| CellStatistics\n| CircuitBuildTimeout\n| CircuitPadding\n| CircuitPriorityHalflife\n| CircuitStreamTimeout\n| CircuitsAvailableTimeout\n| ClientBootstrapConsensusAuthorityDownloadInitialDelay\n| ClientBootstrapConsensusAuthorityOnlyDownloadInitialDelay\n| ClientBootstrapConsensusFallbackDownloadInitialDelay\n| ClientBootstrapConsensusMaxInProgressTries\n| ClientDNSRejectInternalAddresses\n| ClientOnly\n| ClientPreferIPv6DirPort\n| ClientPreferIPv6ORPort\n| ClientRejectInternalAddresses\n| ClientUseIPv4\n| ClientUseIPv6\n| CompiledProofOfWorkHash\n| ConfluxEnabled\n| ConnDirectionStatistics\n| ConnLimit\n| ConnectionPadding\n| ConstrainedSockets\n| ControlPortFileGroupReadable\n| ControlSocketsGroupWritable\n| CookieAuthFileGroupReadable\n| CookieAuthentication\n| CountPrivateBandwidth\n| DataDirectoryGroupReadable\n| DirAllowPrivateAddresses\n| DirAuthorityFallbackRate\n| DirCache\n| DirReqStatistics\n| DisableAllSwap\n| DisableDebuggerAttachment\n| DisableNetwork\n| DisableOOSCheck\n| DoSCircuitCreationBurst\n| DoSCircuitCreationDefenseType\n| DoSCircuitCreationEnabled\n| DoSCircuitCreationMinConnections\n| DoSCircuitCreationRate\n| DoSConnectionConnectBurst\n| DoSConnectionConnectRate\n| DoSConnectionDefenseType\n| DoSConnectionEnabled\n| DoSConnectionMaxConcurrentCount\n| DoSRefuseSingleHopClientRendezvous\n| DoSStreamCreationBurst\n| DoSStreamCreationDefenseType\n| DoSStreamCreationEnabled\n| DoSStreamCreationRate\n| DormantCanceledByStartup\n| DormantOnFirstStartup\n| DormantTimeoutDisabledByIdleStreams\n| DormantTimeoutEnabled\n| DownloadExtraInfo\n| EnforceDistinctSubnets\n| EntryStatistics\n| ExitPolicyRejectLocalInterfaces\n| ExitPolicyRejectPrivate\n| ExitPortStatistics\n| ExitRelay\n| ExtORPortCookieAuthFileGroupReadable\n| ExtendAllowPrivateAddresses\n| ExtendByEd25519ID\n| ExtraInfoStatistics\n| FascistFirewall\n| FetchDirInfoEarly\n| FetchDirInfoExtraEarly\n| FetchHidServDescriptors\n| FetchServerDescriptors\n| FetchUselessDescriptors\n| GeoIPExcludeUnknown\n| HardwareAccel\n| HiddenServiceAllowUnknownPorts\n| HiddenServiceDirGroupReadable\n| HiddenServiceEnableIntroDoSBurstPerSec\n| HiddenServiceEnableIntroDoSDefense\n| HiddenServiceEnableIntroDoSRatePerSec\n| HiddenServiceMaxStreamsCloseCircuit\n| HiddenServiceMaxStreams\n| HiddenServiceNonAnonymousMode\n| HiddenServiceNumIntroductionPoints\n| HiddenServiceOnionBalanceInstance\n| HiddenServicePoWDefensesEnabled\n| HiddenServicePoWQueueBurst\n| HiddenServicePoWQueueRate\n| HiddenServiceSingleHopMode\n| HiddenServiceStatistics\n| HiddenServiceVersion\n| IPv6Exit\n| KISTSockBufSizeFactor\n| KeepBindCapabilities\n| KeepalivePeriod\n| KeyDirectoryGroupReadable\n| LearnCircuitBuildTimeout\n| LogMessageDomains\n| LogTimeGranularity\n| MainloopStats\n| MaxCircuitDirtiness\n| MaxClientCircuitsPending\n| MinMeasuredBWsForAuthToIgnoreAdvertised\n| NewCircuitPeriod\n| NoExec\n| NumCPUs\n| NumDirectoryGuards\n| NumEntryGuards\n| NumPrimaryGuards\n| OfflineMasterKey\n| OverloadStatistics\n| PaddingStatistics\n| PathBiasScaleThreshold\n| PathBiasScaleUseThreshold\n| PathsNeededToBuildCircuits\n| ProtocolWarnings\n| PublishHidServDescriptors\n| PublishServerDescriptor\n| ReducedCircuitPadding\n| ReducedConnectionPadding\n| ReducedExitPolicy\n| ReevaluateExitPolicy\n| RefuseUnknownExits\n| RunAsDaemon\n| SafeLogging\n| SafeSocks\n| Sandbox\n| ServerDNSAllowBrokenConfig\n| ServerDNSAllowNonRFC953Hostnames\n| ServerDNSDetectHijacking\n| ServerDNSRandomizeCase\n| ServerDNSSearchDomains\n| ShutdownWaitLength\n| SocksTimeout\n| StrictNodes\n| TestSocks\n| TestingBridgeBootstrapDownloadInitialDelay\n| TestingBridgeDownloadInitialDelay\n| TestingClientConsensusDownloadInitialDelay\n| TestingClientDownloadInitialDelay\n| TestingDirAuthVoteExitIsStrict\n| TestingDirAuthVoteGuardIsStrict\n| TestingDirAuthVoteHSDirIsStrict\n| TestingEnableCellStatsEvent\n| TestingEnableConnBwEvent\n| TestingServerConsensusDownloadInitialDelay\n| TestingServerDownloadInitialDelay\n| TestingTorNetwork\n| TrackHostExitsExpire\n| TruncateLogFile\n| UnixSocksGroupWritable\n| UpdateBridgesFromAuthority\n| UseBridges\n| UseDefaultFallbackDirs\n| UseEntryGuards\n| UseGuardFraction\n| UseMicrodescriptors\n| V3AuthNIntervalsValid\n| V3AuthUseLegacyKey\n| V3AuthoritativeDirectory\n| VanguardsLiteEnabled\n| VersioningAuthoritativeDirectory\n| __OwningControllerProcess\n\n# Units in use\n| AccountingMax\n| AuthDirFastGuarantee\n| AuthDirGuardBWGuarantee\n| AuthDirVoteGuardGuaranteeTimeKnown\n| AuthDirVoteStableGuaranteeMTBF\n| AuthDirVoteStableGuaranteeMinUptime\n| BandwidthBurst\n| BandwidthRate\n| ConstrainedSockSize\n| DoSCircuitCreationDefenseTimePeriod\n| DoSConnectionConnectDefenseTimePeriod\n| DormantClientTimeout\n| GuardLifetime\n| HeartbeatPeriod\n| KISTSchedRunInterval\n| MaxAdvertisedBandwidth\n| MaxConsensusAgeForDiffs\n| MaxMemInQueues\n| MaxOnionQueueDelay\n| MaxUnparseableDescSizeToLog\n| MinUptimeHidServDirectoryV2\n| PerConnBWBurst\n| PerConnBWRate\n| RelayBandwidthBurst\n| RelayBandwidthRate\n| RephistTrackTime\n| SSLKeyLifetime\n| SigningKeyLifetime\n| TestingAuthDirTimeToLearnReachability\n| TestingAuthKeyLifetime\n| TestingClientMaxIntervalWithoutRequest\n| TestingDirConnectionMaxStall\n| TestingLinkCertLifetime\n| TestingMinExitFlagThreshold\n| TestingMinFastFlagThreshold\n| TestingMinTimeToReportBandwidth\n| TestingSigningKeySlop\n| TestingV3AuthInitialDistDelay\n| TestingV3AuthInitialVoteDelay\n| TestingV3AuthInitialVotingInterval\n| TestingV3AuthVotingStartOffset\n| TokenBucketRefillInterval\n| V3AuthDistDelay\n| V3AuthVoteDelay\n| V3AuthVotingInterval\n\n# Ports lists\n| FirewallPorts\n| LongLivedPorts\n| RejectPlaintextPorts\n| WarnPlaintextPorts\n) \\G ', end: '(?!\\G)', name: 'meta.numeric-setting.torrc', patterns: [ { begin: '\\G(?=(?:\\s+(?:[^"#\\s]+|"(?:[^\\\\"]|\\\\.)*+"))++\\s*#)', contentName: 'meta.value.torrc', end: '(?=\\s*#)', patterns: [{include: '#entryNumeric'}] }, { begin: '\\G(?:\\s*(\\\\$\\r?\\n?)|[ \\t]+|(?=$|#))', beginCaptures: {1: {patterns: [{include: '#esc'}]}}, contentName: 'meta.value.torrc', end: '(\\G\\s+((?=\\S)(?!#)[^\\\\\\n#\\0]+))(?=\\s*(?:$|#))|(?=\\s*$)', endCaptures: { 1: {name: 'meta.value.torrc'}, 2: {patterns: [{include: '#entryNumeric'}]} }, patterns: [ {include: '#commentEmbedded'}, {include: '#esc'}, {include: '#entryNumeric'} ] } ] }, { begin: '(?i)(?<=[/+\\s]Log|^Log)\\G', end: '(?!\\G)', patterns: [ { begin: '\\G(?=(?:\\s+(?:[^"#\\s]+|"(?:[^\\\\"]|\\\\.)*+"))++\\s*#)', contentName: 'meta.value.torrc', end: '(?=\\s*#)', patterns: [{include: '#entryLogging'}] }, { begin: '\\G(?:\\s*(\\\\$\\r?\\n?)|[ \\t]+|(?=$|#))', beginCaptures: {1: {patterns: [{include: '#esc'}]}}, contentName: 'meta.value.torrc', end: '(\\G\\s+((?=\\S)(?!#)[^\\\\\\n#\\0]+))(?=\\s*(?:$|#))|(?=\\s*$)', endCaptures: { 1: {name: 'meta.value.torrc'}, 2: {patterns: [{include: '#entryLogging'}]} }, patterns: [ {include: '#commentEmbedded'}, {include: '#esc'}, {include: '#entryLogging'} ] } ] }, { begin: '(?ix)\n(?<= AccelDir\n| CacheDirectory\n| ClientOnionAuthDir\n| ControlPortWriteToFile\n| ControlSocket\n| CookieAuthFile\n| DataDirectory\n| DirPortFrontPage\n| ExtORPortCookieAuthFile\n| GeoIPFile\n| GeoIPv6File\n| GuardfractionFile\n| HiddenServiceDir\n| KeyDirectory\n| PidFile\n| ServerDNSResolvConfFile\n| V3BandwidthsFile\n) \\G', end: '(?!\\G)', patterns: [ { begin: '\\G(?=(?:\\s+(?:[^"#\\s]+|"(?:[^\\\\"]|\\\\.)*+"))++\\s*#)', contentName: 'meta.value.torrc', end: '(?=\\s*#)', patterns: [{include: '#entryFile'}] }, { begin: '\\G(?:\\s*(\\\\$\\r?\\n?)|[ \\t]+|(?=$|#))', beginCaptures: {1: {patterns: [{include: '#esc'}]}}, contentName: 'meta.value.torrc', end: '(\\G\\s+((?=\\S)(?!#)[^\\\\\\n#\\0]+))(?=\\s*(?:$|#))|(?=\\s*$)', endCaptures: { 1: {name: 'meta.value.torrc'}, 2: {patterns: [{include: '#entryFile'}]} }, patterns: [ {include: '#commentEmbedded'}, {include: '#esc'}, {include: '#entryFile'} ] } ] }, { begin: '(?ix)\n(?<= AuthDirVoteGuard\n| EntryNodes\n| ExcludeExitNodes\n| ExcludeNodes\n| ExitNodes\n| HSLayer2Nodes\n| HSLayer3Nodes\n| HTTPProxy\n| HTTPSProxy\n| HiddenServicePort\n| MapAddress\n| MiddleNodes\n| NodeFamily\n| OutboundBindAddressExit\n| OutboundBindAddressOR\n| OutboundBindAddressPT\n| OutboundBindAddress\n| Socks4Proxy | SOCKS4Proxy # FIXME; Remove different casing once issue with\n| Socks5Proxy | SOCKS5Proxy # scoped modifiers in lookbehinds is worked out.\n| TestingDirAuthVoteExit\n| TestingDirAuthVoteGuard\n| TestingDirAuthVoteHSDir\n| VirtualAddrNetworkIPv6\n) \\G', end: '(?!\\G)', patterns: [ { begin: '\\G(?=(?:\\s+(?:[^"#\\s]+|"(?:[^\\\\"]|\\\\.)*+"))++\\s*#)', contentName: 'meta.value.torrc', end: '(?=\\s*#)', patterns: [{include: '#entryNode'}] }, { begin: '\\G(?:\\s*(\\\\$\\r?\\n?)|[ \\t]+|(?=$|#))', beginCaptures: {1: {patterns: [{include: '#esc'}]}}, contentName: 'meta.value.torrc', end: '(\\G\\s+((?=\\S)(?!#)[^\\\\\\n#\\0]+))(?=\\s*(?:$|#))|(?=\\s*$)', endCaptures: { 1: {name: 'meta.value.torrc'}, 2: {patterns: [{include: '#entryNode'}]} }, patterns: [ {include: '#commentEmbedded'}, {include: '#esc'}, {include: '#entryNode'} ] } ] }, { begin: '(?i)(?<=DirPolicy|ExitPolicy|MetricsPortPolicy|SocksPolicy|SOCKSPolicy)\\G', end: '(?!\\G)', patterns: [ { begin: '\\G(?=(?:\\s+(?:[^"#\\s]+|"(?:[^\\\\"]|\\\\.)*+"))++\\s*#)', contentName: 'meta.value.torrc', end: '(?=\\s*#)', patterns: [{include: '#entryPolicies'}] }, { begin: '\\G(?:\\s*(\\\\$\\r?\\n?)|[ \\t]+|(?=$|#))', beginCaptures: {1: {patterns: [{include: '#esc'}]}}, contentName: 'meta.value.torrc', end: '(\\G\\s+((?=\\S)(?!#)[^\\\\\\n#\\0]+))(?=\\s*(?:$|#))|(?=\\s*$)', endCaptures: { 1: {name: 'meta.value.torrc'}, 2: {patterns: [{include: '#entryPolicies'}]} }, patterns: [ {include: '#commentEmbedded'}, {include: '#esc'}, {include: '#entryPolicies'} ] } ] }, { begin: '(?i)(?<=ConsensusParams|ServerTransportOptions)\\G', end: '(?!\\G)', patterns: [ { begin: '\\G(?=(?:\\s+(?:[^"#\\s]+|"(?:[^\\\\"]|\\\\.)*+"))++\\s*#)', contentName: 'meta.value.torrc', end: '(?=\\s*#)', patterns: [{include: '#entryParams'}] }, { begin: '\\G(?:\\s*(\\\\$\\r?\\n?)|[ \\t]+|(?=$|#))', beginCaptures: {1: {patterns: [{include: '#esc'}]}}, contentName: 'meta.value.torrc', end: '(\\G\\s+((?=\\S)(?!#)[^\\\\\\n#\\0]+))(?=\\s*(?:$|#))|(?=\\s*$)', endCaptures: { 1: {name: 'meta.value.torrc'}, 2: {patterns: [{include: '#entryParams'}]} }, patterns: [ {include: '#commentEmbedded'}, {include: '#esc'}, {include: '#entryParams'} ] } ] }, { begin: '(?ix)\n(?<= MinimalAcceptedServerVersion\n| RecommendedClientVersions\n| RecommendedServerVersions\n| RecommendedVersions\n) \\G', end: '(?!\\G)', patterns: [ { begin: '\\G(?=(?:\\s+(?:[^"#\\s]+|"(?:[^\\\\"]|\\\\.)*+"))++\\s*#)', contentName: 'meta.value.torrc', end: '(?=\\s*#)', patterns: [{include: '#entryVersions'}] }, { begin: '\\G(?:\\s*(\\\\$\\r?\\n?)|[ \\t]+|(?=$|#))', beginCaptures: {1: {patterns: [{include: '#esc'}]}}, contentName: 'meta.value.torrc', end: '(\\G\\s+((?=\\S)(?!#)[^\\\\\\n#\\0]+))(?=\\s*(?:$|#))|(?=\\s*$)', endCaptures: { 1: {name: 'meta.value.torrc'}, 2: {patterns: [{include: '#entryVersions'}]} }, patterns: [ {include: '#commentEmbedded'}, {include: '#esc'}, {include: '#entryVersions'} ] } ] }, { begin: '\\G', end: '(?!\\G)', patterns: [ { begin: '\\G(?=(?:\\s+(?:[^"#\\s]+|"(?:[^\\\\"]|\\\\.)*+"))++\\s*#)', contentName: 'meta.value.torrc', end: '(?=\\s*#)', patterns: [{include: '#entryGeneric'}] }, { begin: '\\G(?:\\s*(\\\\$\\r?\\n?)|[ \\t]+|(?=$|#))', beginCaptures: {1: {patterns: [{include: '#esc'}]}}, contentName: 'meta.value.torrc', end: '(\\G\\s+((?=\\S)(?!#)[^\\\\\\n#\\0]+))(?=\\s*(?:$|#))|(?=\\s*$)', endCaptures: { 1: {name: 'meta.value.torrc'}, 2: {patterns: [{include: '#entryGeneric'}]} }, patterns: [ {include: '#commentEmbedded'}, {include: '#esc'}, {include: '#entryGeneric'} ] } ] } ] }, entryFile: { begin: '(?=[^#\\s])', end: '(?=\\s*(?:$|#))', name: 'string.other.link.filename.torrc' }, entryGeneric: { patterns: [ {include: '#typed'}, {include: '#address'}, {include: 'etc#ip'}, {include: '#num'}, {include: '#str'}, {include: '#portSuffix'}, {include: 'etc#comma'}, {include: '#anyIP'}, {include: '#unq'} ] }, entryLogging: { patterns: [ { captures: { 1: {name: 'meta.domain-list.torrc'}, 2: {name: 'punctuation.section.begin.domains.torrc'}, 3: { patterns: [ {match: '[A-Za-z]+', name: 'entity.name.domain.torrc'}, { match: '\\*', name: 'keyword.operator.wildcard.match-all.torrc' }, { match: '~', name: 'keyword.operator.logical.negation.negate.torrc' }, {include: 'etc#comma'} ] }, 4: {name: 'punctuation.section.end.domains.torrc'}, 5: { name: 'meta.severity-levels.torrc', patterns: [ { match: '(?i)debug|err|info|notice|warn', name: 'constant.language.severity-level.torrc' }, {match: '-', name: 'punctuation.separator.dash.torrc'} ] } }, match: '(?ix)\n((\\[)((?:~?(?:[a-z]+|\\*)(?:,|(?=\\])))*+)(\\]))?\n((?!-)(?:(?:debug|err|info|notice|warn)-?){1,2}(?