gitextract_va1v6f6n/ ├── .all-contributorsrc ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── .vscode/ │ │ └── settings.json │ ├── mergify.yml │ └── workflows/ │ ├── auto-cancellation.yml │ ├── deploy.yml │ ├── e2e-test-pr.yml │ ├── e2e-test-push.yml │ ├── html-test.yml │ ├── sonar-cloud.yml │ ├── unit-test.yml │ ├── update-e2e-snapshot.yml │ └── update-html-snapshot.yml ├── .gitignore ├── .imgbotconfig ├── .renovaterc.json ├── LICENSE ├── Makefile ├── README.md ├── README_zh-hans.md ├── backend/ │ ├── .config/ │ │ └── dotnet-tools.json │ ├── .dockerignore │ ├── .gitattributes │ ├── .gitignore │ ├── AcmStatisticsBackend.sln │ ├── AcmStatisticsBackend.sln.DotSettings │ ├── Directory.Build.props │ ├── Makefile │ ├── README.md │ ├── StyleCop.ruleset │ ├── dev.Dockerfile │ ├── global.json │ ├── src/ │ │ ├── AcmStatisticsBackend.Application/ │ │ │ ├── Accounts/ │ │ │ │ ├── AccountAppService.cs │ │ │ │ ├── Dto/ │ │ │ │ │ ├── ChangePasswordInput.cs │ │ │ │ │ ├── RegisterInput.cs │ │ │ │ │ └── RegisterOutput.cs │ │ │ │ └── IAccountAppService.cs │ │ │ ├── AcmStatisticsBackend.Application.csproj │ │ │ ├── AcmStatisticsBackendAppServiceBase.cs │ │ │ ├── AcmStatisticsBackendApplicationModule.cs │ │ │ ├── Authorization/ │ │ │ │ └── AbpLoginResultTypeHelper.cs │ │ │ ├── Crawlers/ │ │ │ │ ├── DefaultQueryAppService.cs │ │ │ │ ├── Dto/ │ │ │ │ │ ├── DefaultQueryDto.cs │ │ │ │ │ ├── DeleteQueryHistoryInput.cs │ │ │ │ │ ├── GetAcWorkerHistoryInput.cs │ │ │ │ │ ├── GetQueryHistoryAndSummaryOutput.cs │ │ │ │ │ ├── GetQueryHistoryOutput.cs │ │ │ │ │ ├── GetQuerySummaryInput.cs │ │ │ │ │ ├── QueryCrawlerSummaryDto.cs │ │ │ │ │ ├── QuerySummaryDto.cs │ │ │ │ │ ├── QueryWorkerHistoryDto.cs │ │ │ │ │ ├── SaveOrReplaceQueryHistoryInput.cs │ │ │ │ │ ├── SaveOrReplaceQueryHistoryOutput.cs │ │ │ │ │ └── UsernameInCrawlerDto.cs │ │ │ │ ├── IDefaultQueryAppService.cs │ │ │ │ ├── IQueryHistoryAppService.cs │ │ │ │ └── QueryHistoryAppService.cs │ │ │ ├── Net/ │ │ │ │ └── MimeTypes/ │ │ │ │ └── MimeTypeNames.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Sessions/ │ │ │ │ ├── Dto/ │ │ │ │ │ ├── ApplicationInfoDto.cs │ │ │ │ │ ├── GetCurrentLoginInformationsOutput.cs │ │ │ │ │ ├── TenantLoginInfoDto.cs │ │ │ │ │ └── UserLoginInfoDto.cs │ │ │ │ ├── ISessionAppService.cs │ │ │ │ └── SessionAppService.cs │ │ │ └── Settings/ │ │ │ ├── Dto/ │ │ │ │ ├── UpdateAutoSaveHistoryInput.cs │ │ │ │ ├── UserSettingsConfigDto.cs │ │ │ │ └── UserTimeZoneDto.cs │ │ │ ├── IUserConfigAppService.cs │ │ │ └── UserConfigAppService.cs │ │ ├── AcmStatisticsBackend.Core/ │ │ │ ├── AcmStatisticsBackend.Core.csproj │ │ │ ├── AcmStatisticsBackendConsts.cs │ │ │ ├── AcmStatisticsBackendCoreModule.cs │ │ │ ├── AcmStatisticsBackendExtensions.cs │ │ │ ├── AppVersionHelper.cs │ │ │ ├── Authorization/ │ │ │ │ ├── AcmStatisticsBackendAuthorizationProvider.cs │ │ │ │ ├── LoginManager.cs │ │ │ │ ├── PermissionChecker.cs │ │ │ │ ├── PermissionNames.cs │ │ │ │ ├── Roles/ │ │ │ │ │ ├── AppRoleConfig.cs │ │ │ │ │ ├── Role.cs │ │ │ │ │ ├── RoleManager.cs │ │ │ │ │ ├── RoleStore.cs │ │ │ │ │ └── StaticRoleNames.cs │ │ │ │ └── Users/ │ │ │ │ ├── User.cs │ │ │ │ ├── UserClaimsPrincipalFactory.cs │ │ │ │ ├── UserDeletingEventHandler.cs │ │ │ │ ├── UserManager.cs │ │ │ │ ├── UserRegistrationManager.cs │ │ │ │ └── UserStore.cs │ │ │ ├── Configuration/ │ │ │ │ ├── AppConfigurations.cs │ │ │ │ ├── AppEnvironmentVariables.cs │ │ │ │ ├── AppSettingNames.cs │ │ │ │ └── AppSettingProvider.cs │ │ │ ├── Crawlers/ │ │ │ │ ├── DefaultQuery.cs │ │ │ │ ├── QueryCrawlerSummary.cs │ │ │ │ ├── QueryHistory.cs │ │ │ │ ├── QuerySummary.cs │ │ │ │ ├── QueryWorkerHistory.cs │ │ │ │ ├── SummaryGenerator.cs │ │ │ │ ├── SummaryWarning.cs │ │ │ │ └── UsernameInCrawler.cs │ │ │ ├── Editions/ │ │ │ │ └── EditionManager.cs │ │ │ ├── Features/ │ │ │ │ └── FeatureValueStore.cs │ │ │ ├── Identity/ │ │ │ │ ├── IdentityRegistrar.cs │ │ │ │ ├── SecurityStampValidator.cs │ │ │ │ └── SignInManager.cs │ │ │ ├── Localization/ │ │ │ │ ├── AcmStatisticsBackendLocalizationConfigurer.cs │ │ │ │ └── SourceFiles/ │ │ │ │ ├── AcmStatisticsBackend-es.xml │ │ │ │ ├── AcmStatisticsBackend-fr.xml │ │ │ │ ├── AcmStatisticsBackend-it.xml │ │ │ │ ├── AcmStatisticsBackend-ja.xml │ │ │ │ ├── AcmStatisticsBackend-lt.xml │ │ │ │ ├── AcmStatisticsBackend-nl.xml │ │ │ │ ├── AcmStatisticsBackend-pt-BR.xml │ │ │ │ ├── AcmStatisticsBackend-tr.xml │ │ │ │ ├── AcmStatisticsBackend-zh-Hans.xml │ │ │ │ └── AcmStatisticsBackend.xml │ │ │ ├── MultiTenancy/ │ │ │ │ ├── Tenant.cs │ │ │ │ └── TenantManager.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── ServiceClients/ │ │ │ │ ├── CaptchaServiceClient.cs │ │ │ │ ├── CaptchaServiceValidateResult.cs │ │ │ │ ├── CrawlerApiBackendClient.cs │ │ │ │ ├── CrawlerMetaItem.cs │ │ │ │ ├── ICaptchaServiceClient.cs │ │ │ │ └── ICrawlerApiBackendClient.cs │ │ │ ├── Settings/ │ │ │ │ └── UserSettingAttribute.cs │ │ │ ├── Timing/ │ │ │ │ └── AppTimes.cs │ │ │ ├── Validation/ │ │ │ │ └── ValidationHelper.cs │ │ │ └── Web/ │ │ │ └── WebContentFolderHelper.cs │ │ ├── AcmStatisticsBackend.EntityFrameworkCore/ │ │ │ ├── AcmStatisticsBackend.EntityFrameworkCore.csproj │ │ │ ├── EntityFrameworkCore/ │ │ │ │ ├── AbpZeroDbMigrator.cs │ │ │ │ ├── AcmStatisticsBackendDbContext.cs │ │ │ │ ├── AcmStatisticsBackendDbContextConfigurer.cs │ │ │ │ ├── AcmStatisticsBackendDbContextFactory.cs │ │ │ │ ├── AcmStatisticsBackendEntityFrameworkModule.cs │ │ │ │ ├── Repositories/ │ │ │ │ │ └── AcmStatisticsBackendRepositoryBase.cs │ │ │ │ └── Seed/ │ │ │ │ ├── Host/ │ │ │ │ │ ├── DefaultEditionCreator.cs │ │ │ │ │ ├── DefaultLanguagesCreator.cs │ │ │ │ │ ├── DefaultSettingsCreator.cs │ │ │ │ │ ├── HostRoleAndUserCreator.cs │ │ │ │ │ └── InitialHostDbBuilder.cs │ │ │ │ ├── SeedHelper.cs │ │ │ │ └── Tenants/ │ │ │ │ ├── DefaultTenantBuilder.cs │ │ │ │ └── TenantRoleAndUserBuilder.cs │ │ │ └── Migrations/ │ │ │ ├── 20200325035348_Init.Designer.cs │ │ │ ├── 20200325035348_Init.cs │ │ │ ├── 20200410093107_AddDefaultQuery.Designer.cs │ │ │ ├── 20200410093107_AddDefaultQuery.cs │ │ │ ├── 20200414102908_AddAcHistory.Designer.cs │ │ │ ├── 20200414102908_AddAcHistory.cs │ │ │ ├── 20200419031052_UseQueryHistory.Designer.cs │ │ │ ├── 20200419031052_UseQueryHistory.cs │ │ │ ├── 20200522145416_AddSettings.Designer.cs │ │ │ ├── 20200522145416_AddSettings.cs │ │ │ ├── 20200604111842_AddSummary.Designer.cs │ │ │ ├── 20200604111842_AddSummary.cs │ │ │ ├── 20210429095008_UpgradeAbp.Designer.cs │ │ │ ├── 20210429095008_UpgradeAbp.cs │ │ │ ├── 20210627092246_RemoveRoleDescription.Designer.cs │ │ │ ├── 20210627092246_RemoveRoleDescription.cs │ │ │ ├── 20210627092411_UpgradeDriver.Designer.cs │ │ │ ├── 20210627092411_UpgradeDriver.cs │ │ │ ├── 20250813025256_UpgradeAbp840.Designer.cs │ │ │ ├── 20250813025256_UpgradeAbp840.cs │ │ │ └── AcmStatisticsBackendDbContextModelSnapshot.cs │ │ ├── AcmStatisticsBackend.Web.Core/ │ │ │ ├── AcmStatisticsBackend.Web.Core.csproj │ │ │ ├── AcmStatisticsBackendWebCoreModule.cs │ │ │ ├── Authentication/ │ │ │ │ └── JwtBearer/ │ │ │ │ ├── JwtTokenMiddleware.cs │ │ │ │ └── TokenAuthConfiguration.cs │ │ │ ├── Configuration/ │ │ │ │ └── HostingEnvironmentExtensions.cs │ │ │ ├── Controllers/ │ │ │ │ ├── AcmStatisticsBackendControllerBase.cs │ │ │ │ └── TokenAuthController.cs │ │ │ ├── Middleware/ │ │ │ │ └── CookieAuthMiddleware.cs │ │ │ ├── Models/ │ │ │ │ └── TokenAuth/ │ │ │ │ ├── AuthenticateModel.cs │ │ │ │ └── AuthenticateResultModel.cs │ │ │ └── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── AcmStatisticsBackend.Web.Host/ │ │ ├── AcmStatisticsBackend.Web.Host.csproj │ │ ├── Controllers/ │ │ │ └── AntiForgeryController.cs │ │ ├── Dockerfile │ │ ├── Properties/ │ │ │ └── launchSettings.json │ │ ├── Startup/ │ │ │ ├── AcmStatisticsBackendWebHostModule.cs │ │ │ ├── AuthConfigurer.cs │ │ │ ├── Program.cs │ │ │ └── Startup.cs │ │ ├── app.config │ │ ├── appsettings.Staging.json │ │ ├── appsettings.json │ │ ├── log4net.config │ │ └── web.config │ ├── stylecop.json │ └── test/ │ └── AcmStatisticsBackend.Tests/ │ ├── Accounts/ │ │ ├── AccountAppService_Tests.cs │ │ └── FakeCaptchaServiceClient.cs │ ├── AcmStatisticsBackend.Tests.csproj │ ├── AcmStatisticsBackendTestBase.cs │ ├── AcmStatisticsBackendTestModule.cs │ ├── Crawlers/ │ │ ├── DefaultQueryAppService_Tests.cs │ │ ├── QueryHistoryAppService_Tests.cs │ │ ├── QuerySummary_ModelTests.cs │ │ └── SummaryGenerator_Tests.cs │ ├── DependencyInjection/ │ │ ├── ServiceCollectionRegistrar.cs │ │ ├── TestClockProvider.cs │ │ └── TestCrawlerApiBackendClient.cs │ ├── MultiTenantFactAttribute.cs │ ├── Properties/ │ │ └── AssemblyInfo.cs │ ├── ServiceClients/ │ │ ├── CaptchaServiceClient_Tests.cs │ │ └── CrawlerApiBackendClient_Tests.cs │ ├── Sessions/ │ │ └── SessionAppService_Tests.cs │ ├── Settings/ │ │ └── UserConfigAppService_TimeZone_Tests.cs │ └── TestExtensions.cs ├── build/ │ ├── .dockerignore │ ├── .gitignore │ ├── commitlint.Dockerfile │ ├── commitlint.mk │ ├── docker-compose.dcproj │ ├── docker-compose.dev-backend.yml │ ├── docker-compose.dev-frontend.yml │ ├── docker-compose.e2e.yml │ ├── docker-compose.mk │ ├── docker-compose.yml │ ├── node-base.Dockerfile │ ├── node-base.mk │ ├── share.mk │ ├── shell.Dockerfile │ ├── shell.mk │ └── template.env ├── captcha-service/ │ ├── .dockerignore │ ├── .eslintrc.js │ ├── .gitignore │ ├── Makefile │ ├── README.md │ ├── __mocks__/ │ │ └── svg-captcha.js │ ├── __test__/ │ │ ├── app.spec.js │ │ └── interface.test.js │ ├── base.Dockerfile │ ├── package.json │ ├── release.Dockerfile │ └── src/ │ ├── app.js │ ├── index.js │ └── restHelper.js ├── codecov.yml ├── commitlint.config.js ├── crawler/ │ ├── .dockerignore │ ├── .eslintrc.js │ ├── .gitignore │ ├── .vscode/ │ │ └── launch.json │ ├── Makefile │ ├── README.md │ ├── __mocks__/ │ │ └── fs.js │ ├── __test__/ │ │ ├── __snapshots__/ │ │ │ └── crawlers.test.js.snap │ │ ├── configReader.test.js │ │ ├── crawlers.test.js │ │ └── functionGenerator.test.js │ ├── base.Dockerfile │ ├── config.yml │ ├── crawlers/ │ │ ├── .eslintrc.js │ │ ├── LICENSE │ │ ├── aizu.js │ │ ├── atcoder.js │ │ ├── bnu.js │ │ ├── codechef.js │ │ ├── codeforces.js │ │ ├── codewars.js │ │ ├── csu.js │ │ ├── dashiye.js │ │ ├── dmoj.js │ │ ├── eljudge.js │ │ ├── fzu.js │ │ ├── hdu.js │ │ ├── leetcode_cn.js │ │ ├── loj.js │ │ ├── luogu.js │ │ ├── nbut.js │ │ ├── nit.js │ │ ├── nod.js │ │ ├── nowcoder.js │ │ ├── poj.js │ │ ├── sdutoj.js │ │ ├── spoj.js │ │ ├── timus.js │ │ ├── uestc.js │ │ ├── uoj.js │ │ ├── uva.js │ │ ├── uvalive.js │ │ ├── vjudge.js │ │ └── zoj.js │ ├── index.js │ ├── lib/ │ │ ├── __mocks__/ │ │ │ └── configReader.js │ │ ├── configReader.js │ │ ├── functionGenerator.js │ │ └── globalProxy.js │ ├── package.json │ └── release.Dockerfile ├── crawler-api-backend/ │ ├── .dockerignore │ ├── .eslintrc.js │ ├── .gitignore │ ├── Makefile │ ├── README.md │ ├── __mocks__/ │ │ └── crawler.js │ ├── __test__/ │ │ ├── __snapshots__/ │ │ │ └── apiRouter.test.js.snap │ │ └── apiRouter.test.js │ ├── apiRouter.js │ ├── app.js │ ├── base.Dockerfile │ ├── config/ │ │ └── log.js │ ├── index.js │ ├── package.json │ ├── release.Dockerfile │ ├── swagger.json │ └── utils/ │ ├── logUtil.js │ ├── rateLimit.js │ └── restHelper.js ├── e2e/ │ ├── .dockerignore │ ├── .eslintignore │ ├── .eslintrc.js │ ├── .gitignore │ ├── .npmrc │ ├── Dockerfile │ ├── Makefile │ ├── README.md │ ├── __test__/ │ │ └── pages/ │ │ ├── __snapshots__/ │ │ │ └── pages_snapshot.test.js.snap │ │ └── pages_snapshot.test.js │ ├── cypress/ │ │ ├── fixtures/ │ │ │ ├── example.json │ │ │ ├── history_list-max5.json │ │ │ ├── history_list-skip10.json │ │ │ ├── history_list.json │ │ │ ├── poj_notExist.txt │ │ │ ├── poj_ok.txt │ │ │ ├── summary_hdu.txt │ │ │ ├── summary_leetcode.txt │ │ │ └── summary_vjudge.txt │ │ ├── integration/ │ │ │ ├── application/ │ │ │ │ ├── auth-redirect.spec.js │ │ │ │ ├── auto-save-history.spec.js │ │ │ │ ├── default-query.spec.js │ │ │ │ ├── login-and-register.spec.js │ │ │ │ └── swagger.spec.js │ │ │ └── frontend/ │ │ │ ├── about.spec.js │ │ │ ├── history.spec.js │ │ │ ├── index.spec.js │ │ │ ├── login-register.spec.js │ │ │ ├── settings.spec.js │ │ │ ├── side-bar.spec.js │ │ │ └── statistics.spec.js │ │ └── support/ │ │ ├── commands.js │ │ └── e2e.js │ ├── cypress.config.js │ ├── http-mocks/ │ │ ├── .dockerignore │ │ ├── .gitignore │ │ ├── Dockerfile │ │ ├── package.json │ │ └── src/ │ │ ├── index.js │ │ ├── lib/ │ │ │ ├── mock.js │ │ │ └── restClient.js │ │ ├── mocks/ │ │ │ ├── busuanzi.js │ │ │ ├── googleAds.js │ │ │ ├── googleAnalysis.js │ │ │ ├── history-snapshot.js │ │ │ ├── oj.js │ │ │ ├── reset.js │ │ │ └── tajs.js │ │ └── preActivation.js │ ├── jsconfig.json │ └── package.json ├── frontend/ │ ├── .dockerignore │ ├── .editorconfig │ ├── .eslintignore │ ├── .eslintrc.js │ ├── .gitignore │ ├── .npmrc │ ├── .nuxtignore │ ├── Makefile │ ├── README.md │ ├── __test__/ │ │ ├── StoreContextSimulator.js │ │ ├── components/ │ │ │ ├── MessagePanel.test.js │ │ │ ├── WorkerCard.test.js │ │ │ ├── __snapshots__/ │ │ │ │ ├── MessagePanel.test.js.snap │ │ │ │ └── WorkerCard.test.js.snap │ │ │ ├── statisticsLayoutBuilder.test.js │ │ │ └── statisticsUtils.test.js │ │ ├── e2eMocks/ │ │ │ └── crawler.js │ │ └── store/ │ │ └── statistics.test.js │ ├── app.html │ ├── assets/ │ │ ├── README.md │ │ └── style/ │ │ └── app.scss │ ├── babel.config.js │ ├── base.Dockerfile │ ├── components/ │ │ ├── GithubButton.vue │ │ ├── MessagePanel.vue │ │ ├── README.md │ │ ├── ResultOverlay.vue │ │ ├── UserStatus.vue │ │ ├── WorkerCard.vue │ │ ├── consts.js │ │ ├── rulesMixin.js │ │ ├── statisticsLayoutBuilder.js │ │ ├── statisticsUtils.js │ │ └── utils.js │ ├── configs/ │ │ └── sensitive-url-router.js │ ├── layouts/ │ │ ├── README.md │ │ ├── default.vue │ │ ├── error.vue │ │ ├── login.vue │ │ └── none.vue │ ├── middleware/ │ │ ├── README.md │ │ └── auth.js │ ├── modules/ │ │ └── crawlerLoader/ │ │ ├── README.md │ │ ├── cors.js │ │ └── index.js │ ├── nuxt.config.js │ ├── package.json │ ├── pages/ │ │ ├── README.md │ │ ├── about.vue │ │ ├── history/ │ │ │ ├── _id/ │ │ │ │ ├── -GoHistoryPage.vue │ │ │ │ ├── -HistoryToolbar.vue │ │ │ │ └── index.vue │ │ │ └── index.vue │ │ ├── index.vue │ │ ├── jojo.vue │ │ ├── login.vue │ │ ├── register.vue │ │ ├── settings.vue │ │ └── statistics.vue │ ├── plugins/ │ │ ├── README.md │ │ ├── chartjs.js │ │ ├── debug.js │ │ └── font.js │ ├── release.Dockerfile │ ├── static/ │ │ ├── google90cac42981c276fb.html │ │ └── swagger/ │ │ ├── abp.js │ │ ├── abp.swagger.js │ │ ├── index.html │ │ ├── oauth2-redirect.html │ │ ├── swagger-ui-bundle.js │ │ ├── swagger-ui-standalone-preset.js │ │ ├── swagger-ui.css │ │ └── swagger-ui.js │ ├── store/ │ │ ├── -dynamic/ │ │ │ └── statistics.js │ │ ├── README.md │ │ ├── index.js │ │ ├── message.js │ │ └── session.js │ └── vuetify.options.js ├── ohunt/ │ ├── .config/ │ │ └── dotnet-tools.json │ ├── .dockerignore │ ├── .gitignore │ ├── Makefile │ ├── OHunt.Tests/ │ │ ├── Crawlers/ │ │ │ ├── BnuMappingCrawlerTests.cs │ │ │ ├── NitMappingCrawlerTests.cs │ │ │ ├── UvaMappingCrawlersTests.cs │ │ │ ├── ZojSubmissionCrawlerTests.cs │ │ │ └── __snapshots__/ │ │ │ └── ZojSubmissionCrawlerTests.It_ShouldGetCorrectResult.snap │ │ ├── Dataflow/ │ │ │ ├── CrawlerPropagatorTests.cs │ │ │ ├── DatabaseInserterTests.cs │ │ │ └── SubmissionCrawlerCoordinatorTests.cs │ │ ├── Dependency/ │ │ │ ├── NullDbBuilder.cs │ │ │ ├── OHuntTestBase.cs │ │ │ └── TestWebApplicationFactory.cs │ │ ├── OHunt.Tests.csproj │ │ ├── Services/ │ │ │ └── ProblemLabelManagerTests.cs │ │ ├── TestExtensions.cs │ │ ├── Utils.cs │ │ └── Web/ │ │ ├── ProblemControllerTests.cs │ │ ├── StartupTests.cs │ │ ├── SubmissionControllerTests.cs │ │ ├── SwaggerTests.cs │ │ └── __snapshots__/ │ │ └── SwaggerTests.It_ShouldOutputDocument.snap │ ├── OHunt.Web/ │ │ ├── Controllers/ │ │ │ ├── Dto/ │ │ │ │ ├── ResolveLabelInput.cs │ │ │ │ └── ResolveLabelOutput.cs │ │ │ ├── HomeController.cs │ │ │ ├── ProblemController.cs │ │ │ └── SubmissionsController.cs │ │ ├── Crawlers/ │ │ │ ├── BnuMappingCrawler.cs │ │ │ ├── CrawlerBase.cs │ │ │ ├── CrawlerMessage.cs │ │ │ ├── IMappingCrawler.cs │ │ │ ├── ISubmissionCrawler.cs │ │ │ ├── NitMappingCrawler.cs │ │ │ ├── UvaCrawlers.cs │ │ │ └── ZojSubmissionCrawler.cs │ │ ├── Database/ │ │ │ ├── IDbBuilder.cs │ │ │ ├── OHuntDbBuilder.cs │ │ │ └── OHuntDbContext.cs │ │ ├── Dataflow/ │ │ │ ├── CrawlerPropagator.cs │ │ │ ├── DatabaseInserter.cs │ │ │ ├── DatabaseInserterFactory.cs │ │ │ ├── DatabaseInserterMessage.cs │ │ │ └── SubmissionCrawlerCoordinator.cs │ │ ├── Dockerfile │ │ ├── GlobalConfigurer.cs │ │ ├── Migrations/ │ │ │ ├── 20200701054200_Init.Designer.cs │ │ │ ├── 20200701054200_Init.cs │ │ │ ├── 20200701112402_AddSubmission.Designer.cs │ │ │ ├── 20200701112402_AddSubmission.cs │ │ │ ├── 20200702060356_AddIndex.Designer.cs │ │ │ ├── 20200702060356_AddIndex.cs │ │ │ ├── 20200702142254_AddCrawlerError.Designer.cs │ │ │ ├── 20200702142254_AddCrawlerError.cs │ │ │ ├── 20200802072749_AddProblemLabelMapping.Designer.cs │ │ │ ├── 20200802072749_AddProblemLabelMapping.cs │ │ │ ├── 20210627092639_UpgradeDriver.Designer.cs │ │ │ ├── 20210627092639_UpgradeDriver.cs │ │ │ └── OHuntWebContextModelSnapshot.cs │ │ ├── Models/ │ │ │ ├── CrawlerError.cs │ │ │ ├── MappingOnlineJudge.cs │ │ │ ├── OnlineJudge.cs │ │ │ ├── ProblemLabelMapping.cs │ │ │ ├── RunResult.cs │ │ │ └── Submission.cs │ │ ├── OHunt.Web.csproj │ │ ├── Options/ │ │ │ └── DatabaseInserterOptions.cs │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── launchSettings.json │ │ ├── Services/ │ │ │ ├── ProblemLabelManager.cs │ │ │ └── ScheduleCrawlerService.cs │ │ ├── Startup.cs │ │ ├── Utils/ │ │ │ ├── Extensions.cs │ │ │ └── QueryParameterFilter.cs │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ ├── README.md │ ├── dev.Dockerfile │ ├── global.json │ └── ohunt.sln ├── sonar-project.properties └── tools/ ├── acm-statistics.service ├── history-test.sql └── remote-docker-up.sh