74
.github/actions-scripts/staging-deploy.js
vendored
Executable file
74
.github/actions-scripts/staging-deploy.js
vendored
Executable file
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import parsePrUrl from '../../script/deployment/parse-pr-url.js'
|
||||
import getOctokit from '../../script/helpers/github.js'
|
||||
import deployToStaging from '../../script/deployment/deploy-to-staging.js'
|
||||
|
||||
const { GITHUB_TOKEN, HEROKU_API_TOKEN } = process.env
|
||||
|
||||
// Exit if GitHub Actions PAT is not found
|
||||
if (!GITHUB_TOKEN) {
|
||||
throw new Error('You must supply a GITHUB_TOKEN environment variable!')
|
||||
}
|
||||
|
||||
// Exit if Heroku API token is not found
|
||||
if (!HEROKU_API_TOKEN) {
|
||||
throw new Error('You must supply a HEROKU_API_TOKEN environment variable!')
|
||||
}
|
||||
|
||||
// This helper uses the `GITHUB_TOKEN` implicitly!
|
||||
// We're using our usual version of Octokit vs. the provided `github`
|
||||
// instance to avoid versioning discrepancies.
|
||||
const octokit = getOctokit()
|
||||
|
||||
const { RUN_ID, PR_URL, SOURCE_BLOB_URL, CONTEXT_NAME, ACTIONS_RUN_LOG, HEAD_SHA } = process.env
|
||||
if (!RUN_ID) {
|
||||
throw new Error('$RUN_ID not set')
|
||||
}
|
||||
if (!PR_URL) {
|
||||
throw new Error('$PR_URL not set')
|
||||
}
|
||||
if (!SOURCE_BLOB_URL) {
|
||||
throw new Error('$SOURCE_BLOB_URL not set')
|
||||
}
|
||||
if (!CONTEXT_NAME) {
|
||||
throw new Error('$CONTEXT_NAME not set')
|
||||
}
|
||||
if (!ACTIONS_RUN_LOG) {
|
||||
throw new Error('$ACTIONS_RUN_LOG not set')
|
||||
}
|
||||
if (!HEAD_SHA) {
|
||||
throw new Error('$HEAD_SHA not set')
|
||||
}
|
||||
|
||||
const { owner, repo, pullNumber } = parsePrUrl(PR_URL)
|
||||
if (!owner || !repo || !pullNumber) {
|
||||
throw new Error(
|
||||
`'pullRequestUrl' input must match URL format 'https://github.com/github/(docs|docs-internal)/pull/123' but was '${PR_URL}'`
|
||||
)
|
||||
}
|
||||
|
||||
const { data: pullRequest } = await octokit.pulls.get({
|
||||
owner,
|
||||
repo,
|
||||
pull_number: pullNumber,
|
||||
})
|
||||
|
||||
await deployToStaging({
|
||||
octokit,
|
||||
pullRequest,
|
||||
forceRebuild: false,
|
||||
// These parameters will ONLY be set by Actions
|
||||
sourceBlobUrl: SOURCE_BLOB_URL,
|
||||
runId: RUN_ID,
|
||||
})
|
||||
|
||||
await octokit.repos.createCommitStatus({
|
||||
owner,
|
||||
repo,
|
||||
sha: HEAD_SHA,
|
||||
context: CONTEXT_NAME,
|
||||
state: 'success',
|
||||
description: 'Successfully deployed! See logs.',
|
||||
target_url: ACTIONS_RUN_LOG,
|
||||
})
|
||||
50
.github/actions-scripts/staging-undeploy.js
vendored
Executable file
50
.github/actions-scripts/staging-undeploy.js
vendored
Executable file
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import parsePrUrl from '../../script/deployment/parse-pr-url.js'
|
||||
import getOctokit from '../../script/helpers/github.js'
|
||||
import undeployFromStaging from '../../script/deployment/undeploy-from-staging.js'
|
||||
|
||||
const { GITHUB_TOKEN, HEROKU_API_TOKEN } = process.env
|
||||
|
||||
// Exit if GitHub Actions PAT is not found
|
||||
if (!GITHUB_TOKEN) {
|
||||
throw new Error('You must supply a GITHUB_TOKEN environment variable!')
|
||||
}
|
||||
|
||||
// Exit if Heroku API token is not found
|
||||
if (!HEROKU_API_TOKEN) {
|
||||
throw new Error('You must supply a HEROKU_API_TOKEN environment variable!')
|
||||
}
|
||||
|
||||
// This helper uses the `GITHUB_TOKEN` implicitly!
|
||||
// We're using our usual version of Octokit vs. the provided `github`
|
||||
// instance to avoid versioning discrepancies.
|
||||
const octokit = getOctokit()
|
||||
|
||||
const { RUN_ID, PR_URL } = process.env
|
||||
|
||||
if (!RUN_ID) {
|
||||
throw new Error('$RUN_ID not set')
|
||||
}
|
||||
if (!PR_URL) {
|
||||
throw new Error('$PR_URL not set')
|
||||
}
|
||||
|
||||
const { owner, repo, pullNumber } = parsePrUrl(PR_URL)
|
||||
if (!owner || !repo || !pullNumber) {
|
||||
throw new Error(
|
||||
`'pullRequestUrl' input must match URL format 'https://github.com/github/(docs|docs-internal)/pull/123' but was '${PR_URL}'`
|
||||
)
|
||||
}
|
||||
|
||||
const { data: pullRequest } = await octokit.pulls.get({
|
||||
owner,
|
||||
repo,
|
||||
pull_number: pullNumber,
|
||||
})
|
||||
|
||||
await undeployFromStaging({
|
||||
octokit,
|
||||
pullRequest: pullRequest,
|
||||
runId: RUN_ID,
|
||||
})
|
||||
2
.github/workflows/prod-build-deploy.yml
vendored
2
.github/workflows/prod-build-deploy.yml
vendored
@@ -21,7 +21,7 @@ concurrency:
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
if: ${{ github.repository == 'github/docs-internal'}}
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ${{ fromJSON('["ubuntu-latest", "self-hosted"]')[github.repository == 'github/docs-internal'] }}
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- name: Check out repo
|
||||
|
||||
73
.github/workflows/staging-deploy-pr.yml
vendored
73
.github/workflows/staging-deploy-pr.yml
vendored
@@ -67,6 +67,10 @@ jobs:
|
||||
BUILD_ACTIONS_RUN_ID: ${{ env.BUILD_ACTIONS_RUN_ID }}
|
||||
with:
|
||||
script: |
|
||||
|
||||
// Curious about what version of node you get
|
||||
console.log('Node version:', process.version)
|
||||
|
||||
// In order to find out the PR info for a forked repo, we must query
|
||||
// the API for more info based on the originating workflow run
|
||||
const { BUILD_ACTIONS_RUN_ID } = process.env
|
||||
@@ -482,12 +486,8 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Install one-off development-only dependencies
|
||||
run: npm install --no-save --include=optional esm
|
||||
|
||||
- name: Deploy
|
||||
id: deploy
|
||||
uses: actions/github-script@2b34a689ec86a68d8ab9478298f91d5401337b7d
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
HEROKU_API_TOKEN: ${{ secrets.HEROKU_API_TOKEN }}
|
||||
@@ -499,69 +499,8 @@ jobs:
|
||||
ACTIONS_RUN_LOG: ${{ env.ACTIONS_RUN_LOG }}
|
||||
HEAD_SHA: ${{ needs.pr-metadata.outputs.head_sha }}
|
||||
ALLOWED_POLLING_FAILURES_PER_PHASE: '15'
|
||||
with:
|
||||
script: |
|
||||
const { GITHUB_TOKEN, HEROKU_API_TOKEN } = process.env
|
||||
|
||||
// Exit if GitHub Actions PAT is not found
|
||||
if (!GITHUB_TOKEN) {
|
||||
throw new Error('You must supply a GITHUB_TOKEN environment variable!')
|
||||
}
|
||||
|
||||
// Exit if Heroku API token is not found
|
||||
if (!HEROKU_API_TOKEN) {
|
||||
throw new Error('You must supply a HEROKU_API_TOKEN environment variable!')
|
||||
}
|
||||
|
||||
// Workaround to allow us to load ESM files with `require(...)`
|
||||
const esm = require('esm')
|
||||
require = esm({})
|
||||
|
||||
const { default: parsePrUrl } = require('./script/deployment/parse-pr-url')
|
||||
const { default: getOctokit } = require('./script/helpers/github')
|
||||
const { default: deployToStaging } = require('./script/deployment/deploy-to-staging')
|
||||
|
||||
// This helper uses the `GITHUB_TOKEN` implicitly!
|
||||
// We're using our usual version of Octokit vs. the provided `github`
|
||||
// instance to avoid versioning discrepancies.
|
||||
const octokit = getOctokit()
|
||||
|
||||
try {
|
||||
const { PR_URL, SOURCE_BLOB_URL, CONTEXT_NAME, ACTIONS_RUN_LOG, HEAD_SHA } = process.env
|
||||
const { owner, repo, pullNumber } = parsePrUrl(PR_URL)
|
||||
if (!owner || !repo || !pullNumber) {
|
||||
throw new Error(`'pullRequestUrl' input must match URL format 'https://github.com/github/(docs|docs-internal)/pull/123' but was '${PR_URL}'`)
|
||||
}
|
||||
|
||||
const { data: pullRequest } = await octokit.pulls.get({
|
||||
owner,
|
||||
repo,
|
||||
pull_number: pullNumber
|
||||
})
|
||||
|
||||
await deployToStaging({
|
||||
octokit,
|
||||
pullRequest,
|
||||
forceRebuild: false,
|
||||
// These parameters will ONLY be set by Actions
|
||||
sourceBlobUrl: SOURCE_BLOB_URL,
|
||||
runId: context.runId
|
||||
})
|
||||
|
||||
await github.repos.createCommitStatus({
|
||||
owner,
|
||||
repo,
|
||||
sha: HEAD_SHA,
|
||||
context: CONTEXT_NAME,
|
||||
state: 'success',
|
||||
description: 'Successfully deployed! See logs.',
|
||||
target_url: ACTIONS_RUN_LOG
|
||||
})
|
||||
} catch (error) {
|
||||
console.error(`Failed to deploy to staging: ${error.message}`)
|
||||
console.error(error)
|
||||
throw error
|
||||
}
|
||||
RUN_ID: ${{ github.run_id }}
|
||||
run: .github/actions-scripts/staging-deploy.js
|
||||
|
||||
- name: Mark the deployment as inactive if timed out
|
||||
uses: actions/github-script@2b34a689ec86a68d8ab9478298f91d5401337b7d
|
||||
|
||||
44
.github/workflows/staging-undeploy-pr.yml
vendored
44
.github/workflows/staging-undeploy-pr.yml
vendored
@@ -69,51 +69,13 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Install one-off development-only dependencies
|
||||
run: npm install --no-save --include=optional esm
|
||||
|
||||
- name: Undeploy
|
||||
uses: actions/github-script@2b34a689ec86a68d8ab9478298f91d5401337b7d
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
HEROKU_API_TOKEN: ${{ secrets.HEROKU_API_TOKEN }}
|
||||
with:
|
||||
script: |
|
||||
const { GITHUB_TOKEN, HEROKU_API_TOKEN } = process.env
|
||||
|
||||
// Exit if GitHub Actions PAT is not found
|
||||
if (!GITHUB_TOKEN) {
|
||||
throw new Error('You must supply a GITHUB_TOKEN environment variable!')
|
||||
}
|
||||
|
||||
// Exit if Heroku API token is not found
|
||||
if (!HEROKU_API_TOKEN) {
|
||||
throw new Error('You must supply a HEROKU_API_TOKEN environment variable!')
|
||||
}
|
||||
|
||||
// Workaround to allow us to load ESM files with `require(...)`
|
||||
const esm = require('esm')
|
||||
require = esm({})
|
||||
|
||||
const { default: getOctokit } = require('./script/helpers/github')
|
||||
const { default: undeployFromStaging } = require('./script/deployment/undeploy-from-staging')
|
||||
|
||||
// This helper uses the `GITHUB_TOKEN` implicitly!
|
||||
// We're using our usual version of Octokit vs. the provided `github`
|
||||
// instance to avoid versioning discrepancies.
|
||||
const octokit = getOctokit()
|
||||
|
||||
try {
|
||||
await undeployFromStaging({
|
||||
octokit,
|
||||
pullRequest: context.payload.pull_request,
|
||||
runId: context.runId
|
||||
})
|
||||
} catch (error) {
|
||||
console.error(`Failed to undeploy from staging: ${error.message}`)
|
||||
console.error(error)
|
||||
throw error
|
||||
}
|
||||
RUN_ID: ${{ github.run_id }}
|
||||
PR_URL: ${{ github.event.pull_request.html_url }}
|
||||
run: .github/actions-scripts/staging-undeploy.js
|
||||
|
||||
- if: ${{ always() }}
|
||||
name: Remove the label from the PR to unblock deployment
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# GitHub Docs <!-- omit in toc -->
|
||||
# GitHub Docs <!-- omit in toc -->
|
||||
|
||||
This repository contains the documentation website code and Markdown source files for [docs.github.com](https://docs.github.com).
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ import { MarkdownContent } from 'components/ui/MarkdownContent'
|
||||
import { Lead } from 'components/ui/Lead'
|
||||
import { ArticleGridLayout } from './ArticleGridLayout'
|
||||
import { PlatformPicker } from 'components/article/PlatformPicker'
|
||||
import { ToolPicker } from 'components/article/ToolPicker'
|
||||
|
||||
// Mapping of a "normal" article to it's interactive counterpart
|
||||
const interactiveAlternatives: Record<string, { href: string }> = {
|
||||
@@ -52,6 +53,7 @@ export const ArticlePage = () => {
|
||||
contributor,
|
||||
permissions,
|
||||
includesPlatformSpecificContent,
|
||||
includesToolSpecificContent,
|
||||
product,
|
||||
miniTocItems,
|
||||
currentLearningTrack,
|
||||
@@ -111,6 +113,7 @@ export const ArticlePage = () => {
|
||||
)}
|
||||
|
||||
{includesPlatformSpecificContent && <PlatformPicker variant="underlinenav" />}
|
||||
{includesToolSpecificContent && <ToolPicker variant="underlinenav" />}
|
||||
|
||||
{product && (
|
||||
<Callout
|
||||
|
||||
@@ -12,9 +12,11 @@ const platforms = [
|
||||
{ id: 'linux', label: 'Linux' },
|
||||
]
|
||||
|
||||
// Nota bene: platform === os
|
||||
|
||||
// Imperatively modify article content to show only the selected platform
|
||||
// find all platform-specific *block* elements and hide or show as appropriate
|
||||
// example: {% mac } block content {% mac %}
|
||||
// example: {% mac %} block content {% endmac %}
|
||||
function showPlatformSpecificContent(platform: string) {
|
||||
const markdowns = Array.from(document.querySelectorAll<HTMLElement>('.extended-markdown'))
|
||||
markdowns
|
||||
|
||||
117
components/article/ToolPicker.tsx
Normal file
117
components/article/ToolPicker.tsx
Normal file
@@ -0,0 +1,117 @@
|
||||
import { useEffect, useState } from 'react'
|
||||
import Cookies from 'js-cookie'
|
||||
import { UnderlineNav } from '@primer/components'
|
||||
import { sendEvent, EventType } from 'components/lib/events'
|
||||
import { preserveAnchorNodePosition } from 'scroll-anchoring'
|
||||
|
||||
import { useArticleContext } from 'components/context/ArticleContext'
|
||||
|
||||
// example: http://localhost:4000/en/codespaces/developing-in-codespaces/creating-a-codespace
|
||||
|
||||
// Nota bene: tool === application
|
||||
// Nota bene: picker === switcher
|
||||
|
||||
const supportedTools = ['cli', 'desktop', 'webui', 'curl', 'codespaces', 'vscode']
|
||||
const toolTitles = {
|
||||
webui: 'Web browser',
|
||||
cli: 'GitHub CLI',
|
||||
curl: 'cURL',
|
||||
desktop: 'Desktop',
|
||||
codespaces: 'Codespaces',
|
||||
vscode: 'Visual Studio Code',
|
||||
} as Record<string, string>
|
||||
|
||||
// Imperatively modify article content to show only the selected tool
|
||||
// find all platform-specific *block* elements and hide or show as appropriate
|
||||
// example: {% webui %} block content {% endwebui %}
|
||||
function showToolSpecificContent(tool: string) {
|
||||
const markdowns = Array.from(document.querySelectorAll<HTMLElement>('.extended-markdown'))
|
||||
markdowns
|
||||
.filter((el) => supportedTools.some((tool) => el.classList.contains(tool)))
|
||||
.forEach((el) => {
|
||||
el.style.display = el.classList.contains(tool) ? '' : 'none'
|
||||
})
|
||||
|
||||
// find all tool-specific *inline* elements and hide or show as appropriate
|
||||
// example: <span class="tool-webui">inline content</span>
|
||||
const toolEls = Array.from(
|
||||
document.querySelectorAll<HTMLElement>(supportedTools.map((tool) => `.tool-${tool}`).join(', '))
|
||||
)
|
||||
toolEls.forEach((el) => {
|
||||
el.style.display = el.classList.contains(`tool-${tool}`) ? '' : 'none'
|
||||
})
|
||||
}
|
||||
|
||||
function getDefaultTool(defaultTool: string | undefined, detectedTools: Array<string>): string {
|
||||
// If there is a default tool and the tool is present on this page
|
||||
if (defaultTool && detectedTools.includes(defaultTool)) return defaultTool
|
||||
|
||||
// Default to webui if present (this is generally the case where we show UI/CLI/Desktop info)
|
||||
if (detectedTools.includes('webui')) return 'webui'
|
||||
|
||||
// Default to cli if present (this is generally the case where we show curl/CLI info)
|
||||
if (detectedTools.includes('cli')) return 'cli'
|
||||
|
||||
// Otherwise, just choose the first detected tool
|
||||
return detectedTools[0]
|
||||
}
|
||||
|
||||
type Props = {
|
||||
variant?: 'subnav' | 'tabnav' | 'underlinenav'
|
||||
}
|
||||
export const ToolPicker = ({ variant = 'subnav' }: Props) => {
|
||||
const { defaultTool, detectedTools } = useArticleContext()
|
||||
const [currentTool, setCurrentTool] = useState(getDefaultTool(defaultTool, detectedTools))
|
||||
|
||||
const sharedContainerProps = {
|
||||
'data-testid': 'tool-picker',
|
||||
'aria-label': 'Tool picker',
|
||||
'data-default-tool': defaultTool,
|
||||
className: 'mb-4',
|
||||
}
|
||||
|
||||
// Run on mount for client-side only features
|
||||
useEffect(() => {
|
||||
// If the user selected a tool preference and the tool is present on this page
|
||||
// Has to be client-side only for cookie reading
|
||||
const cookieValue = Cookies.get('toolPreferred')
|
||||
if (cookieValue && detectedTools.includes(cookieValue)) {
|
||||
setCurrentTool(cookieValue)
|
||||
}
|
||||
}, [])
|
||||
|
||||
function onClickTool(tool: string) {
|
||||
setCurrentTool(tool)
|
||||
preserveAnchorNodePosition(document, () => {
|
||||
showToolSpecificContent(tool)
|
||||
})
|
||||
sendEvent({
|
||||
type: EventType.preference,
|
||||
preference_name: 'application',
|
||||
preference_value: tool,
|
||||
})
|
||||
Cookies.set('toolPreferred', tool, { sameSite: 'strict', secure: true })
|
||||
}
|
||||
|
||||
if (variant === 'underlinenav') {
|
||||
return (
|
||||
<UnderlineNav {...sharedContainerProps}>
|
||||
{detectedTools.map((tool) => (
|
||||
<UnderlineNav.Link
|
||||
key={tool}
|
||||
data-tool={tool}
|
||||
as="button"
|
||||
selected={tool === currentTool}
|
||||
onClick={() => {
|
||||
onClickTool(tool)
|
||||
}}
|
||||
>
|
||||
{toolTitles[tool]}
|
||||
</UnderlineNav.Link>
|
||||
))}
|
||||
</UnderlineNav>
|
||||
)
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
@@ -22,10 +22,13 @@ export type ArticleContextT = {
|
||||
contributor: { name: string; URL: string } | null
|
||||
permissions?: string
|
||||
includesPlatformSpecificContent: boolean
|
||||
includesToolSpecificContent: boolean
|
||||
defaultPlatform?: string
|
||||
defaultTool?: string
|
||||
product?: string
|
||||
currentLearningTrack?: LearningTrack
|
||||
detectedPlatforms: Array<string>
|
||||
detectedTools: Array<string>
|
||||
}
|
||||
|
||||
export const ArticleContext = createContext<ArticleContextT | null>(null)
|
||||
@@ -60,9 +63,12 @@ export const getArticleContextFromRequest = (req: any): ArticleContextT => {
|
||||
contributor: page.contributor || null,
|
||||
permissions: page.permissions || '',
|
||||
includesPlatformSpecificContent: page.includesPlatformSpecificContent || false,
|
||||
includesToolSpecificContent: page.includesToolSpecificContent || false,
|
||||
defaultPlatform: page.defaultPlatform || '',
|
||||
defaultTool: page.defaultTool || '',
|
||||
product: page.product || '',
|
||||
currentLearningTrack: req.context.currentLearningTrack,
|
||||
detectedPlatforms: page.detectedPlatforms || [],
|
||||
detectedTools: page.detectedTools || [],
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
import Cookies from 'js-cookie'
|
||||
import { preserveAnchorNodePosition } from 'scroll-anchoring'
|
||||
|
||||
import { sendEvent, EventType } from './events'
|
||||
|
||||
const supportedTools = ['cli', 'desktop', 'webui', 'curl', 'codespaces', 'vscode']
|
||||
|
||||
export default function displayToolSpecificContent() {
|
||||
const toolElements = Array.from(document.querySelectorAll('.extended-markdown')).filter((el) =>
|
||||
supportedTools.some((tool) => el.classList.contains(tool))
|
||||
) as Array<HTMLElement>
|
||||
|
||||
if (!toolElements.length) return
|
||||
|
||||
const detectedTools = toolElements.flatMap((el) =>
|
||||
Array.from(el.classList).filter((className) => supportedTools.includes(className))
|
||||
) as Array<string>
|
||||
|
||||
const tool = getDefaultTool(detectedTools)
|
||||
|
||||
showToolSpecificContent(tool, toolElements)
|
||||
|
||||
hideSwitcherLinks(detectedTools)
|
||||
|
||||
highlightTabForTool(tool)
|
||||
|
||||
// configure links for switching tool content
|
||||
switcherLinks().forEach((link) => {
|
||||
link.addEventListener('click', (event) => {
|
||||
event.preventDefault()
|
||||
const target = event.target as HTMLElement
|
||||
highlightTabForTool(target.dataset.tool || '')
|
||||
preserveAnchorNodePosition(document, () => {
|
||||
showToolSpecificContent(target.dataset.tool || '', toolElements)
|
||||
})
|
||||
|
||||
// Save this preference as a cookie.
|
||||
Cookies.set('toolPreferred', target.dataset.tool || '', { sameSite: 'strict', secure: true })
|
||||
|
||||
// Send event data
|
||||
sendEvent({
|
||||
type: EventType.preference,
|
||||
preference_name: 'application',
|
||||
preference_value: target.dataset.tool,
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function highlightTabForTool(tool: string) {
|
||||
// (de)activate switcher link appearances
|
||||
switcherLinks().forEach((link) => {
|
||||
link.dataset.tool === tool ? link.classList.add('selected') : link.classList.remove('selected')
|
||||
})
|
||||
}
|
||||
|
||||
function showToolSpecificContent(tool: string, toolElements: Array<HTMLElement>) {
|
||||
// show the content only for the highlighted tool
|
||||
toolElements
|
||||
.filter((el) => supportedTools.some((tool) => el.classList.contains(tool)))
|
||||
.forEach((el) => {
|
||||
el.style.display = el.classList.contains(tool) ? '' : 'none'
|
||||
})
|
||||
}
|
||||
|
||||
// hide links for any tool-specific sections that are not present
|
||||
function hideSwitcherLinks(detectedTools: Array<string>) {
|
||||
const links = Array.from(document.querySelectorAll('a.tool-switcher')) as Array<HTMLAnchorElement>
|
||||
links.forEach((link) => {
|
||||
if (detectedTools.includes(link.dataset.tool || '')) return
|
||||
link.style.display = 'none'
|
||||
})
|
||||
}
|
||||
|
||||
function getDefaultTool(detectedTools: Array<string>): string {
|
||||
// If the user selected a tool preference and the tool is present on this page
|
||||
const cookieValue = Cookies.get('toolPreferred')
|
||||
if (cookieValue && detectedTools.includes(cookieValue)) return cookieValue
|
||||
|
||||
// If there is a default tool and the tool is present on this page
|
||||
const defaultToolEl = document.querySelector('[data-default-tool]') as HTMLElement
|
||||
|
||||
const defaultToolValue = defaultToolEl ? defaultToolEl.dataset.defaultTool : ''
|
||||
if (defaultToolValue && detectedTools.includes(defaultToolValue)) {
|
||||
return defaultToolValue
|
||||
}
|
||||
|
||||
// Default to webui if present (this is generally the case where we show UI/CLI/Desktop info)
|
||||
if (detectedTools.includes('webui')) return 'webui'
|
||||
|
||||
// Default to cli if present (this is generally the case where we show curl/CLI info)
|
||||
if (detectedTools.includes('cli')) return 'cli'
|
||||
|
||||
// Otherwise, just choose the first detected tool
|
||||
return detectedTools[0]
|
||||
}
|
||||
|
||||
function switcherLinks() {
|
||||
return Array.from(document.querySelectorAll('a.tool-switcher')) as Array<HTMLAnchorElement>
|
||||
}
|
||||
@@ -27,6 +27,10 @@ You can configure {% data variables.product.prodname_code_scanning %} to run {%
|
||||
|
||||
{% data reusables.code-scanning.enabling-options %}
|
||||
|
||||
## Checking whether your license includes {% data variables.product.prodname_GH_advanced_security %}
|
||||
|
||||
{% data reusables.advanced-security.check-for-ghas-license %}
|
||||
|
||||
## Prerequisites for {% data variables.product.prodname_code_scanning %}
|
||||
|
||||
- A license for {% data variables.product.prodname_GH_advanced_security %}{% ifversion ghes > 3.0 %} (see "[About billing for {% data variables.product.prodname_GH_advanced_security %}](/billing/managing-billing-for-github-advanced-security/about-billing-for-github-advanced-security)"){% endif %}
|
||||
|
||||
@@ -22,6 +22,10 @@ topics:
|
||||
|
||||
{% data reusables.secret-scanning.about-secret-scanning %} For more information, see "[About {% data variables.product.prodname_secret_scanning %}](/github/administering-a-repository/about-secret-scanning)."
|
||||
|
||||
## Checking whether your license includes {% data variables.product.prodname_GH_advanced_security %}
|
||||
|
||||
{% data reusables.advanced-security.check-for-ghas-license %}
|
||||
|
||||
## Prerequisites for {% data variables.product.prodname_secret_scanning %}
|
||||
|
||||
|
||||
@@ -31,33 +35,20 @@ topics:
|
||||
|
||||
- {% data variables.product.prodname_secret_scanning_caps %} enabled in the management console (see "[Enabling {% data variables.product.prodname_GH_advanced_security %} for your enterprise](/admin/advanced-security/enabling-github-advanced-security-for-your-enterprise)")
|
||||
|
||||
## Checking support for the SSSE3 flag on your vCPUs
|
||||
### Checking support for the SSSE3 flag on your vCPUs
|
||||
|
||||
The SSSE3 set of instructions is required because {% data variables.product.prodname_secret_scanning %} leverages hardware accelerated pattern matching to find potential credentials committed to your {% data variables.product.prodname_dotcom %} repositories. SSSE3 is enabled for most modern CPUs. You can check whether SSSE3 is enabled for the vCPUs available to your {% data variables.product.prodname_ghe_server %} instance.
|
||||
|
||||
1. Connect to the administrative shell for your {% data variables.product.prodname_ghe_server %} instance. For more information, see "[Accessing the administrative shell (SSH)](/admin/configuration/accessing-the-administrative-shell-ssh)."
|
||||
2. Enter the following command:
|
||||
|
||||
```shell
|
||||
grep -iE '^flags.*ssse3' /proc/cpuinfo >/dev/null | echo $?
|
||||
```
|
||||
```shell
|
||||
grep -iE '^flags.*ssse3' /proc/cpuinfo >/dev/null | echo $?
|
||||
```
|
||||
|
||||
If this returns the value `0`, it means that the SSSE3 flag is available and enabled. You can now enable {% data variables.product.prodname_secret_scanning %} for {% data variables.product.product_location %}. For more information, see "[Enabling {% data variables.product.prodname_secret_scanning %}](#enabling-secret-scanning)" below.
|
||||
If this returns the value `0`, it means that the SSSE3 flag is available and enabled. You can now enable {% data variables.product.prodname_secret_scanning %} for {% data variables.product.product_location %}. For more information, see "[Enabling {% data variables.product.prodname_secret_scanning %}](#enabling-secret-scanning)" below.
|
||||
|
||||
If this doesn't return `0`, SSSE3 is not enabled on your VM/KVM. You need to refer to the documentation of the hardware/hypervisor on how to enable the flag, or make it available to guest VMs.
|
||||
|
||||
### Checking whether you have an {% data variables.product.prodname_advanced_security %} license
|
||||
|
||||
{% data reusables.enterprise_site_admin_settings.access-settings %}
|
||||
{% data reusables.enterprise_site_admin_settings.management-console %}
|
||||
1. Check if there is {% ifversion ghes < 3.2 %}an **{% data variables.product.prodname_advanced_security %}**{% else %}a **Security**{% endif %} entry in the left sidebar.
|
||||
{% ifversion ghes < 3.2 %}
|
||||

|
||||
{% else %}
|
||||

|
||||
{% endif %}
|
||||
|
||||
{% data reusables.enterprise_management_console.advanced-security-license %}
|
||||
If this doesn't return `0`, SSSE3 is not enabled on your VM/KVM. You need to refer to the documentation of the hardware/hypervisor on how to enable the flag, or make it available to guest VMs.
|
||||
|
||||
## Enabling {% data variables.product.prodname_secret_scanning %}
|
||||
|
||||
|
||||
@@ -28,17 +28,6 @@ When you enable {% data variables.product.prodname_GH_advanced_security %} for y
|
||||
For guidance on a phased deployment of GitHub Advanced Security, see "[Deploying GitHub Advanced Security in your enterprise](/admin/advanced-security/deploying-github-advanced-security-in-your-enterprise)."
|
||||
{% endif %}
|
||||
|
||||
## Prerequisites for enabling {% data variables.product.prodname_GH_advanced_security %}
|
||||
|
||||
1. Upgrade your license for {% data variables.product.product_name %} to include {% data variables.product.prodname_GH_advanced_security %}.{% ifversion ghes > 3.0 %} For information about licensing, see "[About billing for {% data variables.product.prodname_GH_advanced_security %}](/billing/managing-billing-for-github-advanced-security/about-billing-for-github-advanced-security)."{% endif %}
|
||||
2. Download the new license file. For more information, see "[Downloading your license for {% data variables.product.prodname_enterprise %}](/billing/managing-your-license-for-github-enterprise/downloading-your-license-for-github-enterprise)."
|
||||
3. Upload the new license file to {% data variables.product.product_location %}. For more information, see "[Uploading a new license to {% data variables.product.prodname_ghe_server %}](/billing/managing-your-license-for-github-enterprise/uploading-a-new-license-to-github-enterprise-server)."{% ifversion ghes %}
|
||||
4. Review the prerequisites for the features you plan to enable.
|
||||
|
||||
- {% data variables.product.prodname_code_scanning_capc %}, see "[Configuring {% data variables.product.prodname_code_scanning %} for your appliance](/admin/advanced-security/configuring-code-scanning-for-your-appliance#prerequisites-for-code-scanning)."
|
||||
- {% data variables.product.prodname_secret_scanning_caps %}, see "[Configuring {% data variables.product.prodname_secret_scanning %} for your appliance](/admin/advanced-security/configuring-secret-scanning-for-your-appliance#prerequisites-for-secret-scanning)."{% endif %}
|
||||
- {% data variables.product.prodname_dependabot %}, see "[Enabling the dependency graph and {% data variables.product.prodname_dependabot_alerts %} on your enterprise account](/admin/configuration/managing-connections-between-your-enterprise-accounts/enabling-the-dependency-graph-and-dependabot-alerts-on-your-enterprise-account)."
|
||||
|
||||
## Checking whether your license includes {% data variables.product.prodname_GH_advanced_security %}
|
||||
|
||||
{% ifversion ghes > 3.0 %}
|
||||
@@ -58,6 +47,17 @@ For guidance on a phased deployment of GitHub Advanced Security, see "[Deploying
|
||||
{% data reusables.enterprise_management_console.advanced-security-license %}
|
||||
{% endif %}
|
||||
|
||||
## Prerequisites for enabling {% data variables.product.prodname_GH_advanced_security %}
|
||||
|
||||
1. Upgrade your license for {% data variables.product.product_name %} to include {% data variables.product.prodname_GH_advanced_security %}.{% ifversion ghes > 3.0 %} For information about licensing, see "[About billing for {% data variables.product.prodname_GH_advanced_security %}](/billing/managing-billing-for-github-advanced-security/about-billing-for-github-advanced-security)."{% endif %}
|
||||
2. Download the new license file. For more information, see "[Downloading your license for {% data variables.product.prodname_enterprise %}](/billing/managing-your-license-for-github-enterprise/downloading-your-license-for-github-enterprise)."
|
||||
3. Upload the new license file to {% data variables.product.product_location %}. For more information, see "[Uploading a new license to {% data variables.product.prodname_ghe_server %}](/billing/managing-your-license-for-github-enterprise/uploading-a-new-license-to-github-enterprise-server)."{% ifversion ghes %}
|
||||
4. Review the prerequisites for the features you plan to enable.
|
||||
|
||||
- {% data variables.product.prodname_code_scanning_capc %}, see "[Configuring {% data variables.product.prodname_code_scanning %} for your appliance](/admin/advanced-security/configuring-code-scanning-for-your-appliance#prerequisites-for-code-scanning)."
|
||||
- {% data variables.product.prodname_secret_scanning_caps %}, see "[Configuring {% data variables.product.prodname_secret_scanning %} for your appliance](/admin/advanced-security/configuring-secret-scanning-for-your-appliance#prerequisites-for-secret-scanning)."{% endif %}
|
||||
- {% data variables.product.prodname_dependabot %}, see "[Enabling the dependency graph and {% data variables.product.prodname_dependabot_alerts %} on your enterprise account](/admin/configuration/managing-connections-between-your-enterprise-accounts/enabling-the-dependency-graph-and-dependabot-alerts-on-your-enterprise-account)."
|
||||
|
||||
## Enabling and disabling {% data variables.product.prodname_GH_advanced_security %} features
|
||||
|
||||
{% data reusables.enterprise_management_console.enable-disable-security-features %}
|
||||
|
||||
@@ -26,8 +26,8 @@ Some administrative ports are required to configure {% data variables.product.pr
|
||||
|---|---|---|
|
||||
| 8443 | HTTPS | Secure web-based {% data variables.enterprise.management_console %}. Required for basic installation and configuration. |
|
||||
| 8080 | HTTP | Plain-text web-based {% data variables.enterprise.management_console %}. Not required unless SSL is disabled manually. |
|
||||
| 122 | SSH | Shell access for {% data variables.product.product_location %}. Required to be open to incoming connections from all other nodes in a High Availability configuration. The default SSH port (22) is dedicated to Git and SSH application network traffic. |
|
||||
| 1194/UDP | VPN | Secure replication network tunnel in High Availability configuration. Required to be open to all other nodes in the configuration.|
|
||||
| 122 | SSH | Shell access for {% data variables.product.product_location %}. Required to be open to incoming connections between all nodes in a high availability configuration. The default SSH port (22) is dedicated to Git and SSH application network traffic. |
|
||||
| 1194/UDP | VPN | Secure replication network tunnel in high availability configuration. Required to be open for communication between all nodes in the configuration.|
|
||||
| 123/UDP| NTP | Required for time protocol operation. |
|
||||
| 161/UDP | SNMP | Required for network monitoring protocol operation. |
|
||||
|
||||
|
||||
@@ -186,3 +186,4 @@ The `ghe-repl-teardown` command disables replication mode completely, removing t
|
||||
## Further reading
|
||||
|
||||
- "[Creating a high availability replica](/enterprise/{{ currentVersion }}/admin/guides/installation/creating-a-high-availability-replica)"
|
||||
- "[Network ports](/admin/configuration/configuring-network-settings/network-ports)"
|
||||
@@ -19,15 +19,16 @@ shortTitle: Create HA replica
|
||||
## Creating a high availability replica
|
||||
|
||||
1. Set up a new {% data variables.product.prodname_ghe_server %} appliance on your desired platform. The replica appliance should mirror the primary appliance's CPU, RAM, and storage settings. We recommend that you install the replica appliance in an independent environment. The underlying hardware, software, and network components should be isolated from those of the primary appliance. If you are a using a cloud provider, use a separate region or zone. For more information, see ["Setting up a {% data variables.product.prodname_ghe_server %} instance"](/enterprise/{{ currentVersion }}/admin/guides/installation/setting-up-a-github-enterprise-server-instance).
|
||||
2. In a browser, navigate to the new replica appliance's IP address and upload your {% data variables.product.prodname_enterprise %} license.
|
||||
1. Ensure that both the primary appliance and the new replica appliance can communicate with each other over ports 122/TCP and 1194/UDP. For more information, see "[Network ports](/admin/configuration/configuring-network-settings/network-ports#administrative-ports)."
|
||||
1. In a browser, navigate to the new replica appliance's IP address and upload your {% data variables.product.prodname_enterprise %} license.
|
||||
{% data reusables.enterprise_installation.replica-steps %}
|
||||
6. Connect to the replica appliance's IP address using SSH.
|
||||
1. Connect to the replica appliance's IP address using SSH.
|
||||
```shell
|
||||
$ ssh -p 122 admin@<em>REPLICA IP</em>
|
||||
```
|
||||
{% data reusables.enterprise_installation.generate-replication-key-pair %}
|
||||
{% data reusables.enterprise_installation.add-ssh-key-to-primary %}
|
||||
9. To verify the connection to the primary and enable replica mode for the new replica, run `ghe-repl-setup` again.
|
||||
1. To verify the connection to the primary and enable replica mode for the new replica, run `ghe-repl-setup` again.
|
||||
```shell
|
||||
$ ghe-repl-setup <em>PRIMARY IP</em>
|
||||
```
|
||||
|
||||
@@ -69,8 +69,7 @@ You can choose to disable {% data variables.product.prodname_actions %} for all
|
||||
|
||||
{% data reusables.actions.about-artifact-log-retention %}
|
||||
|
||||
{% data reusables.enterprise_site_admin_settings.access-settings %}
|
||||
{% data reusables.enterprise_site_admin_settings.business %}
|
||||
{% data reusables.enterprise-accounts.access-enterprise %}
|
||||
{% data reusables.enterprise-accounts.policies-tab %}
|
||||
{% data reusables.enterprise-accounts.actions-tab %}
|
||||
{% data reusables.github-actions.change-retention-period-for-artifacts-logs %}
|
||||
|
||||
@@ -79,7 +79,7 @@ Any team members that have set their status to "Busy" will not be selected for r
|
||||

|
||||
9. Optionally, to always skip certain members of the team, select **Never assign certain team members**. Then, select one or more team members you'd like to always skip.
|
||||

|
||||
{% ifversion fpt or ghec or ghae-next or ghes > 3.2 %}
|
||||
{% ifversion fpt or ghec or ghae-issue-5108 or ghes > 3.2 %}
|
||||
11. Optionally, to include members of child teams as potential reviewers when assigning requests, select **Child team members**.
|
||||
12. Optionally, to count any members whose review has already been requested against the total number of members to assign, select **Count existing requests**.
|
||||
13. Optionally, to remove the review request from the team when assigning team members, select **Team review request**.
|
||||
|
||||
@@ -120,6 +120,12 @@ A MIME type is a header that a server sends to a browser, providing information
|
||||
|
||||
While you can't specify custom MIME types on a per-file or per-repository basis, you can add or modify MIME types for use on {% data variables.product.prodname_pages %}. For more information, see [the mime-db contributing guidelines](https://github.com/jshttp/mime-db#adding-custom-media-types).
|
||||
|
||||
{% ifversion fpt %}
|
||||
## Data collection
|
||||
|
||||
When a {% data variables.product.prodname_pages %} site is visited, the visitor's IP address is logged and stored for security purposes, regardless of whether the visitor has signed into {% data variables.product.prodname_dotcom %} or not. For more information about {% data variables.product.prodname_dotcom %}'s security practices, see <a href="/articles/github-privacy-statement/" class="dotcom-only">{% data variables.product.prodname_dotcom %} Privacy Statement</a>.
|
||||
{% endif %}
|
||||
|
||||
## Further reading
|
||||
|
||||
- [{% data variables.product.prodname_pages %}](https://lab.github.com/githubtraining/github-pages) on {% data variables.product.prodname_learning %}
|
||||
|
||||
@@ -42,7 +42,7 @@ By default, the restrictions of a branch protection rule don't apply to people w
|
||||
For each branch protection rule, you can choose to enable or disable the following settings.
|
||||
- [Require pull request reviews before merging](#require-pull-request-reviews-before-merging)
|
||||
- [Require status checks before merging](#require-status-checks-before-merging)
|
||||
{% ifversion fpt or ghes > 3.1 or ghae-issue-4382 or ghec %}
|
||||
{% ifversion fpt or ghes > 3.1 or ghae-next or ghec %}
|
||||
- [Require conversation resolution before merging](#require-conversation-resolution-before-merging){% endif %}
|
||||
- [Require signed commits](#require-signed-commits)
|
||||
- [Require linear history](#require-linear-history)
|
||||
@@ -99,7 +99,7 @@ You can set up required status checks to either be "loose" or "strict." The type
|
||||
|
||||
For troubleshooting information, see "[Troubleshooting required status checks](/github/administering-a-repository/troubleshooting-required-status-checks)."
|
||||
|
||||
{% ifversion fpt or ghes > 3.1 or ghae-issue-4382 or ghec %}
|
||||
{% ifversion fpt or ghes > 3.1 or ghae-next or ghec %}
|
||||
### Require conversation resolution before merging
|
||||
|
||||
Requires all comments on the pull request to be resolved before it can be merged to a protected branch. This ensures that all comments are addressed or acknowledged before merge.
|
||||
|
||||
@@ -80,7 +80,7 @@ When you create a branch rule, the branch you specify doesn't have to exist yet
|
||||

|
||||
- Search for status checks, selecting the checks you want to require.
|
||||

|
||||
{%- ifversion fpt or ghes > 3.1 or ghae-issue-4382 %}
|
||||
{%- ifversion fpt or ghes > 3.1 or ghae-next %}
|
||||
1. Optionally, select **Require conversation resolution before merging**.
|
||||

|
||||
{%- endif %}
|
||||
|
||||
@@ -37,7 +37,7 @@ Each CODEOWNERS file assigns the code owners for a single branch in the reposito
|
||||
|
||||
For code owners to receive review requests, the CODEOWNERS file must be on the base branch of the pull request. For example, if you assign `@octocat` as the code owner for *.js* files on the `gh-pages` branch of your repository, `@octocat` will receive review requests when a pull request with changes to *.js* files is opened between the head branch and `gh-pages`.
|
||||
|
||||
{% ifversion fpt or ghae or ghes > 3.2 or ghec %}
|
||||
{% ifversion fpt or ghec or ghes > 3.2 or ghae-issue-9273 %}
|
||||
## CODEOWNERS file size
|
||||
|
||||
CODEOWNERS files must be under 3 MB in size. A CODEOWNERS file over this limit will not be loaded, which means that code owner information is not shown and the appropriate code owners will not be requested to review changes in a pull request.
|
||||
|
||||
@@ -21,12 +21,6 @@ miniTocMaxHeadingLevel: 3
|
||||
{% ifversion fpt or ghec or ghes > 3.2 or ghae-issue-4742 %}
|
||||
## Autolinks
|
||||
|
||||
{% tip %}
|
||||
|
||||
**Note:** The Autolinks API is in beta and may change.
|
||||
|
||||
{% endtip %}
|
||||
|
||||
To help streamline your workflow, you can use the API to add autolinks to external resources like JIRA issues and Zendesk tickets. For more information, see "[Configuring autolinks to reference external resources](/github/administering-a-repository/configuring-autolinks-to-reference-external-resources)."
|
||||
|
||||
{% data variables.product.prodname_github_apps %} require repository administration permissions with read or write access to use the Autolinks API.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
You can identify if your enterprise has a {% data variables.product.prodname_GH_advanced_security %} license by reviewing {% ifversion ghes = 3.0 %}the {% data variables.enterprise.management_console %}{% elsif ghes > 3.0 %}your enterprise settings{% endif %}. For more information, see "[Enabling GitHub Advanced Security for your enterprise](/admin/advanced-security/enabling-github-advanced-security-for-your-enterprise#checking-whether-your-license-includes-github-advanced-security)."
|
||||
@@ -1 +1 @@
|
||||
If you can't see {% ifversion ghes < 3.2 %}**{% data variables.product.prodname_advanced_security %}**{% else %}**Security**{% endif %} in the sidebar, it means that your license doesn't include support for {% data variables.product.prodname_advanced_security %} features, including {% data variables.product.prodname_code_scanning %} and {% data variables.product.prodname_secret_scanning %}. The {% data variables.product.prodname_advanced_security %} license gives you and your users access to features that help you make your repositories and code more secure. {% ifversion ghes %}For more information, see "[About GitHub Advanced Security](/github/getting-started-with-github/about-github-advanced-security)" or contact {% data variables.contact.contact_enterprise_sales %}.{% endif %}
|
||||
If you can't see **{% data variables.product.prodname_advanced_security %}** in the sidebar, it means that your license doesn't include support for {% data variables.product.prodname_advanced_security %} features, including {% data variables.product.prodname_code_scanning %} and {% data variables.product.prodname_secret_scanning %}. The {% data variables.product.prodname_advanced_security %} license gives you and your users access to features that help you make your repositories and code more secure. For more information, see "[About GitHub Advanced Security](/github/getting-started-with-github/about-github-advanced-security)" or contact {% data variables.contact.contact_enterprise_sales %}.
|
||||
|
||||
@@ -100,6 +100,8 @@ Google | Google Cloud Storage Service Account Access Key ID | google_cloud_stora
|
||||
{%- ifversion fpt or ghec or ghes > 3.2 %}
|
||||
Google | Google Cloud Storage User Access Key ID | google_cloud_storage_user_access_key_id{% endif %}
|
||||
{%- ifversion fpt or ghec or ghes > 3.3 %}
|
||||
Google | Google OAuth Access Token | google_oauth_access_token{% endif %}
|
||||
{%- ifversion fpt or ghec or ghes > 3.3 %}
|
||||
Google | Google OAuth Client ID | google_oauth_client_id{% endif %}
|
||||
{%- ifversion fpt or ghec or ghes > 3.3 %}
|
||||
Google | Google OAuth Client Secret | google_oauth_client_secret{% endif %}
|
||||
|
||||
@@ -15,7 +15,7 @@ contact_dmca: >-
|
||||
contact_privacy: >-
|
||||
{% ifversion fpt or ghec %}[Privacy contact form](https://github.com/contact/privacy){% endif %}
|
||||
|
||||
contact_enterprise_sales: "[GitHub's Sales team](https://enterprise.github.com/contact)"
|
||||
contact_enterprise_sales: "[GitHub's Sales team](https://github.com/enterprise/contact)"
|
||||
|
||||
contact_feedback_actions: '[Feedback form for GitHub Actions](https://support.github.com/contact/feedback?contact[category]=actions)'
|
||||
|
||||
|
||||
@@ -1,11 +1 @@
|
||||
<nav class="UnderlineNav my-3" id="tool-switcher"
|
||||
{%- if page.defaultTool %} data-default-tool="{{ page.defaultTool }}"{% endif %}>
|
||||
<div class="UnderlineNav-body">
|
||||
<a href="#" class="UnderlineNav-item tool-switcher" data-tool="webui">Web browser</a>
|
||||
<a href="#" class="UnderlineNav-item tool-switcher" data-tool="cli">GitHub CLI</a>
|
||||
<a href="#" class="UnderlineNav-item tool-switcher" data-tool="curl">cURL</a>
|
||||
<a href="#" class="UnderlineNav-item tool-switcher" data-tool="desktop">Desktop</a>
|
||||
<a href="#" class="UnderlineNav-item tool-switcher" data-tool="codespaces">Codespaces</a>
|
||||
<a href="#" class="UnderlineNav-item tool-switcher" data-tool="vscode">Visual Studio Code</a>
|
||||
</div>
|
||||
</nav>
|
||||
<span class="tool-switcher"></span>
|
||||
|
||||
17
lib/page.js
17
lib/page.js
@@ -250,16 +250,19 @@ class Page {
|
||||
})
|
||||
}
|
||||
|
||||
this.detectedPlatforms = [
|
||||
(html.includes('extended-markdown mac') || html.includes('platform-mac')) && 'mac',
|
||||
(html.includes('extended-markdown windows') || html.includes('platform-windows')) &&
|
||||
'windows',
|
||||
(html.includes('extended-markdown linux') || html.includes('platform-linux')) && 'linux',
|
||||
].filter(Boolean)
|
||||
|
||||
// set a flag so layout knows whether to render a mac/windows/linux switcher element
|
||||
this.detectedPlatforms = ['mac', 'windows', 'linux'].filter(
|
||||
(platform) =>
|
||||
html.includes(`extended-markdown ${platform}`) || html.includes(`platform-${platform}`)
|
||||
)
|
||||
this.includesPlatformSpecificContent = this.detectedPlatforms.length > 0
|
||||
|
||||
// set flags for webui, cli, etc switcher element
|
||||
this.detectedTools = ['cli', 'desktop', 'webui', 'curl', 'codespaces', 'vscode'].filter(
|
||||
(tool) => html.includes(`extended-markdown ${tool}`) || html.includes(`tool-${tool}`)
|
||||
)
|
||||
this.includesToolSpecificContent = this.detectedTools.length > 0
|
||||
|
||||
return html
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4049476895fb239bc51e71ebd336338d41529afc67d2098dce429533dc003237
|
||||
size 641041
|
||||
oid sha256:02c3be78802a671eff62246867201005f2f32b4ba378ca9a23f66b110bb2c90e
|
||||
size 641026
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b0b2a1a218d1543eb344ae20b572c55b3e95859c5f6418dca4f7738ea730489c
|
||||
size 1111649
|
||||
oid sha256:abfce0aa6237573b2d15bdf2941e313989eb32da3777cd1ab8ca60657064ee1b
|
||||
size 1111794
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7166c39064400d935ff68fd4194d024349115b4015d7584f63a14e571b80f113
|
||||
size 944974
|
||||
oid sha256:4a7f59af0d3fbee3c53ef01010bc5059573f584ccbfd912507f5123f5fb35aab
|
||||
size 945496
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2ab881358f1b65eafb4780c410dc4cd0252cd02171e3faf47c0d8938e930bbfa
|
||||
size 3858188
|
||||
oid sha256:860cc4ca7ff227dbffb82fb5525c8700bec3d193ac1539ced3b9147462555ea4
|
||||
size 3859340
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2f88d199c16319f387dc7befa2247fdf161a1ff43c149ecb1474f68da324a301
|
||||
size 584420
|
||||
oid sha256:3423d63b344891401efff747430cc01519476a492bfd0bbab55244c08448fdcd
|
||||
size 584470
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2034c5b57c8f2fa0e1c49c827a213b0472109bff6cdf11067bf58912b0698e6a
|
||||
size 2455540
|
||||
oid sha256:64ca706f3feb4fca88f9e45898867dd15ec8f82d8db1a6c95271743ad92d212b
|
||||
size 2455391
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:995025c3a0e1fdda18833647304d9eae5b457f3858a8dffa41b47424105b94e1
|
||||
size 666491
|
||||
oid sha256:52d6a3098b658b332e9f4dd9a8d619a80425bf62ffb342feb8a2ee6735be5467
|
||||
size 666559
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a0a5ee449971aad8ba85fb09e59062fee537eaea68340681c2966fb4f41752df
|
||||
size 3450524
|
||||
oid sha256:cb4b451212a3cf883e153033eafcb2dbc5fc2eaecd82a7a322f8ff704fa8c480
|
||||
size 3451262
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ea29db113ce85355e408b98557371bd7a31d53f4762a12a5c21e39fc9f305aca
|
||||
size 544965
|
||||
oid sha256:489455dfad2f6a267a997ca518fd02740340222a804e36c54519542f5e98baaf
|
||||
size 544853
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:84c39d3b1c41752c800066cb8a5edcb17958c47a285c55e4ce04640babb70294
|
||||
size 2233851
|
||||
oid sha256:4a03d9a2ade87a3bc1c28cba5aef90120264ee468efd5c2e26145a821ee25ecb
|
||||
size 2234137
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4cb5ad2c1880cfa82c66379bd78ecb662809dd42df225f42c2ef5fa1a56a3932
|
||||
size 655625
|
||||
oid sha256:4b7474ce5591f7903eb808da630adecb47737693ea70e1a8c21f954b64cac6ae
|
||||
size 655479
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:aaaaa5076b294583fae46c0e057558041cb0d804800dc9f18c604f8cabbc02c6
|
||||
size 1144090
|
||||
oid sha256:c9225a66d8cb707e460f02a601f7b580ec4c9002f7527c006b22e5e7615335a2
|
||||
size 1144121
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2a8af3d531106d3f834ec517068786b91dd52cb9caf1c2fb8d06acf50c1d4643
|
||||
size 970024
|
||||
oid sha256:339b28f50c2d5db04e2a6636e82a33df02cc0f2d61fc581caf9cf8d0b235a8ba
|
||||
size 969801
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a52ee2080910250bde000300baf084993d065171a5591f2b369bf867f31f7bae
|
||||
size 3951668
|
||||
oid sha256:12b2a6782483ec1b53b9152351178732bda03f46ae97bdb30448b6338525eafc
|
||||
size 3950447
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:241912f2b98df27791f1aae857b74571e7ef08fb9b745b10ec8ea61f61dc20dd
|
||||
size 597228
|
||||
oid sha256:cad54cfc5eeadbe70b88be68966515be532b933fc9e3d5f1d549d9fa23fdc61a
|
||||
size 597186
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:23d4b5c4f3ed1c7ec69d038c5ca55fd5886d9baf932c00699ccfa995d4595e90
|
||||
size 2514879
|
||||
oid sha256:e0300ece82e027b0b0c7e871c5473a2bb2b3bd6c4bbb1a89a671a81bc5fed0ac
|
||||
size 2513922
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e520026797499331e24221d53fd73c24fcf935225aeb4c548613b366748adfc4
|
||||
size 681223
|
||||
oid sha256:297b3700b84e17f8b26e41e3987021eec9bfc07923f81faf5d92f96caeddbeb0
|
||||
size 681262
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:77a9b49b1b495ffd78c382b9325ad5d58d819577c4ab14533861826f476de0f6
|
||||
size 3533386
|
||||
oid sha256:48683320e1c9c829ea8ecc16bfba5f946403c7b3ed878d24b5aae87860b4af14
|
||||
size 3533506
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:264928ca75f4ac57c795299d25af5ca67d9240baa9918377831f552c33e3eda7
|
||||
size 557069
|
||||
oid sha256:506a753f2870e3d7ada7962747925b66930b74ca9feb6fe078fc3de2b66ca23a
|
||||
size 557092
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:67aad2a80ed7724c9f58a7daf685a33abbefd97f9f0c2ec21529db1eb1d5a649
|
||||
size 2289490
|
||||
oid sha256:cebeb0f6aedd93c789b1b8c3570532702a0dcfb02f6b0a2498a9c5d40caf224c
|
||||
size 2288779
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4f2aa508681440af8d93fc5b4f10ef5753627be6f80c1c2c08b89c35c40e11b0
|
||||
size 668718
|
||||
oid sha256:5427a56d953176defbf12f79e9b9cb487f17e609767044bc164f9c88ebbfe5a2
|
||||
size 668659
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4d832c1719ed684a7f5b35953d50d7250a5938c021c7829989e5e0393160b908
|
||||
size 1169094
|
||||
oid sha256:9ed8d110afb28d07b8795aa95746635c50f6a06e914fbd873589f2a6065686ab
|
||||
size 1168626
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c60fd8d5dce9adf6c582b098427b9509ee3dbf5241d4310ca7fc94ae7fc88483
|
||||
size 1000821
|
||||
oid sha256:d758d337e3e1b15fe5b019eb4b77575b02da10b6a1bc710bfbe1e1a02f52928f
|
||||
size 1000495
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ac61b65215de8922fe562b8bd49306d518d11e52c5807b166386716194a67295
|
||||
size 4070323
|
||||
oid sha256:6cfc6671eb9eb7b94c2829c63502dd254cf75a39721889a8435cf6d3ed5be680
|
||||
size 4070638
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f62f8658e0c0c2b0495a1a39bfd342e9159a5653d3e384942b7af8b9971b7ab5
|
||||
size 608258
|
||||
oid sha256:be88ed4dcba4f9a729d38b77bac9c682518402874d537aa6dde19c38d1e5884b
|
||||
size 607985
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0871545c7f18518daa953bcba6292e5637272ffce62b9bcd681f21688d87fde6
|
||||
size 2565982
|
||||
oid sha256:3bbc0a92643a1ec81d187bf2d3d9deb97d52e9c28c5db7e2916e137afc293931
|
||||
size 2565445
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:522045dfc163bf0c1c07650b75fec174dc9e51f0171e46a07d4b9a06d91192db
|
||||
size 693703
|
||||
oid sha256:002dd0691c18413d96a0a4b3b33a40ac81359b14e1891e1453a5a437bb5f29f2
|
||||
size 693734
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fd516842b0faff9a784672ae5e3a6b73401d0322260275f0ccb235065bc17b34
|
||||
size 3605119
|
||||
oid sha256:314aec3ca0e34fd19ab0861336596ea10e9fd1d87e1d985dcb5fc3ad6e329da8
|
||||
size 3604684
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e59ad385a800b9a365266e860ccdeae0821ee015aa70c556cbbb7d14119b47c1
|
||||
size 567333
|
||||
oid sha256:00699716566e801796126e7558b529b17f94c7cb2ff8dbc2f5825d0de84a3e2e
|
||||
size 567467
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0ef9cf8810cb83d8c70bd329adf8dd6ba7c9524de2a90a1e3390b958b5fa4a37
|
||||
size 2331617
|
||||
oid sha256:f6575a86cddfbb9f8718a6d78d2bd372c2708627fae77c83d8f03d0b0ed42f6f
|
||||
size 2331721
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:83d0f55f34c14378cfc55869db81d610e4e82ec44c6e3654a39735f0c69fcef6
|
||||
size 691539
|
||||
oid sha256:7f1ea773f839b3b61daaa9f69ca3415e4c0130a30eca0b7f960cfea2905bf8f4
|
||||
size 691373
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:55918d08e38df87aab5502ae5389233815f720405e90f3d876f7d27fdd47722e
|
||||
size 1226449
|
||||
oid sha256:76ab10ab4bf43ec717cf80e9241384ab14b7a62edfd6372a83f650e89c88df59
|
||||
size 1226577
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:14f9c12a3c7ad88c0bf99ac93153af53cb0464b863c78a624064e3c580c4efb2
|
||||
size 1034557
|
||||
oid sha256:71a85824e91fd1693ae349749c193f53fbfd9fee10a998540683267970a5dd1e
|
||||
size 1034322
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fa363ef21cf719ecef4ba4b13ecf2f6c642fbc4aebdc086640f766c89c5ec171
|
||||
size 4166266
|
||||
oid sha256:11a19c08b2512d0644ac7725bca2070fce4c19ccf40374964710eb28a56b433e
|
||||
size 4167514
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e20a7f3795818920308100b30595796c4c170eba4c62680f4b70d577a3be3765
|
||||
size 626610
|
||||
oid sha256:439f3d96b062c9aaa65aa3c7485036f49fb7d2e0fe254fcb34f8bbbf24319a7e
|
||||
size 626746
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1f9a60b978506e84f321d83607e682bfb86fcbeaea57d74325fb8b16efa0bb8c
|
||||
size 2665818
|
||||
oid sha256:3bb69092c364b0676d32fca3636965a672961385d97ce3278e93387c35e24e6f
|
||||
size 2666511
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d307f62694f67f388457f9cd9c9c8b81256dfe1d22c0b7eed1a6a3d5f25030d9
|
||||
size 716392
|
||||
oid sha256:13fdeb841ef34e183086e61258b548c7192a0a2158f8d4ae6c799e1ff3964b81
|
||||
size 716476
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b5bd3ae3940aac2a77a39e70e80c63d32c6a014466ac15a0df3be62a0cc152e8
|
||||
size 3733744
|
||||
oid sha256:46074ff9fb253c5d0cbaae64383d08b6dfd114ae0a522bd6464bfcd484c9b9ac
|
||||
size 3733335
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6a96cdb2a0f76e6e2d02006795d695e6fa54b98d883bfc0926fafbd18fd7fba3
|
||||
size 585848
|
||||
oid sha256:7e3e12531e152929be6dc90e64345b4930814111e8a5e43d0ec6f91283f921a3
|
||||
size 585857
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:34f9a77a145aded15cfbf0f4bd7ea996e170f89f8111f7524abca045b63ed390
|
||||
size 2415923
|
||||
oid sha256:fbf9ed32498bc544a062e737f45cf1387ca770c7bb7b0e642dcc3b1e4773f135
|
||||
size 2415645
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fd0f19fbb1a0fe94594749382b08227d0720c7fd26f90c1451f567a2b5864968
|
||||
size 903714
|
||||
oid sha256:f5dceb291cc2ff5c59f53ec7977f060cb33c430e9537d4332f066ff2084a1af0
|
||||
size 903811
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:70d146912a0976fadf6880d4839bcd4a0801703a8584f8599eada139b41911cd
|
||||
size 1446676
|
||||
oid sha256:31b4a56ad4608cd3b512152f1e9ab858f1c84019b5da14f58e3d2eaeb591dc48
|
||||
size 1446506
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ee29a9792b9205015d2e476f547546ddb99228bef87ff7e2c2a7cfccac455fcf
|
||||
size 1328029
|
||||
oid sha256:eb241b3ce4a2aaa0a9a04c0947e54df2d0b4f38ad5838e99f9548a9288d66ca9
|
||||
size 1320807
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:251d45bfc7553c51b6b065b102d41a6122bd6590d3ce39d858953658354d2d46
|
||||
size 5057097
|
||||
oid sha256:e203dee96492179092f625fffea1ad454d7671f4fd0ea171051f283ade981c3e
|
||||
size 5057795
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1a51cbbeb667b81bcbf3df02c1de62690586cd66d9bda264634b679f1542bc8c
|
||||
size 804554
|
||||
oid sha256:4ea7c1c8d6fe77d1bd6d9b33ffe834935b8cf2bec37dfea468b16b8eb86aa70a
|
||||
size 804358
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ef1843d8e80f292d84b8944d605965a12ce952701213691ab188cc8ac486e83c
|
||||
size 3257274
|
||||
oid sha256:fe624647cc71f0a823ee2d9207efa6f2afd5fbd424b3602e96337a08d472c7cd
|
||||
size 3257618
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fc3d32dca890327d675fd37e55f5cfbffd0733ed654815dd2f45bc9edbd81584
|
||||
size 929964
|
||||
oid sha256:c0c4465da82fc8ef6f98f5cd38f0a37e0027d1d88b9aebdc6ff2fcf3cc3286a1
|
||||
size 930176
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c1ffbb4c18a7620c87b401b25ef7ed0327b4238c9ab3e8456400a25ba29972d9
|
||||
size 4684151
|
||||
oid sha256:93917d3818cab17fe7c948a086f43b4a1e073c4ff216d588eb0a0c9987184a9c
|
||||
size 4682871
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b7c54cb25b72eae9f4ee1f47191ed603eb8e9f349f2faae85fb9fce5092f58bd
|
||||
size 767565
|
||||
oid sha256:4bc16329d51ce76fb4f3bd5b5393ad960afdf8e5429e68454c3db9a5ef7e9c2b
|
||||
size 767593
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:cc01b486d49a5b787a57371687c20ba33885ec7c721bf12442357e112fb38eef
|
||||
size 3040552
|
||||
oid sha256:6cafd3ec08d6ab40be5b06b9f4efb7802eb6a82c29d21d4e15bd99a839577120
|
||||
size 3040789
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c0ccfacb0470c2d3bada0d1780e49b508ab0b4b80f11f15e6b043ab10b427bff
|
||||
size 518860
|
||||
oid sha256:6333fe71df532bda0dedb37120f9634cbbfa8462d21c07859444e1cf25359634
|
||||
size 518857
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ef23b630e10b8714b0efa9af50c8084dbc4c338111ab377e7878dbd5ecab5028
|
||||
size 880326
|
||||
oid sha256:89c48a904fa53661be399e141da337a3490c38c5951b73e803014ee9c8b95fa0
|
||||
size 879729
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8958acc20c35b5347bd5aaefd6423fb7bde1991e1e7daaab1b0dab4e5f132795
|
||||
size 801401
|
||||
oid sha256:423226ab6e8767968465ab6a79b4fb3f453088a1c83c1ffbac40bbf61ebdc853
|
||||
size 801059
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:209be38a3e7f71bbca95b88cfbc018f57d6ee6d4eda3cc1a050e73f86a5061de
|
||||
size 3214584
|
||||
oid sha256:7845996320dea0c5007e3965955ec878ebf50544b3812715b594c9f5d6eee63f
|
||||
size 3214634
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ce52fdbe18a6f0ad892c34ac05c1c53462c4a6f377c4141fba4b59145aa7f22c
|
||||
size 473569
|
||||
oid sha256:72ff4efe2af24699fb99978f5bc53c4847a35a4c79ca8a516fc392f804a6fe3e
|
||||
size 473549
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0148640cccc9c0a279c753009b9dcfe99b0a04684b0ff0c22617367d3975c8c5
|
||||
size 1924896
|
||||
oid sha256:e90d208aacf5c4cc470355879f8e4bd08740b9328a55368f21a3c7854f053e73
|
||||
size 1924411
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2f99cd290b8b9015551e095e883cdb8375a258a4ae7e6d1309f3b589e43b3d63
|
||||
size 539340
|
||||
oid sha256:3776eea6509ceec824251493e55aaffe151af016683f2ed96a7ac64e22fc83fb
|
||||
size 539152
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:bd4877cc043e5a4317063118d2ac4c5ef6f1cff4ac4360d197d4be7926e9034e
|
||||
size 2696219
|
||||
oid sha256:f4896e5f65979865696d8768f745ee344f2ac3b4a434fe63ad1f0a3b90354c53
|
||||
size 2694992
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:729daf37f30f609328ed5062ae84a20303fb36679d54a7342ca05e8afd10d3e7
|
||||
size 441730
|
||||
oid sha256:2357a5bd42d601b17cf75b690bbd2455b53ac59c0204b2f01f26f5e0d4059ae2
|
||||
size 441898
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2822461d4e9f0bd3a7e6091c4236e29dd44bff3c1811af1c4897e205ea0bb2da
|
||||
size 1753555
|
||||
oid sha256:7eb3748be348e01e4286342da967d5bfcb19a4877f195ded0666127bbfaa76d4
|
||||
size 1753075
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6ad550fccae88cd6439678ccbe7493b8b7b25b928bf65fbc41f170cff7e220fd
|
||||
size 801555
|
||||
oid sha256:71be4fdff8bb7944d518360465646a34588979dbd5fce84620e3e48aaf002a91
|
||||
size 801617
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4da3dd920cca01a205f80fcd173caeae7a3bb73f707a44a688e22381350710ed
|
||||
size 1447663
|
||||
oid sha256:a83dcb561b524df42c6a13b66ffaae1cad26806ef31dd0704d99b9d4b35a0cc2
|
||||
size 1447099
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d6fb971d6435dd6ea697a30c977a641794f583d3f9f77824f80c2cf08667c7bb
|
||||
size 1175104
|
||||
oid sha256:e989e9583754725b3e7dcb56abd29a7eea026cdf5760020d6c7a3aede37ff4fd
|
||||
size 1175692
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:964a4e2594a2f525069a529c8ba2915a3fcc51fb91b742a3d3216c70f3f4844d
|
||||
size 4727788
|
||||
oid sha256:53f7589a100bd260cc36ada335e86c5ff2b85b848737d9874590da0a63e44be8
|
||||
size 4729554
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:929ae4b019083381064094638d0458e7ed101319829f9951ae72f7b2f8509e48
|
||||
size 736375
|
||||
oid sha256:3c926f7f0ca604c79c965fb7f6018add00456b5b15381e667c4534ae62febcd6
|
||||
size 736390
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a0ce99de2b32d50d67ad42474530816cd0c9f87a8e4ad1fd4bd0964d4e6b9ae3
|
||||
size 3133761
|
||||
oid sha256:1bd35ef02d185e40ecbd09c10df16acc34514c039e9f33e172d7679980b73098
|
||||
size 3134004
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4c6b06174df3b0eefe24f5254333a7370d3b724b4ffbee108ee4477cfd3a3606
|
||||
size 831633
|
||||
oid sha256:12ae1eb68ad142af3cfe9c3b64c7edd92ec131642bedcc8c8d7ba119c67fb78d
|
||||
size 831415
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:84ac8f110a88e55f4f4f6b0c2964c34d2766a446d0eeed7156caa9727cbe6d62
|
||||
size 4394083
|
||||
oid sha256:a4baf9353f396addef46b2520c5bb2884b0f3d8a5bff17cdf05859cafacd34f8
|
||||
size 4393755
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f9e2c76af3bf9296b6ab7230ef2205a1598edde4984e836a2b0ec299c32afe44
|
||||
size 706733
|
||||
oid sha256:59b896ccf232cc7e1ec9c522b65ee8d4eb993d2eacce9ecbaab23eb0516a06a1
|
||||
size 706894
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d8b89cc136a3e40a481cd893478401ab7d744e6cac46652e82bce6d6254c2404
|
||||
size 2943592
|
||||
oid sha256:5941aeb01bafc85393a0b0e19b46e4a8fc7676bb5c29a945a1ae94136c08365a
|
||||
size 2944565
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user