Repository: NikolayIT/OpenJudgeSystem Branch: master Commit: e64527074150 Files: 1360 Total size: 14.6 MB Directory structure: gitextract_pv7nkudb/ ├── .github/ │ └── FUNDING.yml ├── .gitignore ├── Documentation/ │ ├── Development/ │ │ └── How to add new administration.txt │ ├── HISTORY.txt │ ├── Installation/ │ │ ├── sample-solution-cpp11.cpp │ │ ├── sample-solution.cpp │ │ ├── sample-solution.cs │ │ └── sample-solution.js │ └── Requirements/ │ ├── Gacutil/ │ │ └── gacutil.exe.config │ ├── PowerCollections/ │ │ ├── Binaries/ │ │ │ ├── License.txt │ │ │ └── PowerCollections.XML │ │ └── Binaries_Signed_4.5/ │ │ ├── PowerCollections.XML │ │ └── PowerCollections.dll.config │ └── Requirements for agent enviroments.txt ├── LICENSE ├── Open Judge System/ │ ├── Data/ │ │ ├── OJS.Data/ │ │ │ ├── App.config │ │ │ ├── Configurations/ │ │ │ │ ├── ParticipantAnswersConfiguration.cs │ │ │ │ ├── TestRunConfiguration.cs │ │ │ │ └── UserProfileConfiguration.cs │ │ │ ├── IOjsData.cs │ │ │ ├── IOjsDbContext.cs │ │ │ ├── Migrations/ │ │ │ │ └── DefaultMigrationConfiguration.cs │ │ │ ├── OJS.Data.csproj │ │ │ ├── OjsData.cs │ │ │ ├── OjsDbContext.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Providers/ │ │ │ │ ├── GlimpseConnectionEfSqlBulkInsertProvider.cs │ │ │ │ └── Registries/ │ │ │ │ └── EfBulkInsertGlimpseProviderRegistry.cs │ │ │ ├── Repositories/ │ │ │ │ ├── Base/ │ │ │ │ │ ├── DeletableEntityRepository.cs │ │ │ │ │ └── GenericRepository.cs │ │ │ │ ├── ContestsRepository.cs │ │ │ │ ├── Contracts/ │ │ │ │ │ ├── IContestsRepository.cs │ │ │ │ │ ├── IParticipantsRepository.cs │ │ │ │ │ ├── ISubmissionsRepository.cs │ │ │ │ │ ├── ITestRepository.cs │ │ │ │ │ ├── ITestRunsRepository.cs │ │ │ │ │ └── IUsersRepository.cs │ │ │ │ ├── ParticipantsRepository.cs │ │ │ │ ├── SubmissionsRepository.cs │ │ │ │ ├── TestRepository.cs │ │ │ │ ├── TestRunsRepository.cs │ │ │ │ └── UsersRepository.cs │ │ │ └── packages.config │ │ ├── OJS.Data.Contracts/ │ │ │ ├── App.config │ │ │ ├── AuditInfo.cs │ │ │ ├── CodeFirstConventions/ │ │ │ │ └── IsUnicodeAttributeConvention.cs │ │ │ ├── DataAnnotations/ │ │ │ │ └── IsUnicodeAttribute.cs │ │ │ ├── DeletableEntity.cs │ │ │ ├── IAuditInfo.cs │ │ │ ├── IDeletableEntity.cs │ │ │ ├── IDeletableEntityRepository.cs │ │ │ ├── IOrderable.cs │ │ │ ├── IRepository.cs │ │ │ ├── OJS.Data.Contracts.csproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── packages.config │ │ └── OJS.Data.Models/ │ │ ├── AccessLog.cs │ │ ├── App.config │ │ ├── Checker.cs │ │ ├── Contest.cs │ │ ├── ContestCategory.cs │ │ ├── ContestQuestion.cs │ │ ├── ContestQuestionAnswer.cs │ │ ├── Event.cs │ │ ├── FeedbackReport.cs │ │ ├── News.cs │ │ ├── OJS.Data.Models.csproj │ │ ├── Participant.cs │ │ ├── ParticipantAnswer.cs │ │ ├── Problem.cs │ │ ├── ProblemResource.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Setting.cs │ │ ├── SourceCode.cs │ │ ├── Submission.cs │ │ ├── SubmissionType.cs │ │ ├── Tag.cs │ │ ├── Test.cs │ │ ├── TestRun.cs │ │ ├── UserProfile.cs │ │ ├── UserSettings.cs │ │ └── packages.config │ ├── External Libraries/ │ │ ├── Kendo.Mvc.README │ │ └── Kendo.Mvc.xml │ ├── OJS.Common/ │ │ ├── Attributes/ │ │ │ ├── LocalizedDescriptionAttribute.cs │ │ │ └── LocalizedDisplayFormatAttribute.cs │ │ ├── Calculator.cs │ │ ├── DataAnnotations/ │ │ │ ├── DatabasePropertyAttribute.cs │ │ │ └── ExcludeFromExcelAttribute.cs │ │ ├── ExpressionBuilder.cs │ │ ├── Extensions/ │ │ │ ├── CompilerTypeExtensions.cs │ │ │ ├── CompressStringExtensions.cs │ │ │ ├── DirectoryHelpers.cs │ │ │ ├── EnumExtensions.cs │ │ │ ├── ExecutionStrategyTypeExtensions.cs │ │ │ ├── FileHelpers.cs │ │ │ ├── IEnumerableExtensions.cs │ │ │ ├── ObjectExtensions.cs │ │ │ ├── PlagiarismDetectorTypeExtensions.cs │ │ │ ├── StreamExtensions.cs │ │ │ └── StringExtensions.cs │ │ ├── GlobalConstants.cs │ │ ├── MailSender.cs │ │ ├── Models/ │ │ │ ├── CompilerType.cs │ │ │ ├── ContestQuestionType.cs │ │ │ ├── ExecutionStrategyType.cs │ │ │ ├── PlagiarismDetectorType.cs │ │ │ ├── ProblemResourceType.cs │ │ │ └── TestRunResultType.cs │ │ ├── OJS.Common.csproj │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Resources/ │ │ │ └── Enums/ │ │ │ ├── EnumTranslations.Designer.cs │ │ │ ├── EnumTranslations.bg.Designer.cs │ │ │ ├── EnumTranslations.bg.resx │ │ │ └── EnumTranslations.resx │ │ ├── SynchronizedHashtable.cs │ │ └── packages.config │ ├── Open Judge System.sln │ ├── Rules.ruleset │ ├── Settings.StyleCop │ ├── Tests/ │ │ ├── OJS.Common.Tests/ │ │ │ ├── OJS.Common.Tests.csproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── StringExtensions/ │ │ │ │ ├── CompressDecompressTests.cs │ │ │ │ ├── GetFileExtensionTests.cs │ │ │ │ ├── GetFirstDifferenceIndexWithTests.cs │ │ │ │ ├── GetStringBetweenTests.cs │ │ │ │ ├── GetStringWithEllipsisBetweenTests.cs │ │ │ │ ├── MaxLengthTests.cs │ │ │ │ ├── PascalCaseToTextTests.cs │ │ │ │ ├── StringToUrlTests.cs │ │ │ │ ├── ToInteger.cs │ │ │ │ └── ToIntegerTests.cs │ │ │ └── packages.config │ │ ├── OJS.Tests.Common/ │ │ │ ├── App.config │ │ │ ├── DataFakes/ │ │ │ │ ├── DatabaseConfiguration.cs │ │ │ │ ├── FakeEmptyOjsDbContext.cs │ │ │ │ ├── FakeOjsDbContext.cs │ │ │ │ └── ObjectExtensions.cs │ │ │ ├── OJS.Tests.Common.csproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── TestClassBase.cs │ │ │ ├── WebStubs/ │ │ │ │ ├── StubHttpContextForRouting.cs │ │ │ │ ├── StubHttpRequestForRouting.cs │ │ │ │ └── StubHttpResponseForRouting.cs │ │ │ └── packages.config │ │ ├── OJS.Workers.Checkers.Tests/ │ │ │ ├── CSharpCodeCheckerTests.cs │ │ │ ├── CaseInsensitiveCheckerTests.cs │ │ │ ├── ExactCheckerTests.cs │ │ │ ├── OJS.Workers.Checkers.Tests.csproj │ │ │ ├── PrecisionCheckerTests.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── SortCheckerTests.cs │ │ │ ├── TrimCheckerTests.cs │ │ │ └── packages.config │ │ ├── OJS.Workers.Compilers.Tests/ │ │ │ ├── CSharpCompilerTests.cs │ │ │ ├── MsBuildCompilerTests.cs │ │ │ ├── OJS.Workers.Compilers.Tests.csproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── packages.config │ │ ├── OJS.Workers.ExecutionStrategies.Tests/ │ │ │ ├── JsonExecutionResultTests.cs │ │ │ ├── OJS.Workers.ExecutionStrategies.Tests.csproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── packages.config │ │ ├── OJS.Workers.Executors.Tests/ │ │ │ ├── BaseExecutorsTestClass.cs │ │ │ ├── OJS.Workers.Executors.Tests.csproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── RestrictedProcessSecurityTests.cs │ │ │ ├── RestrictedProcessTests.cs │ │ │ └── packages.config │ │ └── OJS.Workers.Tools.Tests/ │ │ ├── AntiCheat/ │ │ │ └── SortAndTrimLinesVisitorTests.cs │ │ ├── OJS.Workers.Tools.Tests.csproj │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Similarity/ │ │ │ └── SimilarityFinderDiffTextTests.cs │ │ └── packages.config │ ├── Tools/ │ │ ├── SandboxExecutorProofOfConcept/ │ │ │ ├── App.config │ │ │ ├── GlobalConstants.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── SandboxExecutorProofOfConcept.csproj │ │ │ ├── SandboxExecutorProofOfConceptProgram.cs │ │ │ └── packages.config │ │ ├── SandboxTarget/ │ │ │ ├── App.config │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── SandboxTarget.csproj │ │ │ ├── SandboxTargetProgram.cs │ │ │ ├── TryToExecuteParams.cs │ │ │ └── packages.config │ │ └── SqlTestingPoC/ │ │ ├── App.config │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── SqlPrepareDatabaseAndRunUserQueryExecutionStrategy.cs │ │ ├── SqlRunUserQueryAndCheckDatabaseExecutionStrategy.cs │ │ ├── SqlTestingPoC.csproj │ │ └── packages.config │ ├── Web/ │ │ ├── OJS.Web/ │ │ │ ├── App_Code/ │ │ │ │ └── ContestsHelper.cshtml │ │ │ ├── App_GlobalResources/ │ │ │ │ ├── Account/ │ │ │ │ │ ├── AccountEmails.Designer.cs │ │ │ │ │ ├── AccountEmails.bg.Designer.cs │ │ │ │ │ ├── AccountEmails.bg.resx │ │ │ │ │ ├── AccountEmails.resx │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ ├── AccountViewModels.Designer.cs │ │ │ │ │ │ ├── AccountViewModels.bg.Designer.cs │ │ │ │ │ │ ├── AccountViewModels.bg.resx │ │ │ │ │ │ └── AccountViewModels.resx │ │ │ │ │ └── Views/ │ │ │ │ │ ├── ChangeEmailView.Designer.cs │ │ │ │ │ ├── ChangeEmailView.bg.designer.cs │ │ │ │ │ ├── ChangeEmailView.bg.resx │ │ │ │ │ ├── ChangeEmailView.resx │ │ │ │ │ ├── ChangePasswordView.Designer.cs │ │ │ │ │ ├── ChangePasswordView.bg.designer.cs │ │ │ │ │ ├── ChangePasswordView.bg.resx │ │ │ │ │ ├── ChangePasswordView.resx │ │ │ │ │ ├── ChangeUsernameView.bg.designer.cs │ │ │ │ │ ├── ChangeUsernameView.bg.resx │ │ │ │ │ ├── ChangeUsernameView.designer.cs │ │ │ │ │ ├── ChangeUsernameView.resx │ │ │ │ │ ├── Disassociate.Designer.cs │ │ │ │ │ ├── Disassociate.bg.designer.cs │ │ │ │ │ ├── Disassociate.bg.resx │ │ │ │ │ ├── Disassociate.resx │ │ │ │ │ ├── ExternalLoginCallback.bg.designer.cs │ │ │ │ │ ├── ExternalLoginCallback.bg.resx │ │ │ │ │ ├── ExternalLoginCallback.designer.cs │ │ │ │ │ ├── ExternalLoginCallback.resx │ │ │ │ │ ├── ExternalLoginConfirmation.Designer.cs │ │ │ │ │ ├── ExternalLoginConfirmation.bg.designer.cs │ │ │ │ │ ├── ExternalLoginConfirmation.bg.resx │ │ │ │ │ ├── ExternalLoginConfirmation.resx │ │ │ │ │ ├── ExternalLoginFailure.Designer.cs │ │ │ │ │ ├── ExternalLoginFailure.bg.designer.cs │ │ │ │ │ ├── ExternalLoginFailure.bg.resx │ │ │ │ │ ├── ExternalLoginFailure.resx │ │ │ │ │ ├── ForgottenPassword.Designer.cs │ │ │ │ │ ├── ForgottenPassword.bg.designer.cs │ │ │ │ │ ├── ForgottenPassword.bg.resx │ │ │ │ │ ├── ForgottenPassword.resx │ │ │ │ │ ├── General.Designer.cs │ │ │ │ │ ├── General.bg.designer.cs │ │ │ │ │ ├── General.bg.resx │ │ │ │ │ ├── General.resx │ │ │ │ │ ├── Login.Designer.cs │ │ │ │ │ ├── Login.bg.designer.cs │ │ │ │ │ ├── Login.bg.resx │ │ │ │ │ ├── Login.resx │ │ │ │ │ ├── Manage.Designer.cs │ │ │ │ │ ├── Manage.bg.designer.cs │ │ │ │ │ ├── Manage.bg.resx │ │ │ │ │ ├── Manage.resx │ │ │ │ │ ├── Partial/ │ │ │ │ │ │ ├── ChangePassword.Designer.cs │ │ │ │ │ │ ├── ChangePassword.bg.designer.cs │ │ │ │ │ │ ├── ChangePassword.bg.resx │ │ │ │ │ │ ├── ChangePassword.resx │ │ │ │ │ │ ├── ExternalLoginsList.Designer.cs │ │ │ │ │ │ ├── ExternalLoginsList.bg.designer.cs │ │ │ │ │ │ ├── ExternalLoginsList.bg.resx │ │ │ │ │ │ ├── ExternalLoginsList.resx │ │ │ │ │ │ ├── RemoveAccount.Designer.cs │ │ │ │ │ │ ├── RemoveAccount.bg.designer.cs │ │ │ │ │ │ ├── RemoveAccount.bg.resx │ │ │ │ │ │ ├── RemoveAccount.resx │ │ │ │ │ │ ├── SetPassword.Designer.cs │ │ │ │ │ │ ├── SetPassword.bg.designer.cs │ │ │ │ │ │ ├── SetPassword.bg.resx │ │ │ │ │ │ └── SetPassword.resx │ │ │ │ │ ├── Register.Designer.cs │ │ │ │ │ ├── Register.bg.designer.cs │ │ │ │ │ ├── Register.bg.resx │ │ │ │ │ └── Register.resx │ │ │ │ ├── Areas/ │ │ │ │ │ ├── Administration/ │ │ │ │ │ │ ├── AccessLogs/ │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── AccessLogGridViewModel.Designer.cs │ │ │ │ │ │ │ │ ├── AccessLogGridViewModel.bg.designer.cs │ │ │ │ │ │ │ │ ├── AccessLogGridViewModel.bg.resx │ │ │ │ │ │ │ │ └── AccessLogGridViewModel.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── AccessLogsIndex.Designer.cs │ │ │ │ │ │ │ ├── AccessLogsIndex.bg.Designer.cs │ │ │ │ │ │ │ ├── AccessLogsIndex.bg.resx │ │ │ │ │ │ │ └── AccessLogsIndex.resx │ │ │ │ │ │ ├── AdministrationGeneral.Designer.cs │ │ │ │ │ │ ├── AdministrationGeneral.bg.designer.cs │ │ │ │ │ │ ├── AdministrationGeneral.bg.resx │ │ │ │ │ │ ├── AdministrationGeneral.resx │ │ │ │ │ │ ├── AntiCheat/ │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── AntiCheatViews.Designer.cs │ │ │ │ │ │ │ ├── AntiCheatViews.bg.designer.cs │ │ │ │ │ │ │ ├── AntiCheatViews.bg.resx │ │ │ │ │ │ │ └── AntiCheatViews.resx │ │ │ │ │ │ ├── Checkers/ │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── CheckerAdministrationViewModel.Designer.cs │ │ │ │ │ │ │ │ ├── CheckerAdministrationViewModel.bg.designer.cs │ │ │ │ │ │ │ │ ├── CheckerAdministrationViewModel.bg.resx │ │ │ │ │ │ │ │ └── CheckerAdministrationViewModel.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── CheckersIndex.Designer.cs │ │ │ │ │ │ │ ├── CheckersIndex.bg.designer.cs │ │ │ │ │ │ │ ├── CheckersIndex.bg.resx │ │ │ │ │ │ │ └── CheckersIndex.resx │ │ │ │ │ │ ├── ContestCategories/ │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── ContestCategoryAdministrationViewModel.Designer.cs │ │ │ │ │ │ │ │ ├── ContestCategoryAdministrationViewModel.bg.designer.cs │ │ │ │ │ │ │ │ ├── ContestCategoryAdministrationViewModel.bg.resx │ │ │ │ │ │ │ │ └── ContestCategoryAdministrationViewModel.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── ContestCategoriesViews.Designer.cs │ │ │ │ │ │ │ ├── ContestCategoriesViews.bg.designer.cs │ │ │ │ │ │ │ ├── ContestCategoriesViews.bg.resx │ │ │ │ │ │ │ └── ContestCategoriesViews.resx │ │ │ │ │ │ ├── Contests/ │ │ │ │ │ │ │ ├── ContestsControllers.Designer.cs │ │ │ │ │ │ │ ├── ContestsControllers.bg.designer.cs │ │ │ │ │ │ │ ├── ContestsControllers.bg.resx │ │ │ │ │ │ │ ├── ContestsControllers.resx │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── ContestAdministration.Designer.cs │ │ │ │ │ │ │ │ ├── ContestAdministration.bg.Designer.cs │ │ │ │ │ │ │ │ ├── ContestAdministration.bg.resx │ │ │ │ │ │ │ │ ├── ContestAdministration.resx │ │ │ │ │ │ │ │ ├── ContestQuestion.Designer.cs │ │ │ │ │ │ │ │ ├── ContestQuestion.bg.designer.cs │ │ │ │ │ │ │ │ ├── ContestQuestion.bg.resx │ │ │ │ │ │ │ │ ├── ContestQuestion.resx │ │ │ │ │ │ │ │ ├── ContestQuestionAnswer.Designer.cs │ │ │ │ │ │ │ │ ├── ContestQuestionAnswer.bg.designer.cs │ │ │ │ │ │ │ │ ├── ContestQuestionAnswer.bg.resx │ │ │ │ │ │ │ │ ├── ContestQuestionAnswer.resx │ │ │ │ │ │ │ │ ├── ShortContestAdministration.Designer.cs │ │ │ │ │ │ │ │ ├── ShortContestAdministration.bg.Designer.cs │ │ │ │ │ │ │ │ ├── ShortContestAdministration.bg.resx │ │ │ │ │ │ │ │ └── ShortContestAdministration.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── ContestCreate.bg.designer.cs │ │ │ │ │ │ │ ├── ContestCreate.bg.resx │ │ │ │ │ │ │ ├── ContestCreate.designer.cs │ │ │ │ │ │ │ ├── ContestCreate.resx │ │ │ │ │ │ │ ├── ContestEdit.Designer.cs │ │ │ │ │ │ │ ├── ContestEdit.bg.designer.cs │ │ │ │ │ │ │ ├── ContestEdit.bg.resx │ │ │ │ │ │ │ ├── ContestEdit.resx │ │ │ │ │ │ │ ├── ContestIndex.Designer.cs │ │ │ │ │ │ │ ├── ContestIndex.bg.designer.cs │ │ │ │ │ │ │ ├── ContestIndex.bg.resx │ │ │ │ │ │ │ ├── ContestIndex.resx │ │ │ │ │ │ │ ├── EditorTemplates/ │ │ │ │ │ │ │ │ ├── CategoryDropDown.Designer.cs │ │ │ │ │ │ │ │ ├── CategoryDropDown.bg.designer.cs │ │ │ │ │ │ │ │ ├── CategoryDropDown.bg.resx │ │ │ │ │ │ │ │ ├── CategoryDropDown.resx │ │ │ │ │ │ │ │ ├── SubmissionTypeCheckBoxes.Designer.cs │ │ │ │ │ │ │ │ ├── SubmissionTypeCheckBoxes.bg.designer.cs │ │ │ │ │ │ │ │ ├── SubmissionTypeCheckBoxes.bg.resx │ │ │ │ │ │ │ │ └── SubmissionTypeCheckBoxes.resx │ │ │ │ │ │ │ └── Partials/ │ │ │ │ │ │ │ ├── ContestEditor.Designer.cs │ │ │ │ │ │ │ ├── ContestEditor.bg.designer.cs │ │ │ │ │ │ │ ├── ContestEditor.bg.resx │ │ │ │ │ │ │ └── ContestEditor.resx │ │ │ │ │ │ ├── Feedback/ │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── FeedbackReport.Designer.cs │ │ │ │ │ │ │ │ ├── FeedbackReport.bg.designer.cs │ │ │ │ │ │ │ │ ├── FeedbackReport.bg.resx │ │ │ │ │ │ │ │ └── FeedbackReport.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── FeedbackIndexAdmin.Designer.cs │ │ │ │ │ │ │ ├── FeedbackIndexAdmin.bg.Designer.cs │ │ │ │ │ │ │ ├── FeedbackIndexAdmin.bg.resx │ │ │ │ │ │ │ └── FeedbackIndexAdmin.resx │ │ │ │ │ │ ├── News/ │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── NewsAdministration.Designer.cs │ │ │ │ │ │ │ │ ├── NewsAdministration.bg.designer.cs │ │ │ │ │ │ │ │ ├── NewsAdministration.bg.resx │ │ │ │ │ │ │ │ └── NewsAdministration.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── NewsIndex.Designer.cs │ │ │ │ │ │ │ ├── NewsIndex.bg.designer.cs │ │ │ │ │ │ │ ├── NewsIndex.bg.resx │ │ │ │ │ │ │ └── NewsIndex.resx │ │ │ │ │ │ ├── Participants/ │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── ParticipantViewModels.Designer.cs │ │ │ │ │ │ │ │ ├── ParticipantViewModels.bg.designer.cs │ │ │ │ │ │ │ │ ├── ParticipantViewModels.bg.resx │ │ │ │ │ │ │ │ └── ParticipantViewModels.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── EditorTemplates/ │ │ │ │ │ │ │ │ ├── ParticipantEditorTemplates.Designer.cs │ │ │ │ │ │ │ │ ├── ParticipantEditorTemplates.bg.designer.cs │ │ │ │ │ │ │ │ ├── ParticipantEditorTemplates.bg.resx │ │ │ │ │ │ │ │ └── ParticipantEditorTemplates.resx │ │ │ │ │ │ │ ├── Partials/ │ │ │ │ │ │ │ │ ├── Participants.Designer.cs │ │ │ │ │ │ │ │ ├── Participants.bg.designer.cs │ │ │ │ │ │ │ │ ├── Participants.bg.resx │ │ │ │ │ │ │ │ └── Participants.resx │ │ │ │ │ │ │ ├── ParticipantsContest.bg.designer.cs │ │ │ │ │ │ │ ├── ParticipantsContest.bg.resx │ │ │ │ │ │ │ ├── ParticipantsContest.designer.cs │ │ │ │ │ │ │ ├── ParticipantsContest.resx │ │ │ │ │ │ │ ├── ParticipantsIndex.Designer.cs │ │ │ │ │ │ │ ├── ParticipantsIndex.bg.designer.cs │ │ │ │ │ │ │ ├── ParticipantsIndex.bg.resx │ │ │ │ │ │ │ └── ParticipantsIndex.resx │ │ │ │ │ │ ├── Problems/ │ │ │ │ │ │ │ ├── ProblemsControllers.Designer.cs │ │ │ │ │ │ │ ├── ProblemsControllers.bg.designer.cs │ │ │ │ │ │ │ ├── ProblemsControllers.bg.resx │ │ │ │ │ │ │ ├── ProblemsControllers.resx │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── DetailedProblem.Designer.cs │ │ │ │ │ │ │ │ ├── DetailedProblem.bg.designer.cs │ │ │ │ │ │ │ │ ├── DetailedProblem.bg.resx │ │ │ │ │ │ │ │ ├── DetailedProblem.resx │ │ │ │ │ │ │ │ ├── ProblemResources.bg.designer.cs │ │ │ │ │ │ │ │ ├── ProblemResources.bg.resx │ │ │ │ │ │ │ │ ├── ProblemResources.designer.cs │ │ │ │ │ │ │ │ └── ProblemResources.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── Partials/ │ │ │ │ │ │ │ │ ├── ProblemsPartials.Designer.cs │ │ │ │ │ │ │ │ ├── ProblemsPartials.bg.designer.cs │ │ │ │ │ │ │ │ ├── ProblemsPartials.bg.resx │ │ │ │ │ │ │ │ └── ProblemsPartials.resx │ │ │ │ │ │ │ ├── ProblemsCreate.Designer.cs │ │ │ │ │ │ │ ├── ProblemsCreate.bg.designer.cs │ │ │ │ │ │ │ ├── ProblemsCreate.bg.resx │ │ │ │ │ │ │ ├── ProblemsCreate.resx │ │ │ │ │ │ │ ├── ProblemsDelete.Designer.cs │ │ │ │ │ │ │ ├── ProblemsDelete.bg.designer.cs │ │ │ │ │ │ │ ├── ProblemsDelete.bg.resx │ │ │ │ │ │ │ ├── ProblemsDelete.resx │ │ │ │ │ │ │ ├── ProblemsDeleteAll.Designer.cs │ │ │ │ │ │ │ ├── ProblemsDeleteAll.bg.designer.cs │ │ │ │ │ │ │ ├── ProblemsDeleteAll.bg.resx │ │ │ │ │ │ │ ├── ProblemsDeleteAll.resx │ │ │ │ │ │ │ ├── ProblemsDetails.Designer.cs │ │ │ │ │ │ │ ├── ProblemsDetails.bg.designer.cs │ │ │ │ │ │ │ ├── ProblemsDetails.bg.resx │ │ │ │ │ │ │ ├── ProblemsDetails.resx │ │ │ │ │ │ │ ├── ProblemsEdit.Designer.cs │ │ │ │ │ │ │ ├── ProblemsEdit.bg.designer.cs │ │ │ │ │ │ │ ├── ProblemsEdit.bg.resx │ │ │ │ │ │ │ ├── ProblemsEdit.resx │ │ │ │ │ │ │ ├── ProblemsIndex.Designer.cs │ │ │ │ │ │ │ ├── ProblemsIndex.bg.designer.cs │ │ │ │ │ │ │ ├── ProblemsIndex.bg.resx │ │ │ │ │ │ │ └── ProblemsIndex.resx │ │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ │ ├── ResourcesControllers.Designer.cs │ │ │ │ │ │ │ ├── ResourcesControllers.bg.designer.cs │ │ │ │ │ │ │ ├── ResourcesControllers.bg.resx │ │ │ │ │ │ │ ├── ResourcesControllers.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── ResourcesCreate.Designer.cs │ │ │ │ │ │ │ ├── ResourcesCreate.bg.designer.cs │ │ │ │ │ │ │ ├── ResourcesCreate.bg.resx │ │ │ │ │ │ │ ├── ResourcesCreate.resx │ │ │ │ │ │ │ ├── ResourcesEdit.Designer.cs │ │ │ │ │ │ │ ├── ResourcesEdit.bg.designer.cs │ │ │ │ │ │ │ ├── ResourcesEdit.bg.resx │ │ │ │ │ │ │ └── ResourcesEdit.resx │ │ │ │ │ │ ├── Roles/ │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── RolesViewModels.Designer.cs │ │ │ │ │ │ │ │ ├── RolesViewModels.bg.designer.cs │ │ │ │ │ │ │ │ ├── RolesViewModels.bg.resx │ │ │ │ │ │ │ │ └── RolesViewModels.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── RolesIndex.Designer.cs │ │ │ │ │ │ │ ├── RolesIndex.bg.designer.cs │ │ │ │ │ │ │ ├── RolesIndex.bg.resx │ │ │ │ │ │ │ └── RolesIndex.resx │ │ │ │ │ │ ├── Settings/ │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── SettingAdministration.Designer.cs │ │ │ │ │ │ │ │ ├── SettingAdministration.bg.designer.cs │ │ │ │ │ │ │ │ ├── SettingAdministration.bg.resx │ │ │ │ │ │ │ │ └── SettingAdministration.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── SettingsAdministrationIndex.Designer.cs │ │ │ │ │ │ │ ├── SettingsAdministrationIndex.bg.Designer.cs │ │ │ │ │ │ │ ├── SettingsAdministrationIndex.bg.resx │ │ │ │ │ │ │ └── SettingsAdministrationIndex.resx │ │ │ │ │ │ ├── Shared/ │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ └── Partials/ │ │ │ │ │ │ │ ├── Partials.Designer.cs │ │ │ │ │ │ │ ├── Partials.bg.designer.cs │ │ │ │ │ │ │ ├── Partials.bg.resx │ │ │ │ │ │ │ └── Partials.resx │ │ │ │ │ │ ├── SubmissionTypes/ │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── SubmissionTypeAdministration.Designer.cs │ │ │ │ │ │ │ │ ├── SubmissionTypeAdministration.bg.designer.cs │ │ │ │ │ │ │ │ ├── SubmissionTypeAdministration.bg.resx │ │ │ │ │ │ │ │ └── SubmissionTypeAdministration.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── SubmissionTypesIndex.Designer.cs │ │ │ │ │ │ │ ├── SubmissionTypesIndex.bg.designer.cs │ │ │ │ │ │ │ ├── SubmissionTypesIndex.bg.resx │ │ │ │ │ │ │ └── SubmissionTypesIndex.resx │ │ │ │ │ │ ├── Submissions/ │ │ │ │ │ │ │ ├── SubmissionsControllers.Designer.cs │ │ │ │ │ │ │ ├── SubmissionsControllers.bg.designer.cs │ │ │ │ │ │ │ ├── SubmissionsControllers.bg.resx │ │ │ │ │ │ │ ├── SubmissionsControllers.resx │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── SubmissionAdministration.Designer.cs │ │ │ │ │ │ │ │ ├── SubmissionAdministration.bg.designer.cs │ │ │ │ │ │ │ │ ├── SubmissionAdministration.bg.resx │ │ │ │ │ │ │ │ └── SubmissionAdministration.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── EditorTemplates/ │ │ │ │ │ │ │ │ ├── SubmissionsEditorTemplates.Designer.cs │ │ │ │ │ │ │ │ ├── SubmissionsEditorTemplates.bg.Designer.cs │ │ │ │ │ │ │ │ ├── SubmissionsEditorTemplates.bg.resx │ │ │ │ │ │ │ │ └── SubmissionsEditorTemplates.resx │ │ │ │ │ │ │ ├── Partials/ │ │ │ │ │ │ │ │ ├── SubmissionForm.Designer.cs │ │ │ │ │ │ │ │ ├── SubmissionForm.bg.designer.cs │ │ │ │ │ │ │ │ ├── SubmissionForm.bg.resx │ │ │ │ │ │ │ │ ├── SubmissionForm.resx │ │ │ │ │ │ │ │ ├── SubmissionsGrid.Designer.cs │ │ │ │ │ │ │ │ ├── SubmissionsGrid.bg.designer.cs │ │ │ │ │ │ │ │ ├── SubmissionsGrid.bg.resx │ │ │ │ │ │ │ │ └── SubmissionsGrid.resx │ │ │ │ │ │ │ ├── SubmissionsCreate.Designer.cs │ │ │ │ │ │ │ ├── SubmissionsCreate.bg.designer.cs │ │ │ │ │ │ │ ├── SubmissionsCreate.bg.resx │ │ │ │ │ │ │ ├── SubmissionsCreate.resx │ │ │ │ │ │ │ ├── SubmissionsDelete.Designer.cs │ │ │ │ │ │ │ ├── SubmissionsDelete.bg.designer.cs │ │ │ │ │ │ │ ├── SubmissionsDelete.bg.resx │ │ │ │ │ │ │ ├── SubmissionsDelete.resx │ │ │ │ │ │ │ ├── SubmissionsIndex.Designer.cs │ │ │ │ │ │ │ ├── SubmissionsIndex.bg.designer.cs │ │ │ │ │ │ │ ├── SubmissionsIndex.bg.resx │ │ │ │ │ │ │ ├── SubmissionsIndex.resx │ │ │ │ │ │ │ ├── SubmissionsUpdate.Designer.cs │ │ │ │ │ │ │ ├── SubmissionsUpdate.bg.designer.cs │ │ │ │ │ │ │ ├── SubmissionsUpdate.bg.resx │ │ │ │ │ │ │ └── SubmissionsUpdate.resx │ │ │ │ │ │ ├── Tests/ │ │ │ │ │ │ │ ├── TestsControllers.bg.designer.cs │ │ │ │ │ │ │ ├── TestsControllers.bg.resx │ │ │ │ │ │ │ ├── TestsControllers.designer.cs │ │ │ │ │ │ │ ├── TestsControllers.resx │ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ │ ├── TestAdministration.Designer.cs │ │ │ │ │ │ │ │ ├── TestAdministration.bg.designer.cs │ │ │ │ │ │ │ │ ├── TestAdministration.bg.resx │ │ │ │ │ │ │ │ └── TestAdministration.resx │ │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ │ ├── TestsCreate.Designer.cs │ │ │ │ │ │ │ ├── TestsCreate.bg.designer.cs │ │ │ │ │ │ │ ├── TestsCreate.bg.resx │ │ │ │ │ │ │ ├── TestsCreate.resx │ │ │ │ │ │ │ ├── TestsDelete.Designer.cs │ │ │ │ │ │ │ ├── TestsDelete.bg.designer.cs │ │ │ │ │ │ │ ├── TestsDelete.bg.resx │ │ │ │ │ │ │ ├── TestsDelete.resx │ │ │ │ │ │ │ ├── TestsDeleteAll.Designer.cs │ │ │ │ │ │ │ ├── TestsDeleteAll.bg.designer.cs │ │ │ │ │ │ │ ├── TestsDeleteAll.bg.resx │ │ │ │ │ │ │ ├── TestsDeleteAll.resx │ │ │ │ │ │ │ ├── TestsDetails.bg.designer.cs │ │ │ │ │ │ │ ├── TestsDetails.bg.resx │ │ │ │ │ │ │ ├── TestsDetails.designer.cs │ │ │ │ │ │ │ ├── TestsDetails.resx │ │ │ │ │ │ │ ├── TestsEdit.Designer.cs │ │ │ │ │ │ │ ├── TestsEdit.bg.designer.cs │ │ │ │ │ │ │ ├── TestsEdit.bg.resx │ │ │ │ │ │ │ ├── TestsEdit.resx │ │ │ │ │ │ │ ├── TestsIndex.Designer.cs │ │ │ │ │ │ │ ├── TestsIndex.bg.designer.cs │ │ │ │ │ │ │ ├── TestsIndex.bg.resx │ │ │ │ │ │ │ └── TestsIndex.resx │ │ │ │ │ │ └── Users/ │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ ├── UserProfileAdministration.Designer.cs │ │ │ │ │ │ │ ├── UserProfileAdministration.bg.designer.cs │ │ │ │ │ │ │ ├── UserProfileAdministration.bg.resx │ │ │ │ │ │ │ └── UserProfileAdministration.resx │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ ├── UsersIndex.Designer.cs │ │ │ │ │ │ ├── UsersIndex.bg.designer.cs │ │ │ │ │ │ ├── UsersIndex.bg.resx │ │ │ │ │ │ └── UsersIndex.resx │ │ │ │ │ ├── Contests/ │ │ │ │ │ │ ├── ContestsGeneral.Designer.cs │ │ │ │ │ │ ├── ContestsGeneral.bg.Designer.cs │ │ │ │ │ │ ├── ContestsGeneral.bg.resx │ │ │ │ │ │ ├── ContestsGeneral.resx │ │ │ │ │ │ ├── Shared/ │ │ │ │ │ │ │ ├── ContestsAllContestSubmissionsByUser.Designer.cs │ │ │ │ │ │ │ ├── ContestsAllContestSubmissionsByUser.bg.designer.cs │ │ │ │ │ │ │ ├── ContestsAllContestSubmissionsByUser.bg.resx │ │ │ │ │ │ │ ├── ContestsAllContestSubmissionsByUser.resx │ │ │ │ │ │ │ ├── ContestsProblemPartial.Designer.cs │ │ │ │ │ │ │ ├── ContestsProblemPartial.bg.Designer.cs │ │ │ │ │ │ │ ├── ContestsProblemPartial.bg.resx │ │ │ │ │ │ │ └── ContestsProblemPartial.resx │ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ │ ├── ContestsViewModels.Designer.cs │ │ │ │ │ │ │ ├── ContestsViewModels.bg.designer.cs │ │ │ │ │ │ │ ├── ContestsViewModels.bg.resx │ │ │ │ │ │ │ ├── ContestsViewModels.resx │ │ │ │ │ │ │ ├── ProblemsViewModels.Designer.cs │ │ │ │ │ │ │ ├── ProblemsViewModels.bg.designer.cs │ │ │ │ │ │ │ ├── ProblemsViewModels.bg.resx │ │ │ │ │ │ │ ├── ProblemsViewModels.resx │ │ │ │ │ │ │ ├── SubmissionsViewModels.Designer.cs │ │ │ │ │ │ │ ├── SubmissionsViewModels.bg.designer.cs │ │ │ │ │ │ │ ├── SubmissionsViewModels.bg.resx │ │ │ │ │ │ │ └── SubmissionsViewModels.resx │ │ │ │ │ │ └── Views/ │ │ │ │ │ │ ├── Compete/ │ │ │ │ │ │ │ ├── CompeteIndex.Designer.cs │ │ │ │ │ │ │ ├── CompeteIndex.bg.designer.cs │ │ │ │ │ │ │ ├── CompeteIndex.bg.resx │ │ │ │ │ │ │ ├── CompeteIndex.resx │ │ │ │ │ │ │ ├── CompeteRegister.Designer.cs │ │ │ │ │ │ │ ├── CompeteRegister.bg.Designer.cs │ │ │ │ │ │ │ ├── CompeteRegister.bg.resx │ │ │ │ │ │ │ └── CompeteRegister.resx │ │ │ │ │ │ ├── Contests/ │ │ │ │ │ │ │ ├── ContestsDetails.Designer.cs │ │ │ │ │ │ │ ├── ContestsDetails.bg.designer.cs │ │ │ │ │ │ │ ├── ContestsDetails.bg.resx │ │ │ │ │ │ │ └── ContestsDetails.resx │ │ │ │ │ │ ├── List/ │ │ │ │ │ │ │ ├── ListByCategory.Designer.cs │ │ │ │ │ │ │ ├── ListByCategory.bg.Designer.cs │ │ │ │ │ │ │ ├── ListByCategory.bg.resx │ │ │ │ │ │ │ ├── ListByCategory.resx │ │ │ │ │ │ │ ├── ListByType.Designer.cs │ │ │ │ │ │ │ ├── ListByType.bg.designer.cs │ │ │ │ │ │ │ ├── ListByType.bg.resx │ │ │ │ │ │ │ ├── ListByType.resx │ │ │ │ │ │ │ ├── ListIndex.bg.designer.cs │ │ │ │ │ │ │ ├── ListIndex.bg.resx │ │ │ │ │ │ │ ├── ListIndex.designer.cs │ │ │ │ │ │ │ └── ListIndex.resx │ │ │ │ │ │ ├── Results/ │ │ │ │ │ │ │ ├── Partials/ │ │ │ │ │ │ │ │ ├── StatsPartial.Designer.cs │ │ │ │ │ │ │ │ ├── StatsPartial.bg.designer.cs │ │ │ │ │ │ │ │ ├── StatsPartial.bg.resx │ │ │ │ │ │ │ │ └── StatsPartial.resx │ │ │ │ │ │ │ ├── ResultsFull.bg.Designer.cs │ │ │ │ │ │ │ ├── ResultsFull.bg.resx │ │ │ │ │ │ │ ├── ResultsFull.designer.cs │ │ │ │ │ │ │ ├── ResultsFull.resx │ │ │ │ │ │ │ ├── ResultsSimple.Designer.cs │ │ │ │ │ │ │ ├── ResultsSimple.bg.Designer.cs │ │ │ │ │ │ │ ├── ResultsSimple.bg.resx │ │ │ │ │ │ │ └── ResultsSimple.resx │ │ │ │ │ │ └── Submissions/ │ │ │ │ │ │ ├── SubmissionsView.Designer.cs │ │ │ │ │ │ ├── SubmissionsView.bg.designer.cs │ │ │ │ │ │ ├── SubmissionsView.bg.resx │ │ │ │ │ │ └── SubmissionsView.resx │ │ │ │ │ └── Users/ │ │ │ │ │ ├── Shared/ │ │ │ │ │ │ ├── ProfileProfileInfo.Designer.cs │ │ │ │ │ │ ├── ProfileProfileInfo.bg.Designer.cs │ │ │ │ │ │ ├── ProfileProfileInfo.bg.resx │ │ │ │ │ │ └── ProfileProfileInfo.resx │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ ├── ProfileViewModels.Designer.cs │ │ │ │ │ │ ├── ProfileViewModels.bg.Designer.cs │ │ │ │ │ │ ├── ProfileViewModels.bg.resx │ │ │ │ │ │ └── ProfileViewModels.resx │ │ │ │ │ └── Views/ │ │ │ │ │ ├── Profile/ │ │ │ │ │ │ ├── ProfileIndex.Designer.cs │ │ │ │ │ │ ├── ProfileIndex.bg.Designer.cs │ │ │ │ │ │ ├── ProfileIndex.bg.resx │ │ │ │ │ │ └── ProfileIndex.resx │ │ │ │ │ └── Settings/ │ │ │ │ │ ├── SettingsIndex.Designer.cs │ │ │ │ │ ├── SettingsIndex.bg.designer.cs │ │ │ │ │ ├── SettingsIndex.bg.resx │ │ │ │ │ └── SettingsIndex.resx │ │ │ │ ├── Base/ │ │ │ │ │ ├── Main.Designer.cs │ │ │ │ │ ├── Main.bg.Designer.cs │ │ │ │ │ ├── Main.bg.resx │ │ │ │ │ └── Main.resx │ │ │ │ ├── Feedback/ │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ ├── FeedbackViewModels.Designer.cs │ │ │ │ │ │ ├── FeedbackViewModels.bg.designer.cs │ │ │ │ │ │ ├── FeedbackViewModels.bg.resx │ │ │ │ │ │ └── FeedbackViewModels.resx │ │ │ │ │ └── Views/ │ │ │ │ │ ├── FeedbackIndex.Designer.cs │ │ │ │ │ ├── FeedbackIndex.bg.designer.cs │ │ │ │ │ ├── FeedbackIndex.bg.resx │ │ │ │ │ ├── FeedbackIndex.resx │ │ │ │ │ ├── FeedbackSubmitted.Designer.cs │ │ │ │ │ ├── FeedbackSubmitted.bg.designer.cs │ │ │ │ │ ├── FeedbackSubmitted.bg.resx │ │ │ │ │ └── FeedbackSubmitted.resx │ │ │ │ ├── Global.Designer.cs │ │ │ │ ├── Global.resx │ │ │ │ ├── Home/ │ │ │ │ │ └── Views/ │ │ │ │ │ ├── Index.bg.designer.cs │ │ │ │ │ ├── Index.bg.resx │ │ │ │ │ ├── Index.designer.cs │ │ │ │ │ └── Index.resx │ │ │ │ ├── Models/ │ │ │ │ │ ├── ContestQuestionTypeResource.bg.Designer.cs │ │ │ │ │ ├── ContestQuestionTypeResource.bg.resx │ │ │ │ │ ├── ContestQuestionTypeResource.designer.cs │ │ │ │ │ └── ContestQuestionTypeResource.resx │ │ │ │ ├── News/ │ │ │ │ │ └── Views/ │ │ │ │ │ ├── All.Designer.cs │ │ │ │ │ ├── All.bg.designer.cs │ │ │ │ │ ├── All.bg.resx │ │ │ │ │ ├── All.resx │ │ │ │ │ ├── LatestNews.Designer.cs │ │ │ │ │ ├── LatestNews.bg.designer.cs │ │ │ │ │ ├── LatestNews.bg.resx │ │ │ │ │ ├── LatestNews.resx │ │ │ │ │ ├── Selected.Designer.cs │ │ │ │ │ ├── Selected.bg.designer.cs │ │ │ │ │ ├── Selected.bg.resx │ │ │ │ │ └── Selected.resx │ │ │ │ ├── Search/ │ │ │ │ │ └── Views/ │ │ │ │ │ ├── SearchIndex.bg.Designer.cs │ │ │ │ │ ├── SearchIndex.bg.resx │ │ │ │ │ ├── SearchIndex.designer.cs │ │ │ │ │ ├── SearchIndex.resx │ │ │ │ │ ├── SearchResults.Designer.cs │ │ │ │ │ ├── SearchResults.bg.Designer.cs │ │ │ │ │ ├── SearchResults.bg.resx │ │ │ │ │ └── SearchResults.resx │ │ │ │ ├── Submissions/ │ │ │ │ │ └── Views/ │ │ │ │ │ ├── AdvancedSubmissions.Designer.cs │ │ │ │ │ ├── AdvancedSubmissions.bg.designer.cs │ │ │ │ │ ├── AdvancedSubmissions.bg.resx │ │ │ │ │ ├── AdvancedSubmissions.resx │ │ │ │ │ ├── BasicSubmissions.Designer.cs │ │ │ │ │ ├── BasicSubmissions.bg.designer.cs │ │ │ │ │ ├── BasicSubmissions.bg.resx │ │ │ │ │ ├── BasicSubmissions.resx │ │ │ │ │ └── Partial/ │ │ │ │ │ ├── AdvancedSubmissionsGridPartial.Designer.cs │ │ │ │ │ ├── AdvancedSubmissionsGridPartial.bg.designer.cs │ │ │ │ │ ├── AdvancedSubmissionsGridPartial.bg.resx │ │ │ │ │ └── AdvancedSubmissionsGridPartial.resx │ │ │ │ └── Views/ │ │ │ │ └── Shared/ │ │ │ │ ├── Layout.Designer.cs │ │ │ │ ├── Layout.bg.designer.cs │ │ │ │ ├── Layout.bg.resx │ │ │ │ ├── Layout.resx │ │ │ │ ├── LoginPartial.bg.designer.cs │ │ │ │ ├── LoginPartial.bg.resx │ │ │ │ ├── LoginPartial.designer.cs │ │ │ │ └── LoginPartial.resx │ │ │ ├── App_Start/ │ │ │ │ ├── BundleConfig.cs │ │ │ │ ├── FilterConfig.cs │ │ │ │ ├── GlimpseSecurityPolicy.cs │ │ │ │ ├── LoggingModule.cs │ │ │ │ ├── NinjectWebCommon.cs │ │ │ │ ├── RouteConfig.cs │ │ │ │ ├── Settings.cs │ │ │ │ ├── Startup.Auth.cs │ │ │ │ └── ViewEngineConfig.cs │ │ │ ├── Areas/ │ │ │ │ ├── Administration/ │ │ │ │ │ ├── AdministrationAreaRegistration.cs │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── AccessLogsController.cs │ │ │ │ │ │ ├── AntiCheatController.cs │ │ │ │ │ │ ├── CheckersController.cs │ │ │ │ │ │ ├── ContestCategoriesController.cs │ │ │ │ │ │ ├── ContestQuestionAnswersController.cs │ │ │ │ │ │ ├── ContestQuestionsController.cs │ │ │ │ │ │ ├── ContestsController.cs │ │ │ │ │ │ ├── ContestsExportController.cs │ │ │ │ │ │ ├── FeedbackController.cs │ │ │ │ │ │ ├── NavigationController.cs │ │ │ │ │ │ ├── NewsController.cs │ │ │ │ │ │ ├── ParticipantsController.cs │ │ │ │ │ │ ├── ProblemsController.cs │ │ │ │ │ │ ├── ResourcesController.cs │ │ │ │ │ │ ├── RolesController.cs │ │ │ │ │ │ ├── SettingsController.cs │ │ │ │ │ │ ├── SubmissionTypesController.cs │ │ │ │ │ │ ├── SubmissionsController.cs │ │ │ │ │ │ ├── TestsController.cs │ │ │ │ │ │ └── UsersController.cs │ │ │ │ │ ├── Providers/ │ │ │ │ │ │ ├── Common/ │ │ │ │ │ │ │ └── BaseNewsProvider.cs │ │ │ │ │ │ ├── Contracts/ │ │ │ │ │ │ │ └── INewsProvider.cs │ │ │ │ │ │ ├── InfoManNewsProvider.cs │ │ │ │ │ │ └── InfosNewsProvider.cs │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ ├── AccessLogs/ │ │ │ │ │ │ │ └── AccessLogGridViewModel.cs │ │ │ │ │ │ ├── AntiCheat/ │ │ │ │ │ │ │ ├── AntiCheatByIpAdministrationViewModel.cs │ │ │ │ │ │ │ ├── IpSubmissionsAdministrationViewModel.cs │ │ │ │ │ │ │ ├── SubmissionSimilarityFiltersInputModel.cs │ │ │ │ │ │ │ └── SubmissionSimilarityViewModel.cs │ │ │ │ │ │ ├── Checker/ │ │ │ │ │ │ │ └── CheckerAdministrationViewModel.cs │ │ │ │ │ │ ├── Common/ │ │ │ │ │ │ │ └── AdministrationViewModel.cs │ │ │ │ │ │ ├── Contest/ │ │ │ │ │ │ │ ├── ContestAdministrationViewModel.cs │ │ │ │ │ │ │ └── ShortContestAdministrationViewModel.cs │ │ │ │ │ │ ├── ContestCategory/ │ │ │ │ │ │ │ └── ContestCategoryAdministrationViewModel.cs │ │ │ │ │ │ ├── ContestQuestion/ │ │ │ │ │ │ │ └── ContestQuestionViewModel.cs │ │ │ │ │ │ ├── ContestQuestionAnswer/ │ │ │ │ │ │ │ └── ContestQuestionAnswerViewModel.cs │ │ │ │ │ │ ├── FeedbackReport/ │ │ │ │ │ │ │ └── FeedbackReportViewModel.cs │ │ │ │ │ │ ├── News/ │ │ │ │ │ │ │ └── NewsAdministrationViewModel.cs │ │ │ │ │ │ ├── Participant/ │ │ │ │ │ │ │ ├── ContestViewModel.cs │ │ │ │ │ │ │ ├── ParticipantAdministrationViewModel.cs │ │ │ │ │ │ │ ├── ParticipantAnswerViewModel.cs │ │ │ │ │ │ │ └── UserViewModel.cs │ │ │ │ │ │ ├── Problem/ │ │ │ │ │ │ │ ├── DetailedProblemViewModel.cs │ │ │ │ │ │ │ └── ProblemViewModel.cs │ │ │ │ │ │ ├── ProblemResource/ │ │ │ │ │ │ │ ├── ProblemResourceGridViewModel.cs │ │ │ │ │ │ │ └── ProblemResourceViewModel.cs │ │ │ │ │ │ ├── Roles/ │ │ │ │ │ │ │ ├── RoleAdministrationViewModel.cs │ │ │ │ │ │ │ └── UserInRoleAdministrationViewModel.cs │ │ │ │ │ │ ├── Setting/ │ │ │ │ │ │ │ └── SettingAdministrationViewModel.cs │ │ │ │ │ │ ├── Submission/ │ │ │ │ │ │ │ ├── SubmissionAdministrationGridViewModel.cs │ │ │ │ │ │ │ └── SubmissionAdministrationViewModel.cs │ │ │ │ │ │ ├── SubmissionType/ │ │ │ │ │ │ │ ├── SubmissionTypeAdministrationViewModel.cs │ │ │ │ │ │ │ └── SubmissionTypeViewModel.cs │ │ │ │ │ │ ├── Test/ │ │ │ │ │ │ │ └── TestViewModel.cs │ │ │ │ │ │ ├── TestRun/ │ │ │ │ │ │ │ └── TestRunViewModel.cs │ │ │ │ │ │ └── User/ │ │ │ │ │ │ └── UserProfileAdministrationViewModel.cs │ │ │ │ │ └── Views/ │ │ │ │ │ ├── AccessLogs/ │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── AntiCheat/ │ │ │ │ │ │ ├── ByIP.cshtml │ │ │ │ │ │ ├── BySubmissionSimilarity.cshtml │ │ │ │ │ │ ├── _ContestsComboBox.cshtml │ │ │ │ │ │ ├── _IPGrid.cshtml │ │ │ │ │ │ └── _SubmissionsGrid.cshtml │ │ │ │ │ ├── Checkers/ │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── ContestCategories/ │ │ │ │ │ │ ├── Hierarchy.cshtml │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── Contests/ │ │ │ │ │ │ ├── Create.cshtml │ │ │ │ │ │ ├── Edit.cshtml │ │ │ │ │ │ ├── EditorTemplates/ │ │ │ │ │ │ │ ├── CategoryDropDown.cshtml │ │ │ │ │ │ │ ├── ContestQuestionType.cshtml │ │ │ │ │ │ │ └── SubmissionTypeCheckBoxes.cshtml │ │ │ │ │ │ ├── Index.cshtml │ │ │ │ │ │ └── _ContestEditor.cshtml │ │ │ │ │ ├── Feedback/ │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── Navigation/ │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── News/ │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── Participants/ │ │ │ │ │ │ ├── Contest.cshtml │ │ │ │ │ │ ├── EditorTemplates/ │ │ │ │ │ │ │ ├── ContestsComboBox.cshtml │ │ │ │ │ │ │ └── UsersComboBox.cshtml │ │ │ │ │ │ ├── Index.cshtml │ │ │ │ │ │ └── _Participants.cshtml │ │ │ │ │ ├── Problems/ │ │ │ │ │ │ ├── Create.cshtml │ │ │ │ │ │ ├── Delete.cshtml │ │ │ │ │ │ ├── DeleteAll.cshtml │ │ │ │ │ │ ├── Details.cshtml │ │ │ │ │ │ ├── Edit.cshtml │ │ │ │ │ │ ├── Index.cshtml │ │ │ │ │ │ ├── _ResourcesGrid.cshtml │ │ │ │ │ │ └── _SubmissionsGrid.cshtml │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ ├── Create.cshtml │ │ │ │ │ │ └── Edit.cshtml │ │ │ │ │ ├── Roles/ │ │ │ │ │ │ ├── EditorTemplates/ │ │ │ │ │ │ │ └── AddUserToRole.cshtml │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── Settings/ │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── Shared/ │ │ │ │ │ │ ├── EditorTemplates/ │ │ │ │ │ │ │ ├── Date.cshtml │ │ │ │ │ │ │ ├── DateAndTime.cshtml │ │ │ │ │ │ │ ├── DisabledCheckbox.cshtml │ │ │ │ │ │ │ ├── DropDownList.cshtml │ │ │ │ │ │ │ ├── Enum.cshtml │ │ │ │ │ │ │ ├── HtmlContent.cshtml │ │ │ │ │ │ │ ├── Integer.cshtml │ │ │ │ │ │ │ ├── MultiLineText.cshtml │ │ │ │ │ │ │ ├── NonEditable.cshtml │ │ │ │ │ │ │ ├── PositiveInteger.cshtml │ │ │ │ │ │ │ └── SingleLineText.cshtml │ │ │ │ │ │ ├── _AdministrationLayout.cshtml │ │ │ │ │ │ ├── _CopyQuestionsFromContest.cshtml │ │ │ │ │ │ ├── _ProblemResourceForm.cshtml │ │ │ │ │ │ └── _QuickContestsGrid.cshtml │ │ │ │ │ ├── SubmissionTypes/ │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── Submissions/ │ │ │ │ │ │ ├── Create.cshtml │ │ │ │ │ │ ├── Delete.cshtml │ │ │ │ │ │ ├── EditorTemplates/ │ │ │ │ │ │ │ ├── ParticipantDropDownList.cshtml │ │ │ │ │ │ │ ├── ProblemComboBox.cshtml │ │ │ │ │ │ │ ├── SubmissionAdministrationViewModel.cshtml │ │ │ │ │ │ │ └── SubmissionTypesDropDownList.cshtml │ │ │ │ │ │ ├── Index.cshtml │ │ │ │ │ │ ├── Update.cshtml │ │ │ │ │ │ ├── _SubmissionForm.cshtml │ │ │ │ │ │ └── _SubmissionsGrid.cshtml │ │ │ │ │ ├── Tests/ │ │ │ │ │ │ ├── Create.cshtml │ │ │ │ │ │ ├── Delete.cshtml │ │ │ │ │ │ ├── DeleteAll.cshtml │ │ │ │ │ │ ├── Details.cshtml │ │ │ │ │ │ ├── Edit.cshtml │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── Users/ │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── Web.config │ │ │ │ │ └── _ViewStart.cshtml │ │ │ │ ├── Api/ │ │ │ │ │ ├── ApiAreaRegistration.cs │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── ApiController.cs │ │ │ │ │ │ └── ResultsController.cs │ │ │ │ │ └── Models/ │ │ │ │ │ └── ErrorMessageViewModel.cs │ │ │ │ ├── Contests/ │ │ │ │ │ ├── ContestsAreaRegistration.cs │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── CompeteController.cs │ │ │ │ │ │ ├── ContestsController.cs │ │ │ │ │ │ ├── ListController.cs │ │ │ │ │ │ ├── ParticipantsAnswersController.cs │ │ │ │ │ │ ├── ResultsController.cs │ │ │ │ │ │ └── SubmissionsController.cs │ │ │ │ │ ├── Helpers/ │ │ │ │ │ │ └── ContestExtensions.cs │ │ │ │ │ ├── Models/ │ │ │ │ │ │ ├── BinarySubmissionModel.cs │ │ │ │ │ │ ├── ContestQuestionAnswerModel.cs │ │ │ │ │ │ ├── ContestRegistrationModel.cs │ │ │ │ │ │ └── SubmissionModel.cs │ │ │ │ │ ├── ViewModels/ │ │ │ │ │ │ ├── Contests/ │ │ │ │ │ │ │ ├── ContestCategoryListViewModel.cs │ │ │ │ │ │ │ ├── ContestCategoryViewModel.cs │ │ │ │ │ │ │ ├── ContestPointsRangeViewModel.cs │ │ │ │ │ │ │ ├── ContestProblemResourceViewModel.cs │ │ │ │ │ │ │ ├── ContestProblemStatsViewModel.cs │ │ │ │ │ │ │ ├── ContestProblemViewModel.cs │ │ │ │ │ │ │ ├── ContestRegistrationViewModel.cs │ │ │ │ │ │ │ ├── ContestStatsChartViewModel.cs │ │ │ │ │ │ │ ├── ContestStatsViewModel.cs │ │ │ │ │ │ │ ├── ContestViewModel.cs │ │ │ │ │ │ │ ├── DropDownAnswerViewModel.cs │ │ │ │ │ │ │ └── QuestionViewModel.cs │ │ │ │ │ │ ├── Participants/ │ │ │ │ │ │ │ └── ParticipantViewModel.cs │ │ │ │ │ │ ├── ParticipantsAnswers/ │ │ │ │ │ │ │ └── ParticipantsAnswersViewModel.cs │ │ │ │ │ │ ├── Problems/ │ │ │ │ │ │ │ └── ProblemListItemViewModel.cs │ │ │ │ │ │ ├── Results/ │ │ │ │ │ │ │ ├── BestSubmissionViewModel.cs │ │ │ │ │ │ │ ├── ContestFullResultsViewModel.cs │ │ │ │ │ │ │ ├── ContestResultsViewModel.cs │ │ │ │ │ │ │ ├── ParticipantFullResultViewModel.cs │ │ │ │ │ │ │ ├── ParticipantResultViewModel.cs │ │ │ │ │ │ │ ├── ProblemFullResultViewModel.cs │ │ │ │ │ │ │ ├── ProblemResultPairViewModel.cs │ │ │ │ │ │ │ ├── ProblemResultViewModel.cs │ │ │ │ │ │ │ ├── SubmissionFullResultsViewModel.cs │ │ │ │ │ │ │ ├── SubmissionResultIsCompiledViewModel.cs │ │ │ │ │ │ │ └── TestRunFullResultsViewModel.cs │ │ │ │ │ │ └── Submissions/ │ │ │ │ │ │ ├── SubmissionDetailsViewModel.cs │ │ │ │ │ │ ├── SubmissionResultViewModel.cs │ │ │ │ │ │ ├── SubmissionTypeViewModel.cs │ │ │ │ │ │ └── TestRunDetailsViewModel.cs │ │ │ │ │ └── Views/ │ │ │ │ │ ├── Compete/ │ │ │ │ │ │ ├── Index.cshtml │ │ │ │ │ │ └── Register.cshtml │ │ │ │ │ ├── Contests/ │ │ │ │ │ │ └── Details.cshtml │ │ │ │ │ ├── List/ │ │ │ │ │ │ ├── ByCategory.cshtml │ │ │ │ │ │ ├── BySubmissionType.cshtml │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ ├── ParticipantsAnswers/ │ │ │ │ │ │ └── Details.cshtml │ │ │ │ │ ├── Results/ │ │ │ │ │ │ ├── Full.cshtml │ │ │ │ │ │ ├── Simple.cshtml │ │ │ │ │ │ ├── _StatsChartPartial.cshtml │ │ │ │ │ │ └── _StatsPartial.cshtml │ │ │ │ │ ├── Shared/ │ │ │ │ │ │ ├── _AllContestSubmissionsByUser.cshtml │ │ │ │ │ │ └── _ProblemPartial.cshtml │ │ │ │ │ ├── Submissions/ │ │ │ │ │ │ └── View.cshtml │ │ │ │ │ └── Web.Config │ │ │ │ └── Users/ │ │ │ │ ├── Controllers/ │ │ │ │ │ ├── ProfileController.cs │ │ │ │ │ └── SettingsController.cs │ │ │ │ ├── Helpers/ │ │ │ │ │ └── NullDisplayFormatAttribute.cs │ │ │ │ ├── UsersAreaRegistration.cs │ │ │ │ ├── ViewModels/ │ │ │ │ │ ├── UserParticipationViewModel.cs │ │ │ │ │ ├── UserProfileViewModel.cs │ │ │ │ │ └── UserSettingsViewModel.cs │ │ │ │ └── Views/ │ │ │ │ ├── Profile/ │ │ │ │ │ └── Index.cshtml │ │ │ │ ├── Settings/ │ │ │ │ │ └── Index.cshtml │ │ │ │ ├── Shared/ │ │ │ │ │ └── _ProfileInfo.cshtml │ │ │ │ └── Web.Config │ │ │ ├── Content/ │ │ │ │ ├── CodeMirror/ │ │ │ │ │ ├── addon/ │ │ │ │ │ │ └── merge.css │ │ │ │ │ ├── codemirror.css │ │ │ │ │ └── theme/ │ │ │ │ │ ├── 3024-day.css │ │ │ │ │ ├── 3024-night.css │ │ │ │ │ ├── ambiance-mobile.css │ │ │ │ │ ├── ambiance.css │ │ │ │ │ ├── base16-dark.css │ │ │ │ │ ├── base16-light.css │ │ │ │ │ ├── blackboard.css │ │ │ │ │ ├── cobalt.css │ │ │ │ │ ├── eclipse.css │ │ │ │ │ ├── elegant.css │ │ │ │ │ ├── erlang-dark.css │ │ │ │ │ ├── lesser-dark.css │ │ │ │ │ ├── mbo.css │ │ │ │ │ ├── mdn-like.css │ │ │ │ │ ├── midnight.css │ │ │ │ │ ├── monokai.css │ │ │ │ │ ├── neat.css │ │ │ │ │ ├── night.css │ │ │ │ │ ├── paraiso-dark.css │ │ │ │ │ ├── paraiso-light.css │ │ │ │ │ ├── pastel-on-dark.css │ │ │ │ │ ├── rubyblue.css │ │ │ │ │ ├── solarized.css │ │ │ │ │ ├── the-matrix.css │ │ │ │ │ ├── tomorrow-night-eighties.css │ │ │ │ │ ├── twilight.css │ │ │ │ │ ├── vibrant-ink.css │ │ │ │ │ ├── xq-dark.css │ │ │ │ │ └── xq-light.css │ │ │ │ ├── Contests/ │ │ │ │ │ ├── results-page.css │ │ │ │ │ ├── submission-page.css │ │ │ │ │ └── submission-view-page.css │ │ │ │ ├── KendoUI/ │ │ │ │ │ ├── kendo.black.css │ │ │ │ │ └── kendo.common.css │ │ │ │ ├── Site.css │ │ │ │ ├── bootstrap/ │ │ │ │ │ ├── bootstrap-theme-cyborg.css │ │ │ │ │ ├── bootstrap-theme.css │ │ │ │ │ ├── bootstrap.css │ │ │ │ │ └── themes/ │ │ │ │ │ ├── bootstrap-theme-cosmo.css │ │ │ │ │ ├── bootstrap-theme-cyborg.css │ │ │ │ │ ├── bootstrap-theme-flatly.css │ │ │ │ │ └── bootstrap-theme.css │ │ │ │ └── docs.css │ │ │ ├── Controllers/ │ │ │ │ ├── AccountController.cs │ │ │ │ ├── AdministrationController.cs │ │ │ │ ├── BaseController.cs │ │ │ │ ├── FeedbackController.cs │ │ │ │ ├── HomeController.cs │ │ │ │ ├── KendoGridAdministrationController.cs │ │ │ │ ├── NewsController.cs │ │ │ │ ├── RedirectsController.cs │ │ │ │ ├── SearchController.cs │ │ │ │ └── SubmissionsController.cs │ │ │ ├── Global.asax │ │ │ ├── Global.asax.cs │ │ │ ├── JSLintNet.json │ │ │ ├── OJS.Web.csproj │ │ │ ├── Properties/ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ └── PublishProfiles/ │ │ │ │ ├── File System.pubxml │ │ │ │ └── bgcoder.com.pubxml │ │ │ ├── Scripts/ │ │ │ │ ├── Administration/ │ │ │ │ │ ├── Contests/ │ │ │ │ │ │ └── contests-index.js │ │ │ │ │ ├── Problems/ │ │ │ │ │ │ ├── problems-create.js │ │ │ │ │ │ ├── problems-edit.js │ │ │ │ │ │ └── problems-index.js │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ ├── resources-create.js │ │ │ │ │ │ └── resources-edit.js │ │ │ │ │ ├── Tests/ │ │ │ │ │ │ ├── tests-details.js │ │ │ │ │ │ └── tests-index.js │ │ │ │ │ └── administration-global.js │ │ │ │ ├── CodeMirror/ │ │ │ │ │ ├── addon/ │ │ │ │ │ │ ├── diff_match_patch.js │ │ │ │ │ │ └── merge.js │ │ │ │ │ ├── codemirror.js │ │ │ │ │ └── mode/ │ │ │ │ │ ├── clike.js │ │ │ │ │ └── javascript.js │ │ │ │ ├── Contests/ │ │ │ │ │ ├── list-categories-page.js │ │ │ │ │ └── submission-page.js │ │ │ │ ├── Helpers/ │ │ │ │ │ └── test-results.js │ │ │ │ ├── KendoUI/ │ │ │ │ │ └── 2014.3.1411/ │ │ │ │ │ ├── cultures/ │ │ │ │ │ │ ├── kendo.culture.bg.js │ │ │ │ │ │ └── kendo.culture.en-GB.js │ │ │ │ │ ├── kendo.all.js │ │ │ │ │ └── kendo.aspnetmvc.js │ │ │ │ ├── _references.js │ │ │ │ ├── bootstrap.js │ │ │ │ ├── global.js │ │ │ │ ├── jquery-2.1.4.intellisense.js │ │ │ │ ├── jquery-2.1.4.js │ │ │ │ ├── jquery.unobtrusive-ajax.js │ │ │ │ ├── jquery.validate-vsdoc.js │ │ │ │ ├── jquery.validate.js │ │ │ │ └── jquery.validate.unobtrusive.js │ │ │ ├── Startup.cs │ │ │ ├── ViewModels/ │ │ │ │ ├── Account/ │ │ │ │ │ ├── ChangeEmailViewModel.cs │ │ │ │ │ ├── ChangeUsernameViewModel.cs │ │ │ │ │ ├── ExternalLoginConfirmationViewModel.cs │ │ │ │ │ ├── ForgottenPasswordViewModel.cs │ │ │ │ │ ├── LoginViewModel.cs │ │ │ │ │ ├── ManageUserViewModel.cs │ │ │ │ │ └── RegisterViewModel.cs │ │ │ │ ├── CategoryMenuItemViewModel.cs │ │ │ │ ├── Feedback/ │ │ │ │ │ └── FeedbackViewModel.cs │ │ │ │ ├── Home/ │ │ │ │ │ └── Index/ │ │ │ │ │ ├── HomeContestViewModel.cs │ │ │ │ │ └── IndexViewModel.cs │ │ │ │ ├── News/ │ │ │ │ │ ├── AllNewsViewModel.cs │ │ │ │ │ ├── NewsViewModel.cs │ │ │ │ │ └── SelectedNewsViewModel.cs │ │ │ │ ├── Search/ │ │ │ │ │ ├── SearchResultGroupViewModel.cs │ │ │ │ │ └── SearchResultViewModel.cs │ │ │ │ ├── Shared/ │ │ │ │ │ └── PaginationViewModel.cs │ │ │ │ ├── Submission/ │ │ │ │ │ └── SubmissionViewModel.cs │ │ │ │ └── TestRun/ │ │ │ │ └── TestRunViewModel.cs │ │ │ ├── Views/ │ │ │ │ ├── Account/ │ │ │ │ │ ├── ChangeEmail.cshtml │ │ │ │ │ ├── ChangePassword.cshtml │ │ │ │ │ ├── ChangeUsername.cshtml │ │ │ │ │ ├── ExternalLoginConfirmation.cshtml │ │ │ │ │ ├── ExternalLoginFailure.cshtml │ │ │ │ │ ├── ForgottenPassword.cshtml │ │ │ │ │ ├── Login.cshtml │ │ │ │ │ ├── Manage.cshtml │ │ │ │ │ ├── Register.cshtml │ │ │ │ │ ├── _ChangePasswordPartial.cshtml │ │ │ │ │ ├── _ExternalLoginsListPartial.cshtml │ │ │ │ │ ├── _RemoveAccountPartial.cshtml │ │ │ │ │ └── _SetPasswordPartial.cshtml │ │ │ │ ├── Feedback/ │ │ │ │ │ ├── Index.cshtml │ │ │ │ │ └── Submitted.cshtml │ │ │ │ ├── Home/ │ │ │ │ │ └── Index.cshtml │ │ │ │ ├── News/ │ │ │ │ │ ├── All.cshtml │ │ │ │ │ └── Selected.cshtml │ │ │ │ ├── Search/ │ │ │ │ │ ├── Index.cshtml │ │ │ │ │ └── Results.cshtml │ │ │ │ ├── Shared/ │ │ │ │ │ ├── EditorTemplates/ │ │ │ │ │ │ ├── Currency.cshtml │ │ │ │ │ │ ├── Date.cshtml │ │ │ │ │ │ ├── DateTime.cshtml │ │ │ │ │ │ ├── EmailAddress.cshtml │ │ │ │ │ │ ├── GridForeignKey.cshtml │ │ │ │ │ │ ├── Integer.cshtml │ │ │ │ │ │ ├── MultilineText.cshtml │ │ │ │ │ │ ├── Number.cshtml │ │ │ │ │ │ ├── Password.cshtml │ │ │ │ │ │ ├── QuestionViewModel.cshtml │ │ │ │ │ │ ├── String.cshtml │ │ │ │ │ │ └── Time.cshtml │ │ │ │ │ ├── Error.cshtml │ │ │ │ │ ├── _AdvancedSubmissionsGridPartial.cshtml │ │ │ │ │ ├── _LatestNews.cshtml │ │ │ │ │ ├── _Layout.cshtml │ │ │ │ │ ├── _LoginPartial.cshtml │ │ │ │ │ └── _Pagination.cshtml │ │ │ │ ├── Submissions/ │ │ │ │ │ ├── AdvancedSubmissions.cshtml │ │ │ │ │ └── BasicSubmissions.cshtml │ │ │ │ ├── Web.config │ │ │ │ └── _ViewStart.cshtml │ │ │ ├── Web.Debug.config │ │ │ ├── Web.Release.config │ │ │ ├── Web.config │ │ │ ├── _ViewStart.cshtml │ │ │ ├── google95e631afa25e7960.html │ │ │ ├── packages.config │ │ │ └── robots.txt │ │ └── OJS.Web.Common/ │ │ ├── Attributes/ │ │ │ ├── LogAccessAttribute.cs │ │ │ ├── LoggerFilterAttribute.cs │ │ │ └── OverrideAuthorizeAttribute.cs │ │ ├── EnumConverter.cs │ │ ├── Extensions/ │ │ │ ├── PrincipalExtensions.cs │ │ │ └── TempDataExtentions.cs │ │ ├── Interfaces/ │ │ │ ├── IAdministrationViewModel.cs │ │ │ └── IKendoGridAdministrationController.cs │ │ ├── OJS.Web.Common.csproj │ │ ├── OjsUserManager.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── SearchResultType.cs │ │ ├── SystemMessage.cs │ │ ├── SystemMessageCollection.cs │ │ ├── SystemMessageType.cs │ │ ├── ZipFileResult.cs │ │ ├── ZippedTestManipulator/ │ │ │ ├── TestsParseResult.cs │ │ │ └── ZippedTestsManipulator.cs │ │ ├── app.config │ │ └── packages.config │ └── Workers/ │ ├── OJS.Workers.Agent/ │ │ ├── AgentClient.cs │ │ ├── AgentCommunicator.cs │ │ ├── AgentService.cs │ │ ├── AgentServiceInstaller.cs │ │ ├── App.config │ │ ├── Batch Files/ │ │ │ ├── InstallService.bat │ │ │ └── StopService.bat │ │ ├── CodeJobWorker.cs │ │ ├── FileCache.cs │ │ ├── IFileCache.cs │ │ ├── IJobWorker.cs │ │ ├── OJS.Workers.Agent.csproj │ │ ├── OJS.Workers.Agent_TemporaryKey.pfx │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ ├── AssemblyInfo.cs │ │ │ └── app.manifest │ │ └── packages.config │ ├── OJS.Workers.Checkers/ │ │ ├── CPlusPlusCodeChecker.cs │ │ ├── CSharpCodeChecker.cs │ │ ├── CaseInsensitiveChecker.cs │ │ ├── Checker.cs │ │ ├── ExactChecker.cs │ │ ├── OJS.Workers.Checkers.csproj │ │ ├── PrecisionChecker.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── SortChecker.cs │ │ ├── TrimChecker.cs │ │ └── packages.config │ ├── OJS.Workers.Common/ │ │ ├── Agents/ │ │ │ ├── AgentResponseData.cs │ │ │ ├── AgentTaskData.cs │ │ │ ├── SourceFile.cs │ │ │ ├── TaskInformation.cs │ │ │ ├── Test.cs │ │ │ └── TestResult.cs │ │ ├── CheckerDetails.cs │ │ ├── CheckerResult.cs │ │ ├── CheckerResultType.cs │ │ ├── Communication/ │ │ │ ├── Job.cs │ │ │ ├── JobResult.cs │ │ │ ├── NetworkCommunicationException.cs │ │ │ ├── NetworkDataObject.cs │ │ │ ├── NetworkDataObjectType.cs │ │ │ └── SystemInformation.cs │ │ ├── CompileResult.cs │ │ ├── Helpers/ │ │ │ └── JavaCodePreprocessorHelper.cs │ │ ├── IChecker.cs │ │ ├── ICompiler.cs │ │ ├── IExecutor.cs │ │ ├── OJS.Workers.Common.csproj │ │ ├── ProcessExecutionResult.cs │ │ ├── ProcessExecutionResultType.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── packages.config │ ├── OJS.Workers.Compilers/ │ │ ├── CPlusPlusCompiler.cs │ │ ├── CSharpCompiler.cs │ │ ├── Compiler.cs │ │ ├── CompilerOutput.cs │ │ ├── JavaCompiler.cs │ │ ├── JavaZipCompiler.cs │ │ ├── MsBuildCompiler.cs │ │ ├── OJS.Workers.Compilers.csproj │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── packages.config │ ├── OJS.Workers.Controller/ │ │ ├── App.config │ │ ├── Batch Files/ │ │ │ ├── InstallService.bat │ │ │ └── StopService.bat │ │ ├── ClientConnectedEventArgs.cs │ │ ├── ControllerCommunicator.cs │ │ ├── ControllerServer.cs │ │ ├── ControllerService.cs │ │ ├── ControllerServiceInstaller.cs │ │ ├── OJS.Workers.Controller.csproj │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── packages.config │ ├── OJS.Workers.ExecutionStrategies/ │ │ ├── CSharpTestRunnerExecutionStrategy.cs │ │ ├── CompileExecuteAndCheckExecutionStrategy.cs │ │ ├── DoNothingExecutionStrategy.cs │ │ ├── ExecutionContext.cs │ │ ├── ExecutionResult.cs │ │ ├── ExecutionStrategy.cs │ │ ├── IExecutionStrategy.cs │ │ ├── IoJsPreprocessExecuteAndRunJsDomUnitTestsExecutionStrategy.cs │ │ ├── JavaPreprocessCompileExecuteAndCheckExecutionStrategy.cs │ │ ├── JavaZipFileCompileExecuteAndCheckExecutionStrategy.cs │ │ ├── JsonExecutionResult.cs │ │ ├── NodeJsPreprocessExecuteAndCheckExecutionStrategy.cs │ │ ├── NodeJsPreprocessExecuteAndRunUnitTestsWithMochaExecutionStrategy.cs │ │ ├── OJS.Workers.ExecutionStrategies.csproj │ │ ├── PhpCgiExecuteAndCheckExecutionStrategy.cs │ │ ├── PhpCliExecuteAndCheckExecutionStrategy.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── PythonExecuteAndCheckExecutionStrategy.cs │ │ ├── RemoteExecutionStrategy.cs │ │ ├── TestContext.cs │ │ ├── TestResult.cs │ │ └── packages.config │ ├── OJS.Workers.Executors/ │ │ ├── JobObjects/ │ │ │ ├── BasicLimitInformation.cs │ │ │ ├── BasicUiRestrictions.cs │ │ │ ├── ExtendedLimitInformation.cs │ │ │ ├── InfoClass.cs │ │ │ ├── IoCounters.cs │ │ │ ├── JobObject.cs │ │ │ ├── LimitFlags.cs │ │ │ ├── NativeMethods.cs │ │ │ ├── PrepareJobObject.cs │ │ │ ├── SecurityAttributes.cs │ │ │ ├── SecurityLimitFlags.cs │ │ │ ├── SecurityLimitInformation.cs │ │ │ └── UiRestrictionFlags.cs │ │ ├── OJS.Workers.Executors.csproj │ │ ├── Process/ │ │ │ ├── CreateProcessFlags.cs │ │ │ ├── CreateRestrictedTokenFlags.cs │ │ │ ├── DuplicateOptions.cs │ │ │ ├── LogonProvider.cs │ │ │ ├── LogonType.cs │ │ │ ├── Luid.cs │ │ │ ├── LuidAndAttributes.cs │ │ │ ├── NativeMethods.cs │ │ │ ├── PriorityClass.cs │ │ │ ├── ProcessInformation.cs │ │ │ ├── ProcessMemoryCounters.cs │ │ │ ├── ProcessThreadTimes.cs │ │ │ ├── ProcessWaitHandle.cs │ │ │ ├── RestrictedProcess.cs │ │ │ ├── SafeLocalMemHandle.cs │ │ │ ├── SafeProcessHandle.cs │ │ │ ├── SecurityAttributes.cs │ │ │ ├── SecurityMandatoryLabel.cs │ │ │ ├── SidAndAttributes.cs │ │ │ ├── SidIdentifierAuthority.cs │ │ │ ├── StartupInfo.cs │ │ │ ├── StartupInfoFlags.cs │ │ │ ├── TokenInformationClass.cs │ │ │ └── TokenMandatoryLabel.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── RestrictedProcessExecutor.cs │ │ ├── StandardProcessExecutor.cs │ │ └── packages.config │ ├── OJS.Workers.LocalWorker/ │ │ ├── App.config │ │ ├── Batch Files/ │ │ │ ├── InstallService.bat │ │ │ └── StopService.bat │ │ ├── IJob.cs │ │ ├── LocalWorkerService.cs │ │ ├── LocalWorkerServiceInstaller.cs │ │ ├── OJS.Workers.LocalWorker.csproj │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Settings.cs │ │ ├── SubmissionJob.cs │ │ └── packages.config │ └── OJS.Workers.Tools/ │ ├── AntiCheat/ │ │ ├── CSharpCompileDisassemblePlagiarismDetector.cs │ │ ├── CompileDisassemblePlagiarismDetector.cs │ │ ├── Contracts/ │ │ │ ├── IDetectPlagiarismVisitor.cs │ │ │ ├── IPlagiarismDetector.cs │ │ │ └── IPlagiarismDetectorFactory.cs │ │ ├── JavaCompileDisassemblePlagiarismDetector.cs │ │ ├── PlagiarismDetectorCreationContext.cs │ │ ├── PlagiarismDetectorFactory.cs │ │ ├── PlagiarismResult.cs │ │ ├── PlainTextPlagiarismDetector.cs │ │ ├── SortAndTrimLinesVisitor.cs │ │ └── SortTrimLinesAndRemoveBlankLinesVisitor.cs │ ├── Disassemblers/ │ │ ├── Contracts/ │ │ │ └── IDisassembler.cs │ │ ├── DisassembleResult.cs │ │ ├── Disassembler.cs │ │ ├── DotNetDisassembler.cs │ │ └── JavaDisassembler.cs │ ├── OJS.Workers.Tools.csproj │ ├── Properties/ │ │ └── AssemblyInfo.cs │ ├── Similarity/ │ │ ├── Contracts/ │ │ │ └── ISimilarityFinder.cs │ │ ├── DiffData.cs │ │ ├── Difference.cs │ │ ├── ShortestMiddleSnakeReturnData.cs │ │ └── SimilarityFinder.cs │ └── packages.config ├── README.md └── Research/ ├── Other Judge Systems/ │ ├── PC2/ │ │ └── Web page.url │ └── README.md ├── Sandbox/ │ ├── ChromiumSandbox.docx │ ├── Executor.Security.Tests/ │ │ └── CSharp/ │ │ ├── 01. Shut Down With Diagnostics.txt │ │ ├── 02. Shut Down With Win32 Method.txt │ │ ├── 03. Shut Down With System.Management.txt │ │ ├── 04. Reboot.txt │ │ ├── 05. Kill Network.txt │ │ ├── 06. Registry Edit.txt │ │ ├── 07. Kill Process - WORKS ON CURRENT VERSION!.txt │ │ ├── 08. Execute Bat File - WORKS ON CURRENT VERSION.txt │ │ ├── 09. Create Folder Somewhere.txt │ │ ├── 10. Try To Save Input In File.txt │ │ ├── 11. Using Windows Fork Bomb - WORKS ON CURRENT VERSION.txt │ │ └── ToDo.txt │ ├── Java sandbox/ │ │ ├── SandboxTests/ │ │ │ ├── build/ │ │ │ │ └── classes/ │ │ │ │ ├── .netbeans_automatic_build │ │ │ │ └── .netbeans_update_resources │ │ │ ├── build.xml │ │ │ ├── manifest.mf │ │ │ ├── nbproject/ │ │ │ │ ├── build-impl.xml │ │ │ │ ├── genfiles.properties │ │ │ │ ├── private/ │ │ │ │ │ ├── private.properties │ │ │ │ │ └── private.xml │ │ │ │ ├── project.properties │ │ │ │ └── project.xml │ │ │ └── src/ │ │ │ └── sandboxtests/ │ │ │ ├── SandboxSecurityManager.java │ │ │ ├── SandboxTests.java │ │ │ └── UserClass.java │ │ └── TestApplication/ │ │ ├── build/ │ │ │ └── built-jar.properties │ │ ├── build.xml │ │ ├── dist/ │ │ │ ├── README.TXT │ │ │ └── TestApplication.jar │ │ ├── manifest.mf │ │ ├── nbproject/ │ │ │ ├── build-impl.xml │ │ │ ├── genfiles.properties │ │ │ ├── private/ │ │ │ │ ├── private.properties │ │ │ │ └── private.xml │ │ │ ├── project.properties │ │ │ └── project.xml │ │ └── src/ │ │ └── testapplication/ │ │ └── TestApplication.java │ ├── README.md │ └── Software/ │ └── AsproLock.v0504.src/ │ ├── AsproLock/ │ │ ├── AccessControl/ │ │ │ ├── BaseSecurity.cs │ │ │ ├── DesktopAccessRule.cs │ │ │ ├── DesktopAuditRule.cs │ │ │ ├── DesktopRights.cs │ │ │ ├── DesktopSecurity.cs │ │ │ ├── DirectoryAccessRule.cs │ │ │ ├── DirectoryAuditRule.cs │ │ │ ├── DirectoryRights.cs │ │ │ ├── DirectorySecurity.cs │ │ │ ├── FileAccessRule.cs │ │ │ ├── FileAuditRule.cs │ │ │ ├── FileMappingAccessRule.cs │ │ │ ├── FileMappingAuditRule.cs │ │ │ ├── FileMappingRights.cs │ │ │ ├── FileMappingSecurity.cs │ │ │ ├── FileRights.cs │ │ │ ├── FileSecurity.cs │ │ │ ├── GenericMapping.cs │ │ │ ├── JobObjectAccessRule.cs │ │ │ ├── JobObjectAuditRule.cs │ │ │ ├── JobObjectRights.cs │ │ │ ├── JobObjectSecurity.cs │ │ │ ├── PipeAccessRule.cs │ │ │ ├── PipeAuditRule.cs │ │ │ ├── PipeRights.cs │ │ │ ├── PipeSecurity.cs │ │ │ ├── PrinterAccessRule.cs │ │ │ ├── PrinterAuditRule.cs │ │ │ ├── PrinterRights.cs │ │ │ ├── PrinterSecurity.cs │ │ │ ├── ProcessAccessRule.cs │ │ │ ├── ProcessAuditRule.cs │ │ │ ├── ProcessRights.cs │ │ │ ├── ProcessSecurity.cs │ │ │ ├── RegistryKeyAccessRule.cs │ │ │ ├── RegistryKeyAuditRule.cs │ │ │ ├── RegistryKeyRights.cs │ │ │ ├── RegistryKeySecurity.cs │ │ │ ├── ServiceAccessRule.cs │ │ │ ├── ServiceAuditRule.cs │ │ │ ├── ServiceRights.cs │ │ │ ├── ServiceSecurity.cs │ │ │ ├── ShareAccessRule.cs │ │ │ ├── ShareAuditRule.cs │ │ │ ├── ShareRights.cs │ │ │ ├── ShareSecurity.cs │ │ │ ├── StandardRights.cs │ │ │ ├── ThreadAccessRule.cs │ │ │ ├── ThreadAuditRule.cs │ │ │ ├── ThreadRights.cs │ │ │ ├── ThreadSecurity.cs │ │ │ ├── TokenAccessRule.cs │ │ │ ├── TokenAuditRule.cs │ │ │ ├── TokenRights.cs │ │ │ ├── TokenSecurity.cs │ │ │ ├── WaitObjectAccessRule.cs │ │ │ ├── WaitObjectAuditRule.cs │ │ │ ├── WaitObjectRights.cs │ │ │ ├── WaitObjectSecurity.cs │ │ │ ├── WindowStationAccessRule.cs │ │ │ ├── WindowStationAuditRule.cs │ │ │ ├── WindowStationRights.cs │ │ │ └── WindowStationSecurity.cs │ │ ├── AsproLock.csproj │ │ ├── AssemblyInfo.cs │ │ └── Win32/ │ │ ├── GenericSafeHandle.cs │ │ ├── NativeConstants.cs │ │ └── NativeMethods.cs │ └── AsproLock.sln └── Tools/ ├── API Monitor.url └── ApiMonitorApiFilters.xml ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: NikolayIT # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] ================================================ FILE: .gitignore ================================================ # Build Folders (you can keep bin if you'd like, to store dlls and pdbs) [Bb]in/ [Oo]bj/ # mstest test results TestResults/ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. # User-specific files *.suo *.user *.sln.docstates # Build results [Dd]ebug/ [Rr]elease/ x64/ *_i.c *_p.c *.ilk *.meta *.obj *.pch *.pdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.log *.vspscc *.vssscc .builds # Visual C++ cache files ipch/ *.aps *.ncb *.opensdf *.sdf # Visual Studio profiler *.psess *.vsp *.vspx # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper* # NCrunch *.ncrunch* .*crunch*.local.xml # Installshield output folder [Ee]xpress # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish # Publish Web Output *.Publish.xml # NuGet Packages Directory packages # Windows Azure Build Output csx *.build.csdef # Windows Store app package directory AppPackages/ # Others [Bb]in [Oo]bj sql TestResults/ [Tt]est[Rr]esult*/ *.Cache ClientBin [Ss]tyle[Cc]op.* ~$* *.dbmdl Generated_Code #added for RIA/Silverlight projects # Backup & report files from converting an old project file to a newer # Visual Studio version. Backup files are not needed, because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML # TFS $tf/ # Installation guide /Documentation/Installation/Installation Guide for Open Judge System.docx # JustMock configuration files /Open Judge System/*.jmconfig #Visual studio config folder .vs/ ================================================ FILE: Documentation/Development/How to add new administration.txt ================================================ Adding new Administration 1. Go to Areas -> Administration -> Controller and create a controller for the new administration (Example: "ContestsController") 2. Remove default usings and add these to your new controller: using System.Collections; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using OJS.Data; using OJS.Web.Controllers; 3. Enter the model you would like to use for your controller with this line: using ModelType = OJS.Data.Models.{model}; For example if you want to add model for contests -> you enter: using ModelType = OJS.Data.Models.Contest; 4. Your new controller should inherit "KendoGridAdministrationController" class instead of the default "Controller" class. 5. Copy the following code to enable CRUD derivered from the base class. Make sure you fill the constructor with its proper name and override the correct data in GetData() method public {name}Controller(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.{model}.All().Where(x => !x.IsDeleted); } public ActionResult Index() { return View(); } [HttpPost] public ActionResult Create([DataSourceRequest]DataSourceRequest request, ModelType model) { return this.BaseCreate(request, model); } [HttpPost] public ActionResult Update([DataSourceRequest]DataSourceRequest request, ModelType model) { return this.BaseUpdate(request, model); } [HttpPost] public ActionResult Destroy([DataSourceRequest]DataSourceRequest request, ModelType model) { return this.BaseDestroy(request, model); } 6. Your controller is now ready but it needs a view for rendering on browser. Go to Areas -> Administration -> Views and add folder named after your controller. For example "Contests". 7. Add a new Empty View, name it Index and select a proper model for it. For example "OJS.Data.Models.Contest". Use empty layout. Now your web application should be able to render the default view for this controller. 8. Remove everything from the view and copy the following text which will render the Kendo UI Grid view (make sure you put correct names and options for columns). You can remove the commented part about the Groupable option if you need: @model OJS.Data.Models.{model} @{ ViewBag.Title = "{name}"; const string ControllerName = "{controller}"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(x => x.Id); columns.Bound(x => x.Title); columns.Bound(x => x.IsVisible); columns.Bound(x => x.CreatedOn).Format("{0:dd/MM/yyyy HH:mm}"); columns.Bound(x => x.ModifiedOn).Format("{0:dd/MM/yyyy HH:mm}"); columns.Command(command => command.Edit().Text(" ").UpdateText("Промяна").CancelText("Отказ")).Width(80); columns.Command(command => command.Destroy().Text(" ")).Width(80); }) .ToolBar(toolbar => { toolbar.Create().Text("Създай"); toolbar.Custom().Text("Обратно към администрацията").Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text("Export To Excel").Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", "News", new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); editable.DisplayDeleteConfirmation("Наистина ли искате да изтриете елемента"); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) /*.Groupable(x => { x.Enabled(true); x.Messages(m => m.Empty("Хванете заглавието на колона и го преместете тук, за да групирате по тази колона.")); })*/ .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(false) .Model(model => model.Id(x => x.Id)) .Sort(sort => sort.Add(x => x.CreatedOn).Descending()) .Create(create => create.Action("Create", ControllerName)) .Read(read => read.Action("Read", ControllerName)) .Update(update => update.Action("Update", ControllerName)) .Destroy(destroy => destroy.Action("Destroy", ControllerName)) ) ) 9. Go to the model and add needed attributes - DisplayName, Error Messages, Editable, etc. 10. Your administration should be ready for use on {site}/Administration/{controller} ================================================ FILE: Documentation/HISTORY.txt ================================================ 1721 | Vasil Dininski | 19.11.2013 | Updated the user registration - usernames must have at least one character now. Removed unnecessary message in the forgotter password page. 1720 | Vasil Dininski | 19.11.2013 | Added the appropriate GetById method in the UsersRepository. Added UserProfileViewModel and now using it instead of the database model. Added the option for a user to change his email address. Added default password editor template. Added necessary localization for the change password functionality. 1719 | Nikolay Kostov | 19.11.2013 | StyleCop violations fixed 1718 | Nikolay Kostov | 19.11.2013 | Fixed StyleCop violoations in the projects located in the /Tools/ folder and OJS.Data.Models 1717 | Nikolay Kostov | 19.11.2013 | Fixed StyleCop violation in OJS.Data project 1716 | Nikolay Kostov | 19.11.2013 | Uploaded workers changes to the old Telerik Contest System (new executor integrated into the old system) 1715 | Nikolay Kostov | 19.11.2013 | Improvements in the old systems workers 1714 | Vasil Dininski | 19.11.2013 | Fixed a bug where a user can register using an existing email or username when logging in using an external login provider. 1713 | Nikolay Kostov | 18.11.2013 | Administration area and links are now limited for administrators only 1712 | Nikolay Kostov | 18.11.2013 | Version deployed 1711 | Nikolay Kostov | 18.11.2013 | StyleCop suggestions fixed in OJS.Web 1710 | Nikolay Kostov | 18.11.2013 | Implemented viewing details for submission Fixed bug with submission log (showing trial tests in the short report) 1709 | Vasil Dininski | 18.11.2013 | Updated submissions partial view to correctly display the memory and time maximums when the submission was not correctly compiled. 1708 | Vasil Dininski | 18.11.2013 | Added confirmation message in the Forgotten password page. Updated layout for submission page - now hiding the problem results for the current problem on lower resolutions. 1707 | Ivaylo Kenov | 18.11.2013 | Submission Administration read method Repository for SubmissionType 1706 | Nikolay Kostov | 18.11.2013 | Only users with submissions are copied to the new database Some work on submissions details 1705 | Vasil Dininski | 18.11.2013 | Updated viewmodels to use the Compare attribute from System.Web.Mvc which is working, as the one in System.ComponentModel.DataAnnotations is not working correctly. 1704 | Vasil Dininski | 18.11.2013 | View submission in the submissions page now opens a new window to a separate page which displays only the selected submission details. 1703 | Vasil Dininski | 18.11.2013 | Updated and localized the forgot your password email. 1702 | Nikolay Kostov | 18.11.2013 | Small refactoring in MailSender.cs Fixes in .gitignore 1700 | Vasil Dininski | 18.11.2013 | Updated the Forgot your password feature to send a localized email to the user that requested the email for the forgotten pasword. 1699 | Nikolay Kostov | 18.11.2013 | Included Kendo.Mvc readme file Changes in .gitignore file 1698 | Asya Georgieva | 18.11.2013 | Updated check for submission size limit in the Compete controller. 1696 | Ivaylo Kenov | 18.11.2013 | Users administration Administration EditorTemplates do not show CreatedOn, ModifiedOn and Id anymore 1694 | Vasil Dininski | 18.11.2013 | Fixed a bug where the forgot your password form displays an incorrect validation message if the email field is left blank. 1693 | Vasil Dininski | 18.11.2013 | Updated IExecutor interface to include passing execution parameters (null by default). Updated RestrictedProcessExecutor to close the input stream when the restricted process is disposed. Fixed a bug where the submission job would try to run tests for a submission that was not correctly compiled. Implemented the NodeJsPreprocessExecuteAndCheckExecutionStrategy. 1692 | Vasil Dininski | 18.11.2013 | Updated submissions page so that the symbols "<" and ">" can be submitted as a part of the solution. Fixed a bug where the submission partial view was incorrectly displaying if the submission was correctly compiled or not yet processed. 1691 | Ivaylo Kenov | 17.11.2013 | User administraion without Delete 1690 | Ivaylo Kenov | 17.11.2013 | StyleCop on Administration area 1689 | Ivaylo Kenov | 17.11.2013 | In Settings administration value is now multiline text 1688 | Ivaylo Kenov | 17.11.2013 | ProblemResourceType moved to OJS.Common because of view annotatons needed and used by the web application Settings administration ViewModels moved into separate folders for Administration 1687 | Nikolay Kostov | 17.11.2013 | Updated Microsoft.Owin* packages to the latest versions (2.0.1) 1686 | Nikolay Kostov | 17.11.2013 | Added submissions controller in contests area External login with Google now works as expected and gets the users email 1685 | Ivaylo Kenov | 17.11.2013 | Feedback administration now works with view model 1683 | Nikolay Kostov | 15.11.2013 | Version deployed 1682 | Ivaylo Kenov | 15.11.2013 | Fixed bug in export to Excel function and removed not needed properties from models to be exported 1681 | Nikolay Kostov | 15.11.2013 | Updated Glimpse packages to the latest version 1680 | Nikolay Kostov | 15.11.2013 | Version deployed 1679 | Ivaylo Kenov | 15.11.2013 | Contest administration implemented to use ViewModel instead of model Editor templates for administration Contest model does not have view annotations any more AdministrationViewModel for CreatedOn and ModifiedOn 1675 | Nikolay Kostov | 15.11.2013 | Fixed SubmissionCopier.cs file encoding 1674 | Nikolay Kostov | 15.11.2013 | TestSubmissionResponder project deleted. The LocalWorker service is doing the same job. 1673 | Nikolay Kostov | 15.11.2013 | Implemented MailSender Added OJS.Tools.SendMailToAllUsers project 1672 | Nikolay Kostov | 15.11.2013 | Small changes in the data migration Version deployed 1671 | Nikolay Kostov | 14.11.2013 | Small improvements in the data migration code 1670 | Nikolay Kostov | 14.11.2013 | Fixed bug with one thread working with the same submission multiple times because of reusing the DbContext Added batch files for the LocalWorker service 1669 | Nikolay Kostov | 14.11.2013 | Fixed bug with the used time in the submissions migration 1668 | Nikolay Kostov | 14.11.2013 | Implemented SunchronizedHashtable Using SunchronizedHashtable in SubmissionJob to prevent executing the same submission multiple times 166 | Nikolay Kostov | 14.11.2013 | Almost done implementing LocalWorkerService Added TestRunsRepository with delete test runs for submission Added method in submissions repository for getting latest non-processed submission Added two new properties in Submissions model: Processing and ProcessingComment Fixes in compilation information in CompileExecuteAndCheckStrategy 1666 | Vasil Dininski | 14.11.2013 | Added captcha to registration page. Added localized notifications for the captcha. 1665 | Nikolay Kostov | 14.11.2013 | IsCompiledSuccessfully is set to true when compilation is successfull in CompileExecuteAndCheckExecutionStrategy 1664 | Vasil Dininski | 14.11.2013 | Updated location and validation messages for the accounts controller and its actions. Added title text for the glyph icons in the contests list. 1662 | Ivaylo Kenov | 14.11.2013 | ContestCategory administration now uses ViewModel Editor template for OrderBy 1661 | Ivaylo Kenov | 14.11.2013 | News administration now uses nice editor template and view model 1660 | Vasil Dininski | 14.11.2013 | Updated the submission result viewmodel to read the result from the database. Added a check if the code has been compiled successfully. Added a check if the submitted code is within the allowed the code length in the submission page. 1659 | Nikolay Kostov | 13.11.2013 | Renamed SubmissionsExecutorResult to ExecutionResult 1658 | Nikolay Kostov | 13.11.2013 | Skeleton for the NodeJsPreprocessExecuteAndCheckExecutionStrategy 1657 | Nikolay Kostov | 13.11.2013 | Added OldDatabaseMigrationExecutor console project Instantiating checkers fixes Compilers output redirection fixed TestSubmissionResponder should be working correctly now 1656 | Vasil Dininski | 13.11.2013 | Updated the width of the login and register forms. 1655 | Vasil Dininski | 13.11.2013 | Changed default colors in the user Settings view to a be more consistent with the general UI. Fixed a bug where deleted resources could be downloaded. 1654 | Vasil Dininski | 13.11.2013 | Moved the view solution button in the Submissions page to the right for better UI experience. 1653 | Vasil Dininski | 13.11.2013 | Fixed a bug where deleted resources are accessible in the submission page. Fixed a bug where if you change a resource type it is incorrectly displayed on the submission page. 1652 | Nikolay Kostov | 13.11.2013 | Fixes in TestSubmissionResponder Tests copier items per iteration changed to 2 to prevent out of memory exception 1651 | Nikolay Kostov | 13.11.2013 | Runtime exception introduced in the previous changeset fixed. 1650 | Nikolay Kostov | 13.11.2013 | Implemented real TestSubmissionResponder (not tested yet) Model changes (Memory limit from long to int, new field Processed in Submissions) Some refactorings 1649 | Nikolay Kostov | 13.11.2013 | Refactored the execution strategies 1648 | Nikolay Kostov | 13.11.2013 | Removed useless files Implemented get checker method in CompileExecuteAndCheckExecutionStrategy 1647 | Nikolay Kostov | 13.11.2013 | Created CompileExecuteAndCheck strategy. Removed javascript from CompilerTypes enumeration. Moved TestRunResultType to OJS.Common.Models. Updated ExecutionStrategyType enumeration to include NodeJsPreprocess strategy. Added TestRunResultType enumeration. 1646 | Nikolay Kostov | 13.11.2013 | Updated Kendo UI MVC wrappers libraries to version 2013.2.1111.340 1645 | Vasil Dininski | 13.11.2013 | Updated ZippedTestsParser and the mock submission responder to better follow the StyleCop rules. 1644 | Vasil Dininski | 13.11.2013 | Updated Tests, News and Submissions controllers, and Test view model to better follow the StyleCop rules. 1643 | Vasil Dininski | 13.11.2013 | Updated AjaxOperation, DeleteAction, ExportAction, LasterNews and DetailsAction test classes, the Controller Service, the Resources, Account and Compete controllers, the AllNews and FeedbackReport view models to better adhere to StyleCop rules. 1642 | Vasil Dininski | 13.11.2013 | Updated contests, feedback and problems controller to adhere to StyleCop rules. 1641 | Ivaylo Kenov | 13.11.2013 | Administration news view model Layout menu for administration 1640 | Vasil Dininski | 13.11.2013 | Updated registration view model to correctly restrict the minimum and maximum username length. 1639 | Vasil Dininski | 13.11.2013 | Updated the submission content action tests to correctly create a new user with an email address. Updated the Registration view model to check for the username length. Updated CreateActionTests to adhere to StyleCop rules. 1638 | Vasil Dininski | 13.11.2013 | Added _ViewStart.html 1637 | Nikolay Kostov | 13.11.2013 | Updated .tfignore to exclude __.git folder 1636 | Ivaylo Kenov | 13.11.2013 | All econdings converted to UTF-8 1635 | Vasil Dininski | 13.11.2013 | Updated the layout for the contest listing by submission type. Partially implemented the "Forgot your password" functionality and localized the messages. Added a Singleton MailSender for sending emails, but it is not implemented yet. 1634 | Nikolay Kostov | 12.11.2013 | Work on LocalWorker service Moved ToSecureString to StringExtensions 1632 | Nikolay Kostov | 12.11.2013 | Renamed TOJS to OJS in all services and service installers Initial code for the local submissions execution worker 1631 | Nikolay Kostov | 12.11.2013 | Proof of concept for javascript code execution in nodejs using restricted process Restricted process now supports command line arguments for the executables Fixed parsing exception in the submissions copier 1628 | Ivaylo Kenov | 12.11.2013 | NewsViewModel for administration All administrations now allow big file uploads (around 60 mb) 1626 | Vasil Dininski | 12.11.2013 | Fixed bug with partial view, where exception is thrown when trying to access the partial view _ExternalLoginsListPartial. 1625 | Ivaylo Kenov | 11.11.2013 | Fixed wrong redirrection in tasks and tests administration when administrator submits wrong information 1624 | Ivaylo Kenov | 11.11.2013 | News administration now has option do fetch news from Infos and Infoman 1623 | Nikolay Kostov | 11.11.2013 | Fixed null reference exception in the submissions copier 1622 | Ivaylo Kenov | 11.11.2013 | Submissions UI enhanced to show Compilation error. Log link on main menu 1621 | Nikolay Kostov | 11.11.2013 | Fixed GetStringBetween bug with multiline text 1620 | Ivaylo Kenov | 11.11.2013 | Home page news now shows 4 news instead of three 1618 | Nikolay Kostov | 11.11.2013 | Created OJS.Workers.LocalWorker service for evaluating submissions 1617 | Vasil Dininski | 11.11.2013 | Added localization for the Accounts controller. 1616 | Ivaylo Kenov | 11.11.2013 | Large (up to 60 mb) file uploads enabled for Tests administration. After 60 mb out of memory exception is thrown 1615 | Ivaylo Kenov | 11.11.2013 | Fixed a bug when adding wrong resource redirrects to wrong address after clicking on back button 1604 | Nikolay Kostov | 7.11.2013 | Added bulgarian version of Account resource file 1603 | Ivaylo Kenov | 6.11.2013 | Edit problem resource type now is selected in the update page 1602 | Vasil Dininski | 6.11.2013 | Updated bootstrap for user settings so that the elements don't get displaced on lower resolutions/certain devices. 1601 | Vasil Dininski | 6.11.2013 | Updated _ProfileInfo partial view to Bootstrap 3 1600 | Vasil Dininski | 6.11.2013 | Added reCaptcha mvc helpers to the project. Added reCaptcha when submitting feedback. 1599 | Nikolay Kostov | 6.11.2013 | Removed useless file EntityFramework.dll 1598 | Vasil Dininski | 6.11.2013 | Updated formatting of the Date of Birth label in the user settings page to match the formatting of the other elements. 1597 | Ivaylo Kenov | 6.11.2013 | Fixed update resource bug requiring to upload again file when not needed Downloading resourse name now contains problem name 1596 | Vasil Dininski | 6.11.2013 | Fixed bug where the link for changing the password in the user settings page was not redirecting to the correct page. 1595 | Vasil Dininski | 6.11.2013 | Added mandatory email field to user registration. 1592 | Vasil Dininski | 6.11.2013 | Updated submissions page - to remove incorrect behavior by the kendo grid with different resolutions. 1588 | Vasil Dininski | 6.11.2013 | Added a caching field in the Submissions model to hold the submission points. Updated and optimized the contest results page. Updated the TestSubmissionResponder to populate the submission points field. 1587 | Vasil Dininski | 5.11.2013 | Updated the dummy submissions responder. Not dummy test run generation is done in increments. 1585 | Nikolay Kostov | 4.11.2013 | Installed SQL tab for Glimpse 1581 | Ivaylo Kenov | 4.11.2013 | Fixed tests administration not showing tests in correct order - execution order 1578 | Nikolay Kostov | 4.11.2013 | Added two more tests for the string extension method GetStringBetween Improvements in the submissions copier Updated "Microsoft.AspNet.Web.Optimization" to latest version 1.1.2 1575 | Ivaylo Kenov | 4.11.2013 | Fixed submission page styling when user is logged in 1573 | Ivaylo Kenov | 4.11.2013 | Fixed submission page sorting when user is not logged in 1572 | Ivaylo Kenov | 4.11.2013 | Fixed hardcoded maximum point in SubmissionViewModel to be generic determined by problem options 1571 | Ivaylo Kenov | 4.11.2013 | Fixed bug when not showing results if TestResults are zero 1568 | Nikolay Kostov | 2.11.2013 | Fixed broken build because of missing glimpse configuration file 1567 | Nikolay Kostov | 2.11.2013 | Added AUTHORS and LICENSE files Removed repositories.config file from the old solution folder 1566 | Nikolay Kostov | 2.11.2013 | Improvements in test runs parsing Updated Glimpse packages to the latest versions Added README file 1562 | Nikolay Kostov | 1.11.2013 | Removed "Telerik." from assembly titles Fixed 2 broken unit tests because of the renamings 1561 | Nikolay Kostov | 1.11.2013 | Fixed project references after renaming 1560 | Nikolay Kostov | 1.11.2013 | Removed "Telerik." from folder names Removed Kendo.Mvc source and replaced with binaries 1559 | Nikolay Kostov | 1.11.2013 | Updated .gitignore 1558 | Nikolay Kostov | 1.11.2013 | Renamed project folder to "Open Judge System" 1557 | Nikolay Kostov | 1.11.2013 | Added two extension methods for string (GetStringsBetween and GetStringBetween) Improvements in submissions parsing 1556 | Ivaylo Kenov | 1.11.2013 | Telerik namespace removed from DefaultMigrationConfiguration TestsController fully tested 1554 | Vasil Dininski | 1.11.2013 | Updated assembly names and default namespaces in .csproj files. 1553 | Vasil Dininski | 1.11.2013 | Updated default migration configuration namespaces. 1552 | Vasil Dininski | 1.11.2013 | Updated namespaces for the entire project. Updated routes, views and kendo widgets to use the new namespaces correctly. 1551 | Vasil Dininski | 1.11.2013 | Moved displaying contests by submission type to the ListController. Updated the route to display a nice url, including the name submission type. Fixed bug on the main page where the remaining hours for a contest were not displayed at all. Updated the main page layout - when there are more than three contests available now only lists the contests, without additional details. 1549 | Ivaylo Kenov | 1.11.2013 | Unit tests for Import action in TestsController 1547 | Nikolay Kostov | 31.10.2013 | Fixed OutOfMemoryException when copying submissions from the old database to the new one. 1544 | Vasil Dininski | 31.10.2013 | Updated the submission validation in the submission page. 1539 | Vasil Dininski | 30.10.2013 | Refactored the contests submission page and the results page - extracted the styles and most of the javascript logic in separate files. Created a new style bundle for the submission page. 1535 | Vasil Dininski | 30.10.2013 | Added contests results page. Added units tests for the Details Action of the Contests controller. 1534 | Ivaylo Kenov | 30.10.2013 | Fixed bug with adding invalid zip file by catching base Exception class 1533 | Ivaylo Kenov | 30.10.2013 | Ajax operations tests for TestsController Small refactoring for better high quality code in TestsController and tests-index.js 1529 | Nikolay Kostov | 29.10.2013 | Renamed "Telerik.OJS.Tools.OldDatabaseMigration" to "OJS.Tools.OldDatabaseMigration" Improvements in submissions copier 1527 | Ivaylo Kenov | 29.10.2013 | Refactored TestsController to work with default model binder for int and not parse it from string 1526 | Ivaylo Kenov | 29.10.2013 | Ajax operations tests for TestsController Small refactors 1523 | Nikolay Kostov | 29.10.2013 | Submissions data migration improved Fixed out of memory problems with tests migration Improved the order of the data records in some of the migrations 1520 | Vasil Dininski | 28.10.2013 | Updated contest details so that an exception will be thrown when an invalid contest id is provided. Fixed a bug where incorrect results were displayed in the problem results grid. Updated Kendo grid template on the submissions page. 1519 | Vasil Dininski | 28.10.2013 | Updated the submission page layout to better show the user results. 1518 | Ivaylo Kenov | 28.10.2013 | Details action tests for TestsController 1517 | Ivaylo Kenov | 28.10.2013 | Delete action tests for TestsController TestsController refactor for better high quality code 1516 | Vasil Dininski | 28.10.2013 | Updated the contest details page layout. 1515 | Nikolay Kostov | 28.10.2013 | Added new table Settings (name-value pair for runtime settings) 1512 | Vasil Dininski | 28.10.2013 | Minor update of the main submission page. 1511 | Vasil Dininski | 28.10.2013 | Added a countdown timer to the submissions page. Updated the details view when opening checking a submission details in the submissions page. Updated EF references to the test submission responder. 1506 | Vasil Dininski | 25.10.2013 | Updated submission page error handling. Updated contest description page. 1499 | Nikolay Kostov | 25.10.2013 | Renamed "Telerik.OJS.Common" to "OJS.Common" 1498 | Nikolay Kostov | 25.10.2013 | Moved TestSubmissionResponder to /Tools/ Deleted old CheatProgram 1496 | Vasil Dininski | 25.10.2013 | Added submission model validation. Updated the Submit action in the Compete controller to throw an exception when an invalid submission is made. Renamed the Compete controller unit tests. Added unit tests for the ReadSubmissionResults and GetSubmissionContent actions. 1483 | Nikolay Kostov | 24.10.2013 | Installed Glimpse.Mvc4 Updated Ninject 1481 | Vasil Dininski | 23.10.2013 | Started unit tests for the Submit action in the Compete controller. Updated the compete controller to check if the contest can be practiced or competed before processing a submission. 1480 | Nikolay Kostov | 23.10.2013 | Project renamed from "Telerik Online Judge System" to "Open Judge System" 1477 | Nikolay Kostov | 22.10.2013 | Refactored AccountController Added resource file for AccountController and moved a string to it. 1471 | Vasil Dininski | 21.10.2013 | Added more unit tests for the DownloadResource action in the Compete controller. Updated CompeteControllerBaseTestsClass. 1470 | Nikolay Kostov | 21.10.2013 | Updated to the latest version of the ASP.NET Identity system (1.0.0). Fixed all issues with the new Identity system. Updated all NuGet packages Removed redundant class OjsIdentityStoreContext 1467 | Nikolay Kostov | 21.10.2013 | Updated "Microsoft.jQuery.Unobtrusive.Ajax" to version 3.0.0 Updated "Microsoft.jQuery.Unobtrusive.Validation" to version 3.0.0 Updated "Microsoft.Owin" to version 2.0.0 Updated "Microsoft.Owin.*" to version 2.0.0 1466 | Vasil Dininski | 21.10.2013 | Added ValidateContest unit tests. Started DownloadResource action unit tests. Updated ContestProblemViewModel. 1465 | Nikolay Kostov | 21.10.2013 | Updated "Microsoft.AspNet.Mvc" to version 5.0.0 Updated "Microsoft.AspNet.Razor" to version 3.0.0 Updated "Microsoft.AspNet.WebPages" to version 3.0.0 1460 | Vasil Dininski | 21.10.2013 | Added a SubmissionTypeViewModel. Now displaying the allowed submission types in the contest details page. 1459 | Vasil Dininski | 21.10.2013 | Added more unit tests for the Problem action. Added unit test for the GetAllowedSubmissionTypes action. Updated the Compete controller to redirect to the registration page, when a user tries to download a problem for a contest that he is not registered for. Updated the namespace for the Compete controller tests. 1456 | Vasil Dininski | 18.10.2013 | Updated Compete controller unit tests. Added unit tests for the Problem action. Refactored and updated the Problem action in the Compete controller. 1454 | Vasil Dininski | 18.10.2013 | Updated unit tests for Index action in Compete controller. 1453 | Nikolay Kostov | 17.10.2013 | Added missing packages file for Telerik.OJS.Workers.Executors 1452 | Nikolay Kostov | 17.10.2013 | Updated "EntityFramework" to version 6.0.1 Updated "EntityFramework.SqlServerCompact" to version 6.0.1 Updated "Moq" to version 4.1.1309.1617 1451 | Nikolay Kostov | 17.10.2013 | Updated "Newtonsoft.Json" to version 5.0.8 Updated "log4net" to version 2.0.2 1450 | Nikolay Kostov | 17.10.2013 | Work on Controller-Agent communication 1448 | Vasil Dininski | 17.10.2013 | Updated unit tests for the Compete controller. Added an additional modelstate check in the Register action of the Compete controller. 1443 | Nikolay Kostov | 17.10.2013 | Custom error page is now working for any kind of exceptions that are thrown in actions Small refactorings in web unit tests 1442 | Vasil Dininski | 17.10.2013 | Added Register POST action unit tests. Updated the ContestRegistrationViewModel to check if the provided value is null. Updated the ContestRegistrationModel to instantiate the questions in the constructor. Added an error message to the ContestQuestionAnswerModel. Refactored error and exception handling in the Compete Controller. 1441 | Ivaylo Kenov | 17.10.2013 | Base class for Web tests - validation for ModelState 1440 | Ivaylo Kenov | 17.10.2013 | Edit action unit tests implemented for TestsController 1439 | Ivaylo Kenov | 16.10.2013 | Create tests action in TestsController unit tests written 1434 | Ivaylo Kenov | 16.10.2013 | Resource delete action implemented. Resources CRUD operations now ready 1433 | Vasil Dininski | 16.10.2013 | Added Registration action unit tests for the Compete controller. Refactored CompeteControllerBaseTestsClass. Removed unused usings is CompeteController. 1432 | Ivaylo Kenov | 16.10.2013 | Edit scripts tranfered to separate file 1431 | Ivaylo Kenov | 16.10.2013 | Edit command implemented for problem resources 1429 | Ivaylo Kenov | 16.10.2013 | On create the page returns back to the corresponding expanded resource row 1427 | Ivaylo Kenov | 16.10.2013 | Resources Create page implemented 1426 | Vasil Dininski | 16.10.2013 | Updated and refactored the unit tests for the Index action in the Compete controller. 1423 | Vasil Dininski | 16.10.2013 | Updated the Index action unit tests for the Compete controller and added more test cases. Minor refactoring of the Index action in the Compete controller to take advantage of the contest extension method ShouldShowRegistrationForm. 1421 | Vasil Dininski | 16.10.2013 | Added unit tests for the Index action in the Compete controller 1418 | Vasil Dininski | 15.10.2013 | Chained constructors in Participant model. Added Compete Controller base test class. Started unit testing the Compete controller. 1416 | Vasil Dininski | 15.10.2013 | Updated check in contest registration page - added checks whether the contest has any questions, has a contest password and can be competed or has a practice password and can be practiced and handles participant registration. Updated TestsController to adhere to StyleCop rules. 1412 | Vasil Dininski | 15.10.2013 | Added editor template for the EmailAddress data type. 1411 | Vasil Dininski | 15.10.2013 | Added validation for the email address on registration. Added a check in the compete contoller if an invalid problem id is provided. When displaying problems in the submissions page they are sorted alphabetically. 1410 | Nikolay Kostov | 15.10.2013 | Updated "Newtonsoft.Json" to version 5.0.7 and "Microsoft.AspNet.Web.Optimization" to version 1.1.1 1409 | Ivaylo Kenov | 14.10.2013 | Resource Repository StreamExtensions for converting from byte array to MemoryStream and backwards Problem Resources now as detail template grid in Problems administration. Only read method implemented currently. JS files now have the controller as prefix in their name because otherwise VS crashes if two files has the same name. 1406 | Nikolay Kostov | 14.10.2013 | Added constructor for CompeteController and BaseController for the UserProfile to be replacable during testing 1400 | Vasil Dininski | 14.10.2013 | Added additional comments for the Compete controller. 1399 | Ivaylo Kenov | 14.10.2013 | Changed Edit template to use the Create one. Fixed a bug with editing task about fetching all checkers for Kendo Dropdown. 1398 | Vasil Dininski | 14.10.2013 | Added scores to the submission page, updated code formatting in feedback controller tests and home controller tests to pass stylecop check. 1397 | Ivaylo Kenov | 14.10.2013 | Creating tasks implemented with validation 1396 | Ivaylo Kenov | 13.10.2013 | StreamExtension ToByteArray added for easier resource addition Create problem resources adding implemented 1395 | Nikolay Kostov | 11.10.2013 | Work on controller-agent communicaton 1393 | Ivaylo Kenov | 11.10.2013 | Small refactoring in Administration/Tests/index.js for better high quality code Create operation for Problem in ProblemsController implemented 1392 | Ivaylo Kenov | 11.10.2013 | ZippedTestsParser is now called ZippedTestsManipulator since it can add tests to problem, not only parse them from zip file 1391 | Ivaylo Kenov | 11.10.2013 | Test importing from Zip file extracted from TestsController to separate project Telerik.OJS.Common under namespace ZippedTestsParser 1390 | Ivaylo Kenov | 11.10.2013 | Moved all extension classes from Telerik.OJS.Common to a folder and namespace Telerik.OJS.Common.Extensions 1388 | Ivaylo Kenov | 11.10.2013 | Added to model ProblemResource property Link - if type is video it should not have file Create task front end form is ready, server side needs more work 1385 | Vasil Dininski | 11.10.2013 | Added a navigational property from a Problem to Submissions and a not-mapped property to the Submissions model, that returns the number of correct test runs for a submission. Updated the submission page to include the best results for the current problem so far and added navigation to the problem description. Updated the contest details view to be more used friendly and to correctly navigate to the contest registration. 1379 | Ivaylo Kenov | 10.10.2013 | Description attribute for enum and extension method for friendly text visualization. Resources now can be added dynamically in Create task form, still no server logic implemented for them. Small css adjacements for task creation form. 1378 | Vasil Dininski | 10.10.2013 | Updated ContestViewModel to include all necessary properties, minor code refactoring to adhere to StyleCop rules. 1375 | Nikolay Kostov | 10.10.2013 | Fixed exception with the controller configuration file Classes that are used for communication between controller and agents are marked as serializable Changed the name of the controller log file to be more descriptive Fixed compilation warning 1374 | Nikolay Kostov | 10.10.2013 | Added batch files for installing the controller service 1373 | Nikolay Kostov | 10.10.2013 | Fixed installing services not working by making service installers public classes with [RunInstaller] attribute 1372 | Vasil Dininski | 10.10.2013 | Updated contest details page to include the ability to practice or compete in contest if it can be practiced/competed 1370 | Vasil Dininski | 10.10.2013 | Added contest details and the ability to download the contest materials if the contest can be practiced and has no password 1369 | Nikolay Kostov | 10.10.2013 | Added bat files to install the agent service 1367 | Ivaylo Kenov | 10.10.2013 | Problem Administration QuickBar for easy contest selection Tests for ProblemsController (not completed) Create task form - ready without resource adding and tests 1365 | Vasil Dininski | 10.10.2013 | Added 'Description' field to the Contest model and ViewModel 1362 | Nikolay Kostov | 10.10.2013 | Fixed exceptions when starting service 1354 | Vasil Dininski | 9.10.2013 | Added server side and client side validation whether the submission was sent too soon. 1352 | Vasil Dininski | 9.10.2013 | Added security checks when downloading problem resources, updated displaying of results. 1350 | Vasil Dininski | 8.10.2013 | Updated submissions page 1345 | Nikolay Kostov | 8.10.2013 | Added unit tests for string.MaxLength extension method 1337 | Nikolay Kostov | 5.10.2013 | Old database migration performance improved. 1336 | Vasil Dininski | 4.10.2013 | Updated submission page to include submission test results. 1335 | Vasil Dininski | 4.10.2013 | Added contest registration, started working on contest submissions page 1331 | Nikolay Kostov | 3.10.2013 | Work on agent service 1318 | Ivaylo Kenov | 29.9.2013 | Refactored TestsController to validate Anti-forgery token and ModelState 1303 | Nikolay Kostov | 26.9.2013 | Small changes in model 1300 | Vasil Dininski | 26.9.2013 | Updated invalid cyrillic text due to incorrect encoding. 1273 | Vasil Dininski | 25.9.2013 | Updated encodings and text in register, login and feedback views to display cyrillic text correctly. 1203 | Ivaylo Kenov | 17.9.2013 | Delete for problem/task Administration 1202 | Ivaylo Kenov | 17.9.2013 | Edit for tasks Administration 1201 | Ivaylo Kenov | 17.9.2013 | Delete all tasks from Contest Small bug fixing in Kendo Grid for tests and problems 1200 | Ivaylo Kenov | 17.9.2013 | Default Values added for DetailedProblemViewModel Navigation now has Tasks administration Small bugs fixed in Tests Administration views 1198 | Ivaylo Kenov | 17.9.2013 | Adding Problem through administration. Currently uploading of description resource and zip file with tests does not work. 1197 | Nikolay Kostov | 17.9.2013 | Some code refactoring in sandbox 1194 | Ivaylo Kenov | 17.9.2013 | Checker is DeletableEntity Repository for Checker 1193 | Ivaylo Kenov | 17.9.2013 | DetailedProblem View Model for more information on problems Controller for Problems DropDowns for Problem Selection by category and contest Web.Common library for common web logic 1181 | Nikolay Kostov | 16.9.2013 | Small code refactorings 1179 | Ivaylo Kenov | 16.9.2013 | Test runs on every Test detail is now shown as AJAX option on a Kendo Grid 1178 | Ivaylo Kenov | 16.9.2013 | Ajax jQuery bundle added Tests now have details in them with AJAX fetching of full data CRUD operations fixed Back button to redirrect to correct page 1171 | Ivaylo Kenov | 16.9.2013 | DeleteAll option for tests added. Now all problem tests can be deleted by clicking two buttons 1165 | Ivaylo Kenov | 15.9.2013 | Kendo AutoComplete Search implemented for tests editing 1163 | Ivaylo Kenov | 15.9.2013 | Administration navigation now has Test Files link Test files - dropdowns are easily populated by problemId 1161 | Ivaylo Kenov | 15.9.2013 | Administration/Tests/Problem/Id now populates the grid with the correct tests. This allows us when doing CRUD operations on tests to return to the correct problem without selecting it again. Populating drop-downs does not work correctly currently. 1152 | Ivaylo Kenov | 13.9.2013 | Fixed unit test for displaying latest news count. There was a change on the page - from 10 to 5. 1149 | Nikolay Kostov | 13.9.2013 | Updated Glimpse packages to latest version Updated Antlr to latest version 1142 | Nikolay Kostov | 12.9.2013 | Fixed process name property Small comment fixes 1068 | Ivaylo Kenov | 9.9.2013 | Refactored View for Selected news. Looks better now - latest news is in the right part of the page 1049 | Nikolay Kostov | 9.9.2013 | Fixed issue with running sandbox on 64-bit OS versions. This was caused by using short data type for some of the BasicLimitInfo properties instead of using int (uint) If something fails when starting restricted process we close the process 1043 | Nikolay Kostov | 8.9.2013 | Increased pipes buffer size to improve console IO operations performance with the price of additional memory 1042 | Nikolay Kostov | 8.9.2013 | RestrictedProcessExecutor: new time strategy: now we wait the process 1.5 time the time limit and then check consumed process time RestrictedProcessExecutor: Waiting for output and error tasks to complete Added log4net logging in RestrictedProcessExecutor 1041 | Nikolay Kostov | 7.9.2013 | Added PrivilegedProcessorTime and UserProcessorTime properties in ProcessExecutionResult Added realistic case: JustDoSomeCpuWork in sandbox target program Added SourceCodeSizeLimit in problems model Added latest version of PC2 binaries Added source and links to spoj0 judge system 1040 | Nikolay Kostov | 7.9.2013 | Proof of concept program now uses restricted process through RestrictedProcessExecutor facade Added debug assertion that the process we are executing is exited Web version deployed 1034 | Nikolay Kostov | 6.9.2013 | Fixed test fails because of System.AggregateException (System.Threading.Tasks.TaskCanceledException) 1032 | Nikolay Kostov | 6.9.2013 | Attempt to fix failing unit tests 1030 | Nikolay Kostov | 6.9.2013 | RestrictedProcessExecutor now returns memory limit when consumed memory is more than the memory limit (added unit test to validate this) JobObject limits are now twise as big as the process limit (just for additional protection) 1025 | Nikolay Kostov | 6.9.2013 | Memory consumption evaluation task now uses cancellation token and the task is waited 30ms before closed 1021 | Nikolay Kostov | 6.9.2013 | Reading standard output and error streams is now made asynchronously to prevent standard buffer of 4096 bytes for the output which introduces process block (https://github.com/NikolayIT/Telerik.OJS/issues/109) Added Gacutil program for registering assemblies in GAC In POC program reading standard output and error is now asynchonously Improvements in SandboxTargetProgram 1012 | Nikolay Kostov | 6.9.2013 | In old Telerik Contest System: Updated all projects to .NET 4.5 Updated EntityFramework to version 5.0 Added RestrictedProcessExecutor wapper for the future replacement of the current executor 1011 | Nikolay Kostov | 5.9.2013 | Moved "Similar sites.txt" file to "Other Judge System" folder 1010 | Nikolay Kostov | 5.9.2013 | Added PowerCollections binaries (both signed and not) as they are required for the system that will compile the C# code 1008 | Nikolay Kostov | 5.9.2013 | Migrated old Telerik Contest System solution to Visual Studio 2013 1007 | Nikolay Kostov | 5.9.2013 | Added old Telerik Contest System source code 1006 | Nikolay Kostov | 5.9.2013 | Added few of the old Telerik Contest System files 1005 | Nikolay Kostov | 5.9.2013 | Added other judge systems in documentation (PC2 and SMOC) 1003 | Nikolay Kostov | 5.9.2013 | Added folder for the source of the old version of bgcoder.com 992 | Nikolay Kostov | 5.9.2013 | Enabled Glimpse for the web project Glimpse now works with latest versions (RC) of EF and MVC 991 | Nikolay Kostov | 4.9.2013 | RestrictedProcess is now run as a detached process Updated Glimpse.EF6 to latest version 1.4.0 989 | Nikolay Kostov | 4.9.2013 | SandboxTarget now counts passed tests Win32 class and SafeNativeMethods class moved to NativeMethods class Implemented creating restricted token with safer* api calls SetTokenMandatoryLabel logic extracted in separate method 988 | Nikolay Kostov | 4.9.2013 | In compilers: Remove outputFile parameter and let implementations to return it as a part of CompileResult 987 | Nikolay Kostov | 4.9.2013 | Attempt to fix failed tests 986 | Nikolay Kostov | 4.9.2013 | Added IsGhostUser property in UserProfile model to indicate whether the user is from the old system and not confirmed new registration Small refactoring and improvements 976 | Nikolay Kostov | 3.9.2013 | Extracted AgentClient and ControllerServer classes 973 | Nikolay Kostov | 2.9.2013 | Added LimitBetweenSubmissions property in Contest model Work on skeleton of Controller and Agent services 972 | Nikolay Kostov | 2.9.2013 | Moved submission types list from problems to contests. Attempt to fix unit tests for sandbox functionality Fixed possible wrong values for memory consumpsion in RestrictedProcessExecutor class 969 | Nikolay Kostov | 2.9.2013 | Added problem resources (model and relations) Improved tasks copier to copy checkers information and problem descriptions Added GetFileExtension string extension method with corresponding tests 966 | Nikolay Kostov | 2.9.2013 | Attempt to fix 2 broken tests 965 | Nikolay Kostov | 2.9.2013 | DifferentUserProcessExecutor now measures used memory for the process Added unit tests for DifferentUserProcess and Restricted process to validate that they measure memory used correctly Improved wait times for memory usage measure in RestrictedProcess 964 | Nikolay Kostov | 2.9.2013 | Implemented PeakWorkingSetSize and PeakPagefileUsage information for the running restricted process Added name property for the process Fixed issues with early disposing process resources RestrictedProcessExecutor now sets MemoryUsed value in ProcessExecutionResult 963 | Ivaylo Kenov | 1.9.2013 | Fetching news frm Infos implemented 962 | Nikolay Kostov | 1.9.2013 | Attempt to find PeakMemoryUsed by a restricted process 961 | Ivaylo Kenov | 1.9.2013 | Test Administration refactored to use external JavaScript file 960 | Nikolay Kostov | 1.9.2013 | Made RestrictedProcess disposable (to close handles to process and main thread) 955 | Nikolay Kostov | 30.8.2013 | Updated version number in web footer Version deployed 953 | Ivaylo Kenov | 30.8.2013 | TestFiles CRUD operations through Kendo Grid implemented BaseController have LargeJson result method TestViewModel edited to have properties for bigger tests 937 | Ivaylo Kenov | 30.8.2013 | Edit and Delete button for Tests Grid View 936 | Ivaylo Kenov | 30.8.2013 | Grid added for TestFiles administration - Read operation over tests and displaying them 935 | Ivaylo Kenov | 29.8.2013 | TestFilesViewModel added Parts of Ajax requests for grid view for problem tests added 934 | Nikolay Kostov | 29.8.2013 | Included TimeWorked and MemoryUsed in ProcessExecutionResult ExecutionResult renamed to ProcessExecutionResult 933 | Nikolay Kostov | 29.8.2013 | Tests for RestrictedProcess class added ExecutionResult improved to contain error output and execution result type (time limit, success, run-time error, memory limit) ProcessExecutionInfo class is now hiden in DifferentUserProcessExecutor 931 | Nikolay Kostov | 29.8.2013 | Added security check in SandboxTarget for writing in %USER PROFILE%\AppData\LocalLow 930 | Nikolay Kostov | 29.8.2013 | Small enchancements in unit tests and SidIdentifierAuthority class 929 | Nikolay Kostov | 29.8.2013 | RestrictedProcess is now run under low integrity SID 927 | Ivaylo Kenov | 29.8.2013 | Fetching of news from InfoMan implemented Views for News now show content as Raw HTML 922 | Ivaylo Kenov | 29.8.2013 | Login and Register refactored a bit to look more color friendly 921 | Ivaylo Kenov | 29.8.2013 | Profile link redirrects to Users/Profile and Change Password link to Account/Manage Small UI fixes for Bootstrap 3.0 on users profile, layout, changing password and settings 915 | Ivaylo Kenov | 29.8.2013 | Fixed improper rendering of navbar login user menu 914 | Ivaylo Kenov | 29.8.2013 | Fixed all non-working unit tests - they needed Author and Source in every News instance 913 | Nikolay Kostov | 29.8.2013 | Fixed "access denied" exception when starting process with restricted token in RestrictedProcess class 912 | Nikolay Kostov | 28.8.2013 | Started work on creating restricted token for process in restricted process class. Some refactoring in processes implementation 911 | Ivaylo Kenov | 28.8.2013 | News now have Author and Source in Controller, Model, ViewModels and Views 910 | Nikolay Kostov | 28.8.2013 | Created restricted process executor class Small refactorings Dropped IProcessExecutor interface since only one class will implement it and that class may not be publicly visible 909 | Nikolay Kostov | 28.8.2013 | Refactored and relocated some of the files in Telerik.OJS.Workers.Executors Source code in executors unit test extracted as constants Added RecursivelyCheckFileSystemPermissions method in sandbox target 907 | Nikolay Kostov | 27.8.2013 | Implemented StartTime, ExitTime, PriviledgedProcessorTime, UserProcessorTime and TotalProcessorTime properties for RestrictedProcess class 906 | Nikolay Kostov | 27.8.2013 | Fixed bug with hanging when reading standard ouput and error streams in RestrictedProcess class 901 | Nikolay Kostov | 27.8.2013 | Added new unit test in TestDifferentUserProcess Fixed unit test timings for tests in TestDifferentUserProcess to run on slow CI servers 900 | Nikolay Kostov | 27.8.2013 | Timing of two unit tests in TestDifferentUserProcess fixed to work correctly on slower CI servers 899 | Nikolay Kostov | 27.8.2013 | Implemented Kill() and WaitForExit() methods in RestrictedProcess class 897 | Nikolay Kostov | 27.8.2013 | Work on RestrictedProcess methods WaitForExit() and Kill() 896 | Nikolay Kostov | 26.8.2013 | Fixed bug with redirecting standard input, output and error handles when using RestrictedProcess class 895 | Nikolay Kostov | 26.8.2013 | Fixed bug with creating pipes in RestrictedProcess 2 more unit tests added for different user process class Fixed compile error caused by missing reference to System.dll in BaseExecutorsTestClass 894 | Nikolay Kostov | 25.8.2013 | Fixed account controller to work with the new ASP.NET identity Added 2 unit tests for DifferentUserProcess class 893 | Nikolay Kostov | 25.8.2013 | Added Telerik.OJS.Workers.Executors.Tests and 2 unit tests for DifferentUserProcess class 892 | Nikolay Kostov | 25.8.2013 | InfoType renamed to InfoClass and added all missing values Work on job object information extraction 891 | Nikolay Kostov | 25.8.2013 | Time is now limited correctly in SandboxProcess Writing to processes in SandboxProcess is now async operation 890 | Nikolay Kostov | 25.8.2013 | Work on native use of processes (not done yet) Improved information in Sandbox target program 889 | Nikolay Kostov | 25.8.2013 | Fixed encodings to all view. Their encoding is now utf8 885 | Nikolay Kostov | 25.8.2013 | Two more packages removed from source control system since they will be included during build Fixed compilation warning with Antlr packages 884 | Nikolay Kostov | 25.8.2013 | Removed all packages from source control since nuget package restore is enabled for the solution 883 | Nikolay Kostov | 25.8.2013 | Attempt to fix broken build 882 | Nikolay Kostov | 25.8.2013 | Attempt to fix broken build 881 | Nikolay Kostov | 25.8.2013 | Attempt to fix broken build 880 | Nikolay Kostov | 25.8.2013 | 879 | Nikolay Kostov | 25.8.2013 | NuGet package resore enabled for the solution 878 | Nikolay Kostov | 25.8.2013 | Implemented basic UI restrictions functionality in the sandbox (including restrict access to clipboard) WrapperImpersonationContext moved to Telerik.OJS.Workers.Executors Introduced new class PrepareJobObect to hold specific job object limitations for SandboxProcess Job object class now has 2 new methods SetExtendedLimitInformation and SetBasicUiRestrictions SandboxTarget program improved to work with clipboard ExecutionResult renamed to TestRunResultType 877 | Nikolay Kostov | 24.8.2013 | Updated all nuget packages to latest versions AccountController is currently not working with the new asp.net identity 876 | Nikolay Kostov | 24.8.2013 | Cheat program removed from \Tests\ folder because all of its funcionality is included in SandboxTarget console application Sandbox target now uses console output instead of log file 875 | Nikolay Kostov | 23.8.2013 | Improvements in agent class method parameters 874 | Nikolay Kostov | 23.8.2013 | Fixed missing file InfoType.cs to fix broken build 873 | Nikolay Kostov | 23.8.2013 | Refactored SandboxProcess to not use Console for debugging. Debugging code is moved back to SandboxPocProgram 872 | Nikolay Kostov | 23.8.2013 | Process sandbox logic extracted in SandboxProcess class 871 | Nikolay Kostov | 23.8.2013 | Sandbox POC and target improvements 870 | Nikolay Kostov | 23.8.2013 | Sanbox target console application refactored to reduce code duplicates Sandbox POC console application now shows process info after the process exited 869 | Nikolay Kostov | 23.8.2013 | Job object improved to limit active processes to 1 (this solves security problem related to Process.Start capability when executing C# code) Refactoring in JobObjects classes Added Security limit flags and information class 868 | Nikolay Kostov | 23.8.2013 | Fixed build break (renaming problems) 867 | Nikolay Kostov | 23.8.2013 | Code refactoring in job object classes (each class is now in separate file) 866 | Nikolay Kostov | 23.8.2013 | Started work on sandbox Created console application for sandbox proof of concept Added sandbox target to test the sandbox with Refactoring in job object classes 862 | Nikolay Kostov | 22.8.2013 | Work on execution strategies 861 | Nikolay Kostov | 22.8.2013 | Work on execution strategies 860 | Nikolay Kostov | 22.8.2013 | C# compiler implemented (needs testing) C++ compiler implemented (needs testing) Base compiler logic implemented in BaseCompiler using template method design pattern 859 | Ivaylo Kenov | 22.8.2013 | Further more Contest by category page adaptation to Bootstrap 3.0 858 | Ivaylo Kenov | 22.8.2013 | Contest page adapted to Bootstrap 3.0 857 | Nikolay Kostov | 22.8.2013 | Compiler model renamed to submission type Added execution strategy type Submission type data seed added 856 | Ivaylo Kenov | 22.8.2013 | Test files View fixed for Bootstrap 3.0 855 | Ivaylo Kenov | 22.8.2013 | HTML Agility Pack added as NuGet package Views updated to use Bootstrap 3.0 Translated Login and Register page 854 | Nikolay Kostov | 22.8.2013 | Added compilers and compiler types to the model. Each submission now has selected compiler and each problem has list of allowed compilers 853 | Ivaylo Kenov | 22.8.2013 | TestFiles now support Adding IOI tests 852 | Nikolay Kostov | 22.8.2013 | Added 3 missing bootstrap files 851 | Nikolay Kostov | 22.8.2013 | Bootstrap updated to version 3.0.0 850 | Nikolay Kostov | 22.8.2013 | Updated 'Moq' from version '4.0.10827' to '4.1.1308.2120' in project 'Telerik.OJS.Web.Tests' 849 | Nikolay Kostov | 22.8.2013 | Updated EntityFramework.SqlServerCompact from version 6.0.0-beta1 to version 6.0.0-rc1 All projects now use the same SqlServer Compact version (6.0.0-rc) 848 | Nikolay Kostov | 22.8.2013 | EntityFramework updated from version 6.0.0-beta1 to 6.0.0-rc1 Fixed EF update issues related to attribute conventions Settings.StyleCop file excluded from compiled binaries in web project 847 | Ivaylo Kenov | 22.8.2013 | Refactored TextFiles UI 845 | Ivaylo Kenov | 21.8.2013 | Contest administration now uses ViewModel and do not fetch unneeded data 844 | Ivaylo Kenov | 21.8.2013 | Profile Info Refactored Submissions now does not show contests with passwords All projections now use static methods from ViewModels 843 | Ivaylo Kenov | 21.8.2013 | Submissions method is now AllPublic If contests has password -> it will not be shown in log 842 | Ivaylo Kenov | 21.8.2013 | Contest has two passwords - Contest Password and Practise Password 841 | Ivaylo Kenov | 21.8.2013 | SubmissionViewModel has ProblemMaximumPoints property and now calculates Points based on it Views updated to show correct information for Maximum Points 840 | Nikolay Kostov | 21.8.2013 | Fixed bug #54 (Login returns invalid Username) by removing UserName property overriding 839 | Ivaylo Kenov | 21.8.2013 | Submission log do not show active contests submissions Custom repository created for submissions 838 | Nikolay Kostov | 21.8.2013 | Updated Newtonsoft.Json.4.5.11 to latest version 5.0.6 for all assemblies 837 | Nikolay Kostov | 21.8.2013 | Refactored AdministrationRoutesTests to use RoutesTestsBase methods Data annotations moved to Telerik.OJS.Common 836 | Nikolay Kostov | 21.8.2013 | Implemented #61 (Users should be accessed by username in URL) Added unit tests for users routes 835 | Ivaylo Kenov | 21.8.2013 | News pagination do not show all pages if page count is more than 10 pages 834 | Ivaylo Kenov | 21.8.2013 | Small refactor on submissions visualization Advanced submission is not sortable any more 833 | Ivaylo Kenov | 21.8.2013 | Fixed diplaying no information in User Settings Age property when no date is given 826 | Nikolay Kostov | 19.8.2013 | Fixed #57 (Refactor Kendo UI grids everywhere to use server side paging) 825 | Nikolay Kostov | 19.8.2013 | Fixed #13 (Move all repositories to Telerik.OJS.Data.Repositories) 824 | Nikolay Kostov | 19.8.2013 | Fixed #14 (Move all repository interfaces to Telerik.OJS.Data.Repositories.Contracts) 823 | Nikolay Kostov | 19.8.2013 | TestRun should not be deletable entity since DeletableEntity will add 4 more columns to the table. TestRuns is expected to have millions of records so we should keep it as small as possible. 822 | Ivaylo Kenov | 16.8.2013 | Import and Export for Test Files (Web form in administration) Changed css order - Kendo is now first, Site is second 818 | Ivaylo Kenov | 15.8.2013 | Repositories for Test class. Importing of three kind of tests added: {name}.{testnumber}.{in|dol} {numberoftask}{ET|GT}_{testnumber}.{IN|OUT} test.{000|""}.{testnumber}.{in|out}.txt Danger (red) messages added to layout View added 810 | Ivaylo Kenov | 12.8.2013 | Submission log for Logged Users added with Kendo UI Grid Needs to be refactored to work with server-side paging 809 | Ivaylo Kenov | 12.8.2013 | Removed the My ASP.NET Application header and put BGCoder instead 808 | Ivaylo Kenov | 10.8.2013 | Fixed padding bug by removing display fixed in theme (might be a bug) Will try to fix it in better way if there is one 807 | Ivaylo Kenov | 10.8.2013 | Repository for TestRuns Updated bootstrap to 3.0 RC 1 Added in bundles Bootstrap icons Added fonts for Bootstrap icons Submission Controller implemented Submissions View Model (needs more work) TestRun View Model (needs more work) Fixed login and register routes to have no area Basic Submissions view implemented 806 | Nikolay Kostov | 9.8.2013 | Added 2 new unit tests to assure exceptions are thrown in CSharpCodeChecker 805 | Nikolay Kostov | 9.8.2013 | Glimpse updated to latest version (still not working with EF6) Ninject updated to latest version (3.0.2-unstable-9037) Added styles and JS files from Kendo.Mvc in "External Libraries" folder 804 | Nikolay Kostov | 9.8.2013 | Changes in TestRun model 803 | Ivaylo Kenov | 9.8.2013 | News module should be done. Unit tests for all Actions in NewsController Precision Checker fixed for Bulgarian Culture 802 | Ivaylo Kenov | 9.8.2013 | News error message when such do not exists 801 | Ivaylo Kenov | 9.8.2013 | Previous and Next buttons implemented in Selected News 798 | Ivaylo Kenov | 8.8.2013 | All news listed controller view and viewmodel 796 | Nikolay Kostov | 8.8.2013 | Implemented CSharpCodeChecker Web.config configured to use machine key for the web application that is different from other applications on the same web server 795 | Nikolay Kostov | 7.8.2013 | Refactored checkers and their unit tests Changed checkers model (added properties Parameter and IsProblemSpecific) Other changes and refactorings 793 | Nikolay Kostov | 7.8.2013 | Attempt to fix broken build because of Ionic.Zip.dll not referenced correctly 792 | Nikolay Kostov | 7.8.2013 | Fix in Web.config for Ionic.Zip version 791 | Ivaylo Kenov | 7.8.2013 | Another attempt to fix the missing build 790 | Ivaylo Kenov | 7.8.2013 | Attempt to fix broken build (missing DotNetZip dll library) 789 | Ivaylo Kenov | 7.8.2013 | Test File Controller has working Extract zip file method Unit test for Test File Controller 788 | Ivaylo Kenov | 6.8.2013 | Small refactorings in Precision Checker unit tests 787 | Ivaylo Kenov | 6.8.2013 | Precision checker added Unit tests for precision checker 786 | Nikolay Kostov | 5.8.2013 | Installed DotNetZip version 1.9.1.8 Added empty TestFilesController for import/export tests logic 785 | Nikolay Kostov | 5.8.2013 | Refactorings in CompeteController.Register Closed issue #19 (Extract show registration form logic in separate method) 784 | Nikolay Kostov | 5.8.2013 | Contest registration logic implemented when registration form should not be displayed 783 | Ivaylo Kenov | 5.8.2013 | Case insensitive checker added Unit tests for case insensitive checker 782 | Nikolay Kostov | 5.8.2013 | Added Participants repository Added UserProfile property to BaseController Ninject updated to version 3.0.2-unstable-9035 Translated strings in _LoginPartial.cshtml Fixed issue #15 (exception when navigate to user profile from some area) Fixed issue #16 (exception when click log off deom some area page) 781 | Ivaylo Kenov | 5.8.2013 | Small unit tests refactor for Trim Checker 780 | Ivaylo Kenov | 5.8.2013 | Sort checker Unit tests Additional unit tests for Exact checker and Trim checker 779 | Ivaylo Kenov | 5.8.2013 | Exact and Trim Checker added with abstract BaseChecker Class Exact and Trim checker Unit tests 778 | Nikolay Kostov | 3.8.2013 | Added empty project Telerik.OJS.Workers.Compilers Added empty project Telerik.OJS.Workers.Executors Added "job objects" functionality (http://msdn.microsoft.com/en-us/library/ms684161%28v=vs.85%29.aspx) Added Win32 class in Telerik.OJS.Workers.Common with common win32 interop functions Moved GlimplseSecurityPolicy to /App_Start 777 | Nikolay Kostov | 2.8.2013 | Added Glimpse packages Fixed typos in Home/Index.html 776 | Nikolay Kostov | 2.8.2013 | Action GetByCategory renamed to ByCategory 775 | Nikolay Kostov | 2.8.2013 | Added empty views and actions for contest compete functionality Contests routes unit tested Added .gitignore (for future git integration) 774 | Nikolay Kostov | 2.8.2013 | Contests web logic moved to its own area Contests routes unit test improvements Added NetworkDataObject class to hold communication data between controller and agents 773 | Nikolay Kostov | 2.8.2013 | Draft of controller and agent communication sequence diagram added 772 | Nikolay Kostov | 1.8.2013 | Added navigation property to Participants in Contest model Added HasContestPassword and HasPracticePassword properties in Contest model ContestCategory now implements IOrderable In OldDatabaseMigration copiers refactored and cleaned Performance improvements in ParticipantsCopier Fixed N+1 problem in ContestViewModel projection Improved UI of contests list 771 | Ivaylo Kenov | 1.8.2013 | User settings Age property unit tests String Extensions unit tests String Extensions bug for replacing C # and C++ fixed Exact Checker 100% code coverage by adding one more unit test 770 | Ivaylo Kenov | 1.8.2013 | User settings and profiles added ToUrl method - excaped some symbols 769 | Nikolay Kostov | 1.8.2013 | Fixed exception with registrations (CreatedOn property is always null when user is created from IdentityStore.CreateLocalUser) 768 | Nikolay Kostov | 31.7.2013 | Added CodeMirror (javascript-based code editor component) Added ToUrl() string extension method Contest urls are now clearer 767 | Nikolay Kostov | 31.7.2013 | Added ParticipantAnswersConfiguration for preventing potential cycles or multiple cascade paths problem Depend upon abstractions instead of concrete implementations for checking AuditInfo and DeletableEntity Added ParticipantAnswer model Moved user setting specific data to complex type called UserSettings User class now implements IDeletableEntity and IAuditInfo "Ninject.3.0.2 unstable 9" updated to "Ninject.3.0.2 unstable 9028" "Ninject.Web.Common.3.0.2 unstable 9" updated to "Ninject.Web.Common.3.0.2 unstable 9012" Added logic for mivong participants from old database Logic for moving users from the old database improved 766 | Ivaylo Kenov | 31.7.2013 | Profile information Controller, View and ViewModel Partial View for profile information Tests for feedback controller Started settings page User settings started in UserProfile model 765 | Ivaylo Kenov | 31.7.2013 | Tests for DeletedOn + users area 764 | Nikolay Kostov | 31.7.2013 | Temporally fix for broken unit tests because of SQL Compact database not having "date" type 763 | Nikolay Kostov | 31.7.2013 | Added new ef code first convention IsUnicodeAttributeConvention Added new properties in UserProfile model Work on UsersCopier for moving users from the old database Few small fixes 760 | Ivaylo Kenov | 30.7.2013 | Feedback form + unit tests 759 | Nikolay Kostov | 29.7.2013 | StyleCop settings file included in all projects Feedbacks renamed to FeedbackReports Code cleanups (using StyleCop suggestions) 757 | Ivaylo Kenov | 29.7.2013 | Common folder for Telerik.OJS.Common 756 | Ivaylo Kenov | 29.7.2013 | Unit tests performance boosts 755 | Ivaylo Kenov | 29.7.2013 | Routes for Administration area Unit tests and Feedback repository and dbset. 754 | Ivaylo Kenov | 29.7.2013 | InitializeEmptyOjsData method added to clear SQL Compact database for tests 753 | Ivaylo Kenov | 29.7.2013 | merge and new unit tests for contest category 752 | Nikolay Kostov | 28.7.2013 | Added method AllWithDeleted in DeletableEntityRepository ClearDatabase method now have hardcoded table names to prevent problems with foreign keys when deleting data Submission properties added: Problem relation, Content and ContentAsString Added string extensions in Telerik.OJS.Common Refactored OldDatabaseMigration. All migrations are now in separate classes Few more small refactorings 751 | Nikolay Kostov | 28.7.2013 | Added StyleCop settings files 750 | Nikolay Kostov | 28.7.2013 | Code cleanups and refactoring (StyleCop advices used) 749 | Nikolay Kostov | 28.7.2013 | Added some classes for the controller<->agent communication 748 | Nikolay Kostov | 28.7.2013 | Exact checker implemented (added unit tests to verify its behavior) Wrote some routes tests (added required web stubs for testing) Added Telerik.OJS.Workers.Controller - empty service Added Telerik.OJS.Workers.Agent - empty service 747 | Nikolay Kostov | 26.7.2013 | Added test project for Telerik.OJS.Common library Added unit test for compression and decompression 746 | Nikolay Kostov | 26.7.2013 | Tests migration implemented Changes in tests model: the tests data is now stored in compressed format (using deflate) Added Telerik.OJS.Common library for common system functionality 744 | Nikolay Kostov | 26.7.2013 | Work on database model Added Telerik.OJS.Workers.Common Added Telerik.OJS.Workers.Checkers Contest questions migration and contest task migrations added (from old database to the new one) Updated WebGrease to version 1.5.2 743 | Ivaylo Kenov | 26.7.2013 | Unit tests refactored for CanBePracticed and CanBeCompeted 741 | Nikolay Kostov | 25.7.2013 | Fixed error "A circular reference was detected while serializing an object of type 'System.Data.Entity.DynamicProxies..." when using kendo grid administraton 739 | Nikolay Kostov | 25.7.2013 | Kendo UI styles and javascripts updated to official version Q2 2013 (2013.2.716) 738 | Nikolay Kostov | 25.7.2013 | Build error check 737 | Nikolay Kostov | 24.7.2013 | Removed assembly signing in Kendo.Mvc.csproj to fix missing singing tool on build server 736 | Nikolay Kostov | 24.7.2013 | Attempt to fix missing references in Kendo.Mvc project 735 | Nikolay Kostov | 24.7.2013 | Kendo.Mvc source included in project and updated to latest stable version 2013.2.716 Contest questions implemented in model Contest password added IOrderable interface added 734 | Nikolay Kostov | 24.7.2013 | Small UI fix in contests list 732 | Nikolay Kostov | 24.7.2013 | Contest repository now returns only non-deleted objects by default Added contests helper to return contest url Small code refactorings 731 | Nikolay Kostov | 23.7.2013 | Implemented contest listing by category Added navigation property to contests in ContestCategory model Added property ResultsArePubliclyVisible in contest model Contest category is now set for every contest in the OldDatabaseMigrationConfiguration Added routes for contest list and contest details Fixed AllVisibleInCategory showing deleted contests Fixed seed number in ClearDatabase method 730 | Ivaylo Kenov | 23.7.2013 | AllVisible tests in Data Contests Repository 729 | Ivaylo Kenov | 23.7.2013 | Unit tests for Data ContestsRepository - AllActive and AllFuture Contests has foreign key for CategoryId 728 | Nikolay Kostov | 22.7.2013 | Administration navigation added Contest categories and hierarchy administration added Started work on contest archive page 727 | Ivaylo Kenov | 22.7.2013 | Unit tests for News data properties - CreatedOn and ModifiedOn 726 | Ivaylo Kenov | 22.7.2013 | Executor Security Tests documentation added 725 | Ivaylo Kenov | 22.7.2013 | Unit tests added and separated for Contest data 713 | Nikolay Kostov | 18.7.2013 | Added new model ContestCategory Updated jQuery to 2.0.3 KendoUI tree view with drag & drop support integrated with contest categories 712 | Ivaylo Kenov | 18.7.2013 | Contest Data tests for validation, can be practiced, can be competed 711 | Ivaylo Kenov | 18.7.2013 | Data tests added, ClearDatabase method 707 | Ivaylo Kenov | 18.7.2013 | Added documentation for security tests Unit testing for new EF Mock 706 | Nikolay Kostov | 17.7.2013 | Added contests list favicon changed Version deployed 705 | Nikolay Kostov | 17.7.2013 | Fixed bug with ModifiedOn set on every new record Fixed bug with moving old contests to the new database Added CabBeCompeted and CanBePracticed properties in Contest model 704 | Nikolay Kostov | 17.7.2013 | Added Telerik.OJS.Tools.OldDatabaseMigration to migrate old database data to the new one 703 | Nikolay Kostov | 17.7.2013 | Tests fixes 702 | Nikolay Kostov | 17.7.2013 | Extracted base test code in Telerik.OJS.Tests.Common Added project for data tests in Telerik.OJS.Data.Tests 701 | Nikolay Kostov | 16.7.2013 | Unit tests will now use the sql server compact edition to mock real database 700 | Nikolay Kostov | 16.7.2013 | A lot of abstractions implemented 699 | Nikolay Kostov | 16.7.2013 | Test new build path 698 | Nikolay Kostov | 16.7.2013 | Reverted WebGrease version to 1.3.0 Fixed broken build 697 | Nikolay Kostov | 16.7.2013 | Moved resources to App_GlobalResources Installed WebGrease 1.5.1 696 | Nikolay Kostov | 15.7.2013 | Enabled automatic migrations and set database initializer to MigrateDatabaseToLatestVersion 692 | Nikolay Kostov | 11.7.2013 | Removed knockoutjs 691 | Ivaylo Kenov | 10.7.2013 | Small fixes in naming Contest -> Contests 690 | Ivaylo Kenov | 10.7.2013 | Contest administration added, documentation for new administration added 689 | Ivaylo Kenov | 10.7.2013 | Small bug fixed with references 688 | Ivaylo Kenov | 10.7.2013 | Unit tests for HomeController (visible and non-deleted contests) 686 | Nikolay Kostov | 8.7.2013 | Using dependecy injection (Ninject) and rewrote most of the code to use it Included Moq for mocking Added 4 unit tests for HomeController Added few mock objects 684 | Nikolay Kostov | 8.7.2013 | Added AuditInfo and DeletableEntity abstract classes to provide CreatedOn, ModifiedOn, DeletedOn and IsDeleted fields to entites Fixes in KendoGridAdministrationController 683 | Nikolay Kostov | 8.7.2013 | Base code for each administration News administration improvements Problem with kendo culture temporally fixed 682 | Nikolay Kostov | 8.7.2013 | Fixed bundling problem with KendoUI styles Small other fixes 681 | Nikolay Kostov | 8.7.2013 | Try to fix broken build 680 | Nikolay Kostov | 8.7.2013 | Few fixes in views encoding Fixed links in _Layout.cshtml Version deployed 679 | Nikolay Kostov | 7.7.2013 | Fixed broken csproj file 667 | Ivaylo Kenov | 5.7.2013 | Small fix in news 666 | Ivaylo Kenov | 5.7.2013 | News controller and model added, Partial view for news on index and news page 665 | Nikolay Kostov | 5.7.2013 | Added KendoUI Grid administration base code News administration implemented Telerik.OJS.Web MVC improvements 664 | Nikolay Kostov | 4.7.2013 | Included KendoUI javascript, css and KendoUI MVC wrappers in Telerik.OJS.Web project 660 | Nikolay Kostov | 4.7.2013 | Extended UserProfile table by using this approach: https://github.com/rustd/AspnetIdentitySample/blob/master/AspnetIdentitySample/Models/AppModel.cs Added "Adminitrator" role in database seed method Refactored OjsDbContext to use IdentityDbContext 659 | Nikolay Kostov | 4.7.2013 | Updated all NuGet packages to latest versions Integrated new version of ASP.NET identity Updated to new ASP.NET beta2 template 657 | Nikolay Kostov | 4.7.2013 | Deleted old and useless files Fixed encoding in _LoginPartial.cshtml 655 | Ivaylo Kenov | 4.7.2013 | Removed some design styles which were not well done (no-color) in register and login. Added another contests for testing the visualization of the index page 654 | Nikolay Kostov | 3.7.2013 | Database schema improved (added new fields) Index page almost ready 653 | Nikolay Kostov | 3.7.2013 | Added two project diagrams (SystemComponents and SystemLayer) Few fixes in repository pattern files (GenericRepository and OjsData.cs) 643 | Nikolay Kostov | 1.7.2013 | Another attempt to fix build error Included Setting.StyleCop files 640 | Nikolay Kostov | 1.7.2013 | Added area administration 639 | Nikolay Kostov | 30.6.2013 | Data model improvements UI improvements 638 | Nikolay Kostov | 30.6.2013 | Fixes and improvements in accounts 637 | Nikolay Kostov | 30.6.2013 | Moved user models in Telerik.OJS.Data.Models Enabled database migrations 636 | Nikolay Kostov | 30.6.2013 | Work on data. Partially implemented repository pattern and unit of work. 635 | Nikolay Kostov | 29.6.2013 | Small code changes in default MVC 5 project 634 | Nikolay Kostov | 29.6.2013 | Reverted changes. Stable build. 633 | Nikolay Kostov | 29.6.2013 | Reverted updates 632 | Nikolay Kostov | 29.6.2013 | Updated all nuget packages with their latest prerelese versions 631 | Nikolay Kostov | 29.6.2013 | Replaced Telerik.OJS.Web with new tempalte from VS 2013 (with ASP.NET MVC 5 beta) Added CheatProgram to test for security problems in the sandobxing 629 | Nikolay Kostov | 28.6.2013 | Added deployment settings Added administration area Bootstrap design implemented 628 | Nikolay Kostov | 28.6.2013 | Installed Twitter.Bootstrap as package and in Telerik.OJS.Web 627 | Nikolay Kostov | 28.6.2013 | Added new project Telerik.OJS.Data.Models 625 | Nikolay Kostov | 28.6.2013 | Added project Telerik.OJS.Web All NuGet packages updated 624 | Nikolay Kostov | 28.6.2013 | Added few more NuGet packages 623 | Nikolay Kostov | 28.6.2013 | Added folder structure Added NuGet packages: EF, jQuery and jQuery.Validation 622 | Nikolay Kostov | 28.6.2013 | Added empty solution file 621 | Nikolay Kostov | 28.6.2013 | Check-in the Lab default template ================================================ FILE: Documentation/Installation/sample-solution-cpp11.cpp ================================================ #include #include #include #include #include void nptr(int x) { std::cout<<"This function shouldn't be called\n"; } void nptr(char*x) { std::cout<<"This function should be called\n"; if(x) std::cout<<"... but something is wrong!\n"; } constexpr long long fib(int x) { return x<2?1:fib(x-1)+fib(x-2); } int main() { std::cout<<"If the program freezes now it's bad\n"; const long long bigfib=fib(80); std::cout<<"It didn't froze\n"; std::cout< v; std::cout<<"Initialised\n"; v.resize((1<<18)/sizeof(int)); std::cout<<"Allocated\n"; for(auto &x:v) x=gen(); std::cout<<"Filled\n"; decltype(v) v2=v; std::cout<<"Copied\n"; if(v.size()==v2.size()) std::cout<<"It's okay\n"; else std::cout<<"It's not okay\n"; v.clear(); v=std::move(v2); std::cout<<"Moved\n"; if(v2.size()==0) std::cout<<"It's okay\n"; else std::cout<<"It's not okay\n"; v.resize(1<<12); v.shrink_to_fit(); v2.shrink_to_fit(); std::sort(std::begin(v), std::end(v), [](int a, int b){ return abs(a)>abs(b); }); std::cout<<"Sorted\n"; std::shuffle(std::begin(v), std::end(v), gen); std::cout<<"Shuffled\n"; std::unordered_map um = {{1, 'a'}, {6, 'b'}, {2, 'x'}}; std::uniform_int_distribution letters('a', 'z'); for(auto x:v) um.insert({x, letters(gen)}); nptr(nullptr); std::vector> vvc={ {'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'} }; std::tuple> tup; int x; v.resize(42); std::get<0>(tup) = 42; std::tie(x, std::ignore, v) = tup; if(x == 42) std::cout<<"Perfect!\n"; else std::cout<<"Oh, noo! Something is wrong :(\n"; auto tup2 = std::tuple_cat(tup, std::make_tuple((double)3.5), tup, std::tie(x, x)); } ================================================ FILE: Documentation/Installation/sample-solution.cpp ================================================ #include using namespace std; int main() { string line; cin >> line; cout << line << endl; return 0; } ================================================ FILE: Documentation/Installation/sample-solution.cs ================================================ using System; class Program { static void Main() { var line = Console.ReadLine(); Console.WriteLine(line); } } ================================================ FILE: Documentation/Installation/sample-solution.js ================================================ function solve(lines) { return lines[0]; } ================================================ FILE: Documentation/Requirements/Gacutil/gacutil.exe.config ================================================ ================================================ FILE: Documentation/Requirements/PowerCollections/Binaries/License.txt ================================================ Shared Source License for Wintellect Power Collections THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. ================================================ FILE: Documentation/Requirements/PowerCollections/Binaries/PowerCollections.XML ================================================ PowerCollections Stores a pair of objects within a single struct. This struct is useful to use as the T of a collection, or as the TKey or TValue of a dictionary. Comparers for the first and second type that are used to compare values. The first element of the pair. The second element of the pair. Creates a new pair with given first and second elements. The first element of the pair. The second element of the pair. Creates a new pair using elements from a KeyValuePair structure. The First element gets the Key, and the Second elements gets the Value. The KeyValuePair to initialize the Pair with . Determines if this pair is equal to another object. The pair is equal to another object if that object is a Pair, both element types are the same, and the first and second elements both compare equal using object.Equals. Object to compare for equality. True if the objects are equal. False if the objects are not equal. Determines if this pair is equal to another pair. The pair is equal if the first and second elements both compare equal using IComparable<T>.Equals or object.Equals. Pair to compare with for equality. True if the pairs are equal. False if the pairs are not equal. Returns a hash code for the pair, suitable for use in a hash-table or other hashed collection. Two pairs that compare equal (using Equals) will have the same hash code. The hash code for the pair is derived by combining the hash codes for each of the two elements of the pair. The hash code. Compares this pair to another pair of the some type. The pairs are compared by using the IComparable<T> or IComparable interface on TFirst and TSecond. The pairs are compared by their first elements first, if their first elements are equal, then they are compared by their second elements. If either TFirst or TSecond does not implement IComparable<T> or IComparable, then an NotSupportedException is thrown, because the pairs cannot be compared. The pair to compare to. An integer indicating how this pair compares to . Less than zero indicates this pair is less than . Zero indicate this pair is equals to . Greater than zero indicates this pair is greater than . Either FirstSecond or TSecond is not comparable via the IComparable<T> or IComparable interfaces. Compares this pair to another pair of the some type. The pairs are compared by using the IComparable<T> or IComparable interface on TFirst and TSecond. The pairs are compared by their first elements first, if their first elements are equal, then they are compared by their second elements. If either TFirst or TSecond does not implement IComparable<T> or IComparable, then an NotSupportedException is thrown, because the pairs cannot be compared. The pair to compare to. An integer indicating how this pair compares to . Less than zero indicates this pair is less than . Zero indicate this pair is equals to . Greater than zero indicates this pair is greater than . is not of the correct type. Either FirstSecond or TSecond is not comparable via the IComparable<T> or IComparable interfaces. Returns a string representation of the pair. The string representation of the pair is of the form: First: {0}, Second: {1} where {0} is the result of First.ToString(), and {1} is the result of Second.ToString() (or "null" if they are null.) The string representation of the pair. Determines if two pairs are equal. Two pairs are equal if the first and second elements both compare equal using IComparable<T>.Equals or object.Equals. First pair to compare. Second pair to compare. True if the pairs are equal. False if the pairs are not equal. Determines if two pairs are not equal. Two pairs are equal if the first and second elements both compare equal using IComparable<T>.Equals or object.Equals. First pair to compare. Second pair to compare. True if the pairs are not equal. False if the pairs are equal. Converts a Pair to a KeyValuePair. The Key part of the KeyValuePair gets the First element, and the Value part of the KeyValuePair gets the Second elements. Pair to convert. The KeyValuePair created from . Converts this Pair to a KeyValuePair. The Key part of the KeyValuePair gets the First element, and the Value part of the KeyValuePair gets the Second elements. The KeyValuePair created from this Pair. Converts a KeyValuePair structure into a Pair. The First element gets the Key, and the Second element gets the Value. The KeyValuePair to convert. The Pair created by converted the KeyValuePair into a Pair. OrderedDictionary<TKey, TValue> is a collection that maps keys of type TKey to values of type TValue. The keys are maintained in a sorted order, and at most one value is permitted for each key.

The keys are compared in one of three ways. If TKey implements IComparable<TKey> or IComparable, then the CompareTo method of that interface will be used to compare elements. Alternatively, a comparison function can be passed in either as a delegate, or as an instance of IComparer<TKey>.

OrderedDictionary is implemented as a balanced binary tree. Inserting, deleting, and looking up an an element all are done in log(N) type, where N is the number of keys in the tree.

is similar, but uses hashing instead of comparison, and does not maintain the keys in sorted order.

DictionaryBase is a base class that can be used to more easily implement the generic IDictionary<T> and non-generic IDictionary interfaces. To use DictionaryBase as a base class, the derived class must override Count, GetEnumerator, TryGetValue, Clear, Remove, and the indexer set accessor. The key type of the dictionary. The value type of the dictionary. CollectionBase is a base class that can be used to more easily implement the generic ICollection<T> and non-generic ICollection interfaces. To use CollectionBase as a base class, the derived class must override the Count, GetEnumerator, Add, Clear, and Remove methods. ICollection<T>.Contains need not be implemented by the derived class, but it should be strongly considered, because the CollectionBase implementation may not be very efficient. The item type of the collection. Creates a new CollectionBase. Shows the string representation of the collection. The string representation contains a list of the items in the collection. Contained collections (except string) are expanded recursively. The string representation of the collection. Must be overridden to allow adding items to this collection.

This method is not abstract, although derived classes should always override it. It is not abstract because some derived classes may wish to reimplement Add with a different return type (typically bool). In C#, this can be accomplished with code like the following:

public class MyCollection<T>: CollectionBase<T>, ICollection<T> { public new bool Add(T item) { /* Add the item */ } void ICollection<T>.Add(T item) { Add(item); } }
Item to be added to the collection. Always throws this exception to indicated that the method must be overridden or re-implemented in the derived class.
Must be overridden to allow clearing this collection. Must be overridden to allow removing items from this collection. True if existed in the collection and was removed. False if did not exist in the collection. Determines if the collection contains a particular item. This default implementation iterates all of the items in the collection via GetEnumerator, testing each item against using IComparable<T>.Equals or Object.Equals. You should strongly consider overriding this method to provide a more efficient implementation, or if the default equality comparison is inappropriate. The item to check for in the collection. True if the collection contains , false otherwise. Copies all the items in the collection into an array. Implemented by using the enumerator returned from GetEnumerator to get all the items and copy them to the provided array. Array to copy to. Starting index in to copy to. Creates an array of the correct size, and copies all the items in the collection into the array, by calling CopyTo. An array containing all the elements in the collection, in order. Provides a read-only view of this collection. The returned ICollection<T> provides a view of the collection that prevents modifications to the collection. Use the method to provide access to the collection without allowing changes. Since the returned object is just a view, changes to the collection will be reflected in the view. An ICollection<T> that provides read-only access to the collection. Determines if the collection contains any item that satisfies the condition defined by . A delegate that defines the condition to check for. True if the collection contains one or more items that satisfy the condition defined by . False if the collection does not contain an item that satisfies . Determines if all of the items in the collection satisfy the condition defined by . A delegate that defines the condition to check for. True if all of the items in the collection satisfy the condition defined by , or if the collection is empty. False if one or more items in the collection do not satisfy . Counts the number of items in the collection that satisfy the condition defined by . A delegate that defines the condition to check for. The number of items in the collection that satisfy . Enumerates the items in the collection that satisfy the condition defined by . A delegate that defines the condition to check for. An IEnumerable<T> that enumerates the items that satisfy the condition. Removes all the items in the collection that satisfy the condition defined by . A delegate that defines the condition to check for. Returns a collection of the items that were removed, in sorted order. Performs the specified action on each item in this collection. An Action delegate which is invoked for each item in this collection. Convert this collection of items by applying a delegate to each item in the collection. The resulting enumeration contains the result of applying to each item in this collection, in order. The type each item is being converted to. A delegate to the method to call, passing each item in this collection. An IEnumerable<TOutput^gt; that enumerates the resulting collection from applying to each item in this collection in order. is null. Must be overridden to enumerate all the members of the collection. A generic IEnumerator<T> that can be used to enumerate all the items in the collection. Copies all the items in the collection into an array. Implemented by using the enumerator returned from GetEnumerator to get all the items and copy them to the provided array. Array to copy to. Starting index in to copy to. Provides an IEnumerator that can be used to iterate all the members of the collection. This implementation uses the IEnumerator<T> that was overridden by the derived classes to enumerate the members of the collection. An IEnumerator that can be used to iterate the collection. Display the contents of the collection in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). Must be overridden to provide the number of items in the collection. The number of items in the collection. Indicates whether the collection is read-only. Always returns false. Always returns false. Indicates whether the collection is synchronized. Always returns false, indicating that the collection is not synchronized. Indicates the synchronization object for this collection. Always returns this. Creates a new DictionaryBase. Clears the dictionary. This method must be overridden in the derived class. Removes a key from the dictionary. This method must be overridden in the derived class. Key to remove from the dictionary. True if the key was found, false otherwise. Determines if this dictionary contains a key equal to . If so, the value associated with that key is returned through the value parameter. This method must be overridden by the derived class. The key to search for. Returns the value associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Adds a new key-value pair to the dictionary. The default implementation of this method checks to see if the key already exists using ContainsKey, then calls the indexer setter if the key doesn't already exist. Key to add. Value to associated with the key. key is already present in the dictionary Determines whether a given key is found in the dictionary. The default implementation simply calls TryGetValue and returns what it returns. Key to look for in the dictionary. True if the key is present in the dictionary. Shows the string representation of the dictionary. The string representation contains a list of the mappings in the dictionary. The string representation of the dictionary. Provides a read-only view of this dictionary. The returned IDictionary<TKey,TValue> provides a view of the dictionary that prevents modifications to the dictionary. Use the method to provide access to the dictionary without allowing changes. Since the returned object is just a view, changes to the dictionary will be reflected in the view. An IIDictionary<TKey,TValue> that provides read-only access to the dictionary. Adds a key-value pair to the collection. This implementation calls the Add method with the Key and Value from the item. A KeyValuePair contains the Key and Value to add. Determines if a dictionary contains a given KeyValuePair. This implementation checks to see if the dictionary contains the given key, and if the value associated with the key is equal to (via object.Equals) the value. A KeyValuePair containing the Key and Value to check for. Determines if a dictionary contains a given KeyValuePair, and if so, removes it. This implementation checks to see if the dictionary contains the given key, and if the value associated with the key is equal to (via object.Equals) the value. If so, the key-value pair is removed. A KeyValuePair containing the Key and Value to check for. True if the item was found and removed. False otherwise. Check that the given parameter is of the expected generic type. Throw an ArgumentException if it isn't. Expected type of the parameter parameter name parameter value Adds a key-value pair to the collection. If key or value are not of the expected types, an ArgumentException is thrown. If both key and value are of the expected types, the (overridden) Add method is called with the key and value to add. Key to add to the dictionary. Value to add to the dictionary. key or value are not of the expected type for this dictionary. Clears this dictionary. Calls the (overridden) Clear method. Determines if this dictionary contains a key equal to . The dictionary is not changed. Calls the (overridden) ContainsKey method. If key is not of the correct TKey for the dictionary, false is returned. The key to search for. True if the dictionary contains key. False if the dictionary does not contain key. Removes the key (and associated value) from the collection that is equal to the passed in key. If no key in the dictionary is equal to the passed key, the dictionary is unchanged. Calls the (overridden) Remove method. If key is not of the correct TKey for the dictionary, the dictionary is unchanged. The key to remove. key could not be converted to TKey. Returns an enumerator that enumerates all the entries in the dictionary. Each entry is returned as a DictionaryEntry. The entries are enumerated in the same orders as the (overridden) GetEnumerator method. An enumerator for enumerating all the elements in the OrderedDictionary. Returns an enumerator that enumerates all the entries in the dictionary. Each entry is returned as a DictionaryEntry. The entries are enumerated in the same orders as the (overridden) GetEnumerator method. An enumerator for enumerating all the elements in the OrderedDictionary. Display the contents of the dictionary in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). The indexer of the dictionary. This is used to store keys and values and retrieve values from the dictionary. The setter accessor must be overridden in the derived class. Key to find in the dictionary. The value associated with the key. Thrown from the get accessor if the key was not found in the dictionary. Returns a collection of the keys in this dictionary. A read-only collection of the keys in this dictionary. Returns a collection of the values in this dictionary. The ordering of values in this collection is the same as that in the Keys collection. A read-only collection of the values in this dictionary. Returns whether this dictionary is fixed size. This implemented always returns false. Always returns false. Returns if this dictionary is read-only. This implementation always returns false. Always returns false. Returns a collection of all the keys in the dictionary. The values in this collection will be enumerated in the same order as the (overridden) GetEnumerator method. The collection of keys. Returns a collection of all the values in the dictionary. The values in this collection will be enumerated in the same order as the (overridden) GetEnumerator method. The collection of values. Gets or sets the value associated with a given key. When getting a value, if this key is not found in the collection, then null is returned. When setting a value, the value replaces any existing value in the dictionary. If either the key or value are not of the correct type for this dictionary, an ArgumentException is thrown. The value associated with the key, or null if the key was not present. key could not be converted to TKey, or value could not be converted to TValue. A private class that implements ICollection<TKey> and ICollection for the Keys collection. The collection is read-only. ReadOnlyCollectionBase is a base class that can be used to more easily implement the generic ICollection<T> and non-generic ICollection interfaces for a read-only collection: a collection that does not allow adding or removing elements. To use ReadOnlyCollectionBase as a base class, the derived class must override the Count and GetEnumerator methods. ICollection<T>.Contains need not be implemented by the derived class, but it should be strongly considered, because the ReadOnlyCollectionBase implementation may not be very efficient. The item type of the collection. Creates a new ReadOnlyCollectionBase. Throws an NotSupportedException stating that this collection cannot be modified. Shows the string representation of the collection. The string representation contains a list of the items in the collection. The string representation of the collection. Determines if the collection contains any item that satisfies the condition defined by . A delegate that defines the condition to check for. True if the collection contains one or more items that satisfy the condition defined by . False if the collection does not contain an item that satisfies . Determines if all of the items in the collection satisfy the condition defined by . A delegate that defines the condition to check for. True if all of the items in the collection satisfy the condition defined by , or if the collection is empty. False if one or more items in the collection do not satisfy . Counts the number of items in the collection that satisfy the condition defined by . A delegate that defines the condition to check for. The number of items in the collection that satisfy . Enumerates the items in the collection that satisfy the condition defined by . A delegate that defines the condition to check for. An IEnumerable<T> that enumerates the items that satisfy the condition. Performs the specified action on each item in this collection. An Action delegate which is invoked for each item in this collection. Convert this collection of items by applying a delegate to each item in the collection. The resulting enumeration contains the result of applying to each item in this collection, in order. The type each item is being converted to. A delegate to the method to call, passing each item in this collection. An IEnumerable<TOutput^gt; that enumerates the resulting collection from applying to each item in this collection in order. is null. This method throws an NotSupportedException stating the collection is read-only. Item to be added to the collection. Always thrown. This method throws an NotSupportedException stating the collection is read-only. Always thrown. This method throws an NotSupportedException stating the collection is read-only. Item to be removed from the collection. Always thrown. Determines if the collection contains a particular item. This default implementation iterates all of the items in the collection via GetEnumerator, testing each item against using IComparable<T>.Equals or Object.Equals. You should strongly consider overriding this method to provide a more efficient implementation. The item to check for in the collection. True if the collection contains , false otherwise. Copies all the items in the collection into an array. Implemented by using the enumerator returned from GetEnumerator to get all the items and copy them to the provided array. Array to copy to. Starting index in to copy to. Creates an array of the correct size, and copies all the items in the collection into the array, by calling CopyTo. An array containing all the elements in the collection, in order. Must be overridden to enumerate all the members of the collection. A generic IEnumerator<T> that can be used to enumerate all the items in the collection. Copies all the items in the collection into an array. Implemented by using the enumerator returned from GetEnumerator to get all the items and copy them to the provided array. Array to copy to. Starting index in to copy to. Provides an IEnumerator that can be used to iterate all the members of the collection. This implementation uses the IEnumerator<T> that was overridden by the derived classes to enumerate the members of the collection. An IEnumerator that can be used to iterate the collection. Display the contents of the collection in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). Must be overridden to provide the number of items in the collection. The number of items in the collection. Indicates whether the collection is read-only. Returns the value of readOnly that was provided to the constructor. Always true. Indicates whether the collection is synchronized. Always returns false, indicating that the collection is not synchronized. Indicates the synchronization object for this collection. Always returns this. Constructor. The dictionary this is associated with. A private class that implements ICollection<TValue> and ICollection for the Values collection. The collection is read-only. A class that wraps a IDictionaryEnumerator around an IEnumerator that enumerates KeyValuePairs. This is useful in implementing IDictionary, because IEnumerator can be implemented with an iterator, but IDictionaryEnumerator cannot. Constructor. The enumerator of KeyValuePairs that is being wrapped. Helper function to create a new KeyValuePair struct. The key. The value. A new KeyValuePair. Helper function to create a new KeyValuePair struct with a default value. The key. A new KeyValuePair. Creates a new OrderedDictionary. The TKey must implemented IComparable<TKey> or IComparable. The CompareTo method of this interface will be used to compare keys in this dictionary. TKey does not implement IComparable<TKey>. Creates a new OrderedDictionary. The Compare method of the passed comparison object will be used to compare keys in this dictionary. The GetHashCode and Equals methods of the provided IComparer<TKey> will never be called, and need not be implemented. An instance of IComparer<TKey> that will be used to compare keys. Creates a new OrderedDictionary. The passed delegate will be used to compare keys in this dictionary. A delegate to a method that will be used to compare keys. Creates a new OrderedDictionary. The TKey must implemented IComparable<TKey> or IComparable. The CompareTo method of this interface will be used to compare keys in this dictionary. A collection and keys and values (typically another dictionary) is used to initialized the contents of the dictionary. A collection of keys and values whose contents are used to initialized the dictionary. TKey does not implement IComparable<TKey>. Creates a new OrderedDictionary. The Compare method of the passed comparison object will be used to compare keys in this dictionary. A collection and keys and values (typically another dictionary) is used to initialized the contents of the dictionary. The GetHashCode and Equals methods of the provided IComparer<TKey> will never be called, and need not be implemented. A collection of keys and values whose contents are used to initialized the dictionary. An instance of IComparer<TKey> that will be used to compare keys. Creates a new OrderedDictionary. The passed delegate will be used to compare keys in this dictionary. A collection and keys and values (typically another dictionary) is used to initialized the contents of the dictionary. A collection of keys and values whose contents are used to initialized the dictionary. A delegate to a method that will be used to compare keys. Creates a new OrderedDictionary. The passed comparer will be used to compare key-value pairs in this dictionary. Used internally from other constructors. A collection of keys and values whose contents are used to initialized the dictionary. An IComparer that will be used to compare keys. An IComparer that will be used to compare key-value pairs. Creates a new OrderedDictionary. The passed comparison delegate will be used to compare keys in this dictionary, and the given tree is used. Used internally for Clone(). An IComparer that will be used to compare keys. A delegate to a method that will be used to compare key-value pairs. RedBlackTree that contains the data for the dictionary. Makes a shallow clone of this dictionary; i.e., if keys or values of the dictionary are reference types, then they are not cloned. If TKey or TValue is a value type, then each element is copied as if by simple assignment. Cloning the dictionary takes time O(N), where N is the number of keys in the dictionary. The cloned dictionary. Throw an InvalidOperationException indicating that this type is not cloneable. Type to test. Makes a deep clone of this dictionary. A new dictionary is created with a clone of each entry of this dictionary, by calling ICloneable.Clone on each element. If TKey or TValue is a value type, then each element is copied as if by simple assignment. If TKey or TValue is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the dictionary takes time O(N log N), where N is the number of keys in the dictionary. The cloned dictionary. TKey or TValue is a reference type that does not implement ICloneable. Returns a View collection that can be used for enumerating the keys and values in the collection in reversed order.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(KeyValuePair<TKey, TValue> pair in dictionary.Reversed()) { // process pair }

If an entry is added to or deleted from the dictionary while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Reverse does not copy the data in the dictionary, and the operation takes constant time.

An OrderedDictionary.View of key-value pairs in reverse order.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only keys that are greater than and less than are included. The keys are enumerated in sorted order. Keys equal to the end points of the range can be included or excluded depending on the and parameters.

If is greater than or equal to , the returned collection is empty.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.Range(from, true, to, false)) { // process pair }

Calling Range does not copy the data in the dictionary, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--keys equal to the lower bound will be included in the range. If false, the lower bound is exclusive--keys equal to the lower bound will not be included in the range. The upper bound of the range. If true, the upper bound is inclusive--keys equal to the upper bound will be included in the range. If false, the upper bound is exclusive--keys equal to the upper bound will not be included in the range. An OrderedDictionary.View of key-value pairs in the given range.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only keys that are greater than (and optionally, equal to) are included. The keys are enumerated in sorted order. Keys equal to can be included or excluded depending on the parameter.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.RangeFrom(from, true)) { // process pair }

Calling RangeFrom does not copy of the data in the dictionary, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--keys equal to the lower bound will be included in the range. If false, the lower bound is exclusive--keys equal to the lower bound will not be included in the range. An OrderedDictionary.View of key-value pairs in the given range.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only items that are less than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.RangeFrom(from, false)) { // process pair }

Calling RangeTo does not copy the data in the dictionary, and the operation takes constant time.

The upper bound of the range. If true, the upper bound is inclusive--keys equal to the upper bound will be included in the range. If false, the upper bound is exclusive--keys equal to the upper bound will not be included in the range. An OrderedDictionary.View of key-value pairs in the given range.
Removes the key (and associated value) from the collection that is equal to the passed in key. If no key in the dictionary is equal to the passed key, false is returned and the dictionary is unchanged. Equality between keys is determined by the comparison instance or delegate used to create the dictionary. The key to remove. True if the key was found and removed. False if the key was not found. Removes all keys and values from the dictionary. Clearing the dictionary takes a constant amount of time, regardless of the number of keys in it. Finds a key in the dictionary. If the dictionary already contains a key equal to the passed key, then the existing value is returned via value. If the dictionary doesn't contain that key, then value is associated with that key. between keys is determined by the comparison instance or delegate used to create the dictionary. This method takes time O(log N), where N is the number of keys in the dictionary. If a value is added, It is more efficient than calling TryGetValue followed by Add, because the dictionary is not searched twice. The new key. The new value to associated with that key, if the key isn't present. If the key was present, returns the exist value associated with that key. True if key was already present, false if key wasn't present (and a new value was added). Adds a new key and value to the dictionary. If the dictionary already contains a key equal to the passed key, then an ArgumentException is thrown Equality between keys is determined by the comparison instance or delegate used to create the dictionary. Adding an key and value takes time O(log N), where N is the number of keys in the dictionary. The new key. "null" is a valid key value. The new value to associated with that key. key is already present in the dictionary Changes the value associated with a given key. If the dictionary does not contain a key equal to the passed key, then an ArgumentException is thrown.

Unlike adding or removing an element, changing the value associated with a key can be performed while an enumeration (foreach) on the the dictionary is in progress.

Equality between keys is determined by the comparison instance or delegate used to create the dictionary.

Replace takes time O(log N), where N is the number of entries in the dictionary.

The new key. The new value to associated with that key. key is not present in the dictionary
Adds multiple key-value pairs to a dictionary. If a key exists in both the current instance and dictionaryToAdd, then the value is updated with the value from (no exception is thrown). Since IDictionary<TKey,TValue> inherits from IEnumerable<KeyValuePair<TKey,TValue>>, this method can be used to merge one dictionary into another. AddMany takes time O(M log (N+M)), where M is the size of , and N is the size of this dictionary. A collection of keys and values whose contents are added to the current dictionary. Removes all the keys found in another collection (such as an array or List<TKey>). Each key in keyCollectionToRemove is removed from the dictionary. Keys that are not present are ignored. RemoveMany takes time O(M log N), where M is the size of keyCollectionToRemove, and N is this size of this collection. The number of keys removed from the dictionary. A collection of keys to remove from the dictionary. Determines if this dictionary contains a key equal to . The dictionary is not changed. Searching the dictionary for a key takes time O(log N), where N is the number of keys in the dictionary. The key to search for. True if the dictionary contains key. False if the dictionary does not contain key. Determines if this dictionary contains a key equal to . If so, the value associated with that key is returned through the value parameter. TryGetValue takes time O(log N), where N is the number of entries in the dictionary. The key to search for. Returns the value associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Returns an enumerator that enumerates all the entries in the dictionary. Each entry is returned as a KeyValuePair<TKey,TValue>. The entries are enumerated in the sorted order of the keys.

Typically, this method is not called directly. Instead the "foreach" statement is used to enumerate the elements of the dictionary, which uses this method implicitly.

If an element is added to or deleted from the dictionary while it is being enumerated, then the enumeration will end with an InvalidOperationException.

Enumeration all the entries in the dictionary takes time O(N log N), where N is the number of entries in the dictionary.

An enumerator for enumerating all the elements in the OrderedDictionary.
Implements ICloneable.Clone. Makes a shallow clone of this dictionary; i.e., if keys or values are reference types, then they are not cloned. The cloned dictionary. Returns the IComparer<T> used to compare keys in this dictionary. If the dictionary was created using a comparer, that comparer is returned. If the dictionary was created using a comparison delegate, then a comparer equivalent to that delegate is returned. Otherwise the default comparer for TKey (Comparer<TKey>.Default) is returned. Gets or sets the value associated with a given key. When getting a value, if this key is not found in the collection, then an ArgumentException is thrown. When setting a value, the value replaces any existing value in the dictionary. The indexer takes time O(log N), where N is the number of entries in the dictionary. The value associated with the key A value is being retrieved, and the key is not present in the dictionary. is null. Returns the number of keys in the dictionary. The size of the dictionary is returned in constant time.. The number of keys in the dictionary. The OrderedDictionary<TKey,TValue>.View class is used to look at a subset of the keys and values inside an ordered dictionary. It is returned from the Range, RangeTo, RangeFrom, and Reversed methods.

Views are dynamic. If the underlying dictionary changes, the view changes in sync. If a change is made to the view, the underlying dictionary changes accordingly.

Typically, this class is used in conjunction with a foreach statement to enumerate the keys and values in a subset of the OrderedDictionary. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.Range(from, to)) { // process pair }
Initialize the View. Associated OrderedDictionary to be viewed. Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Is the view enuemerated in reverse order? Determine if the given key lies within the bounds of this view. Key to test. True if the key is within the bounds of this view. Enumerate all the keys and values in this view. An IEnumerator of KeyValuePairs with the keys and views in this view. Tests if the key is present in the part of the dictionary being viewed. Key to check for. True if the key is within this view. Determines if this view contains a key equal to . If so, the value associated with that key is returned through the value parameter. The key to search for. Returns the value associated with key, if true was returned. True if the key is within this view. Removes the key (and associated value) from the underlying dictionary of this view. that is equal to the passed in key. If no key in the view is equal to the passed key, the dictionary and view are unchanged. The key to remove. True if the key was found and removed. False if the key was not found. Removes all the keys and values within this view from the underlying OrderedDictionary. The following removes all the keys that start with "A" from an OrderedDictionary. dictionary.Range("A", "B").Clear(); Creates a new View that has the same keys and values as this, in the reversed order. A new View that has the reversed order of this view. Number of keys in this view. Number of keys that lie within the bounds the view. Gets or sets the value associated with a given key. When getting a value, if this key is not found in the collection, then an ArgumentException is thrown. When setting a value, the value replaces any existing value in the dictionary. When setting a value, the key must be within the range of keys being viewed. The value associated with the key. A value is being retrieved, and the key is not present in the dictionary, or a value is being set, and the key is outside the range of keys being viewed by this View. ReadOnlyDictionaryBase is a base class that can be used to more easily implement the generic IDictionary<T> and non-generic IDictionary interfaces. To use ReadOnlyDictionaryBase as a base class, the derived class must override Count, TryGetValue, GetEnumerator. The key type of the dictionary. The value type of the dictionary. Creates a new DictionaryBase. This must be called from the constructor of the derived class to specify whether the dictionary is read-only and the name of the collection. Throws an NotSupportedException stating that this collection cannot be modified. Adds a new key-value pair to the dictionary. Always throws an exception indicating that this method is not supported in a read-only dictionary. Key to add. Value to associated with the key. Always thrown. Removes a key from the dictionary. Always throws an exception indicating that this method is not supported in a read-only dictionary. Key to remove from the dictionary. True if the key was found, false otherwise. Always thrown. Determines whether a given key is found in the dictionary. The default implementation simply calls TryGetValue and returns what it returns. Key to look for in the dictionary. True if the key is present in the dictionary. Determines if this dictionary contains a key equal to . If so, the value associated with that key is returned through the value parameter. This method must be overridden in the derived class. The key to search for. Returns the value associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Shows the string representation of the dictionary. The string representation contains a list of the mappings in the dictionary. The string representation of the dictionary. Determines if a dictionary contains a given KeyValuePair. This implementation checks to see if the dictionary contains the given key, and if the value associated with the key is equal to (via object.Equals) the value. A KeyValuePair containing the Key and Value to check for. Adds a key-value pair to the collection. Always throws an exception indicating that this method is not supported in a read-only dictionary. Key to add to the dictionary. Value to add to the dictionary. Always thrown. Clears this dictionary. Always throws an exception indicating that this method is not supported in a read-only dictionary. Always thrown. Determines if this dictionary contains a key equal to . The dictionary is not changed. Calls the (overridden) ContainsKey method. If key is not of the correct TKey for the dictionary, false is returned. The key to search for. True if the dictionary contains key. False if the dictionary does not contain key. Removes the key (and associated value) from the collection that is equal to the passed in key. Always throws an exception indicating that this method is not supported in a read-only dictionary. The key to remove. Always thrown. Returns an enumerator that enumerates all the entries in the dictionary. Each entry is returned as a DictionaryEntry. The entries are enumerated in the same orders as the (overridden) GetEnumerator method. An enumerator for enumerating all the elements in the OrderedDictionary. Returns an enumerator that enumerates all the entries in the dictionary. Each entry is returned as a DictionaryEntry. The entries are enumerated in the same orders as the (overridden) GetEnumerator method. An enumerator for enumerating all the elements in the OrderedDictionary. Display the contents of the dictionary in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). The indexer of the dictionary. The set accessor throws an NotSupportedException stating the dictionary is read-only. The get accessor is implemented by calling TryGetValue. Key to find in the dictionary. The value associated with the key. Always thrown from the set accessor, indicating that the dictionary is read only. Thrown from the get accessor if the key was not found. Returns a collection of the keys in this dictionary. A read-only collection of the keys in this dictionary. Returns a collection of the values in this dictionary. The ordering of values in this collection is the same as that in the Keys collection. A read-only collection of the values in this dictionary. Returns whether this dictionary is fixed size. Always returns true. Returns if this dictionary is read-only. Always returns true. Returns a collection of all the keys in the dictionary. The values in this collection will be enumerated in the same order as the (overridden) GetEnumerator method. The collection of keys. Returns a collection of all the values in the dictionary. The values in this collection will be enumerated in the same order as the (overridden) GetEnumerator method. The collection of values. Gets the value associated with a given key. When getting a value, if this key is not found in the collection, then null is returned. If the key is not of the correct type for this dictionary, null is returned. The value associated with the key, or null if the key was not present. Always thrown from the set accessor, indicating that the dictionary is read only. A private class that implements ICollection<TKey> and ICollection for the Keys collection. The collection is read-only. Constructor. The dictionary this is associated with. A private class that implements ICollection<TKey> and ICollection for the Values collection. The collection is read-only. A class that wraps a IDictionaryEnumerator around an IEnumerator that enumerates KeyValuePairs. This is useful in implementing IDictionary, because IEnumerator can be implemented with an iterator, but IDictionaryEnumerator cannot. Constructor. The enumerator of KeyValuePairs that is being wrapped. OrderedBag<T> is a collection that contains items of type T. The item are maintained in a sorted order. Unlike a OrderedSet, duplicate items (items that compare equal to each other) are allows in an OrderedBag.

The items are compared in one of three ways. If T implements IComparable<TKey> or IComparable, then the CompareTo method of that interface will be used to compare items. Alternatively, a comparison function can be passed in either as a delegate, or as an instance of IComparer<TKey>.

OrderedBag is implemented as a balanced binary tree. Inserting, deleting, and looking up an an element all are done in log(N) + M time, where N is the number of keys in the tree, and M is the current number of copies of the element being handled.

is similar, but uses hashing instead of comparison, and does not maintain the keys in sorted order.

Creates a new OrderedBag. The T must implement IComparable<T> or IComparable. The CompareTo method of this interface will be used to compare items in this bag. Items that are null are permitted, and will be sorted before all other items. T does not implement IComparable<TKey>. Creates a new OrderedBag. The passed delegate will be used to compare items in this bag. A delegate to a method that will be used to compare items. Creates a new OrderedBag. The Compare method of the passed comparison object will be used to compare items in this bag. The GetHashCode and Equals methods of the provided IComparer<T> will never be called, and need not be implemented. An instance of IComparer<T> that will be used to compare items. Creates a new OrderedBag. The T must implement IComparable<T> or IComparable. The CompareTo method of this interface will be used to compare items in this bag. The bag is initialized with all the items in the given collection. Items that are null are permitted, and will be sorted before all other items. A collection with items to be placed into the OrderedBag. T does not implement IComparable<TKey>. Creates a new OrderedBag. The passed delegate will be used to compare items in this bag. The bag is initialized with all the items in the given collection. A collection with items to be placed into the OrderedBag. A delegate to a method that will be used to compare items. Creates a new OrderedBag. The Compare method of the passed comparison object will be used to compare items in this bag. The bag is initialized with all the items in the given collection. The GetHashCode and Equals methods of the provided IComparer<T> will never be called, and need not be implemented. A collection with items to be placed into the OrderedBag. An instance of IComparer<T> that will be used to compare items. Creates a new OrderedBag given a comparer and a tree that contains the data. Used internally for Clone. Comparer for the bag. Data for the bag. Makes a shallow clone of this bag; i.e., if items of the bag are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the bag takes time O(N), where N is the number of items in the bag. The cloned bag. Makes a shallow clone of this bag; i.e., if items of the bag are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the bag takes time O(N), where N is the number of items in the bag. The cloned bag. Makes a deep clone of this bag. A new bag is created with a clone of each element of this bag, by calling ICloneable.Clone on each element. If T is a value type, then each element is copied as if by simple assignment. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the bag takes time O(N log N), where N is the number of items in the bag. The cloned bag. T is a reference type that does not implement ICloneable. Returns the number of copies of in the bag. More precisely, returns the number of items in the bag that compare equal to . NumberOfCopies() takes time O(log N + M), where N is the total number of items in the bag, and M is the number of copies of in the bag. The item to search for in the bag. The number of items in the bag that compare equal to . Returns an enumerator that enumerates all the items in the bag. The items are enumerated in sorted order.

Typically, this method is not called directly. Instead the "foreach" statement is used to enumerate the items, which uses this method implicitly.

If an item is added to or deleted from the bag while it is being enumerated, then the enumeration will end with an InvalidOperationException.

Enumeration all the items in the bag takes time O(N), where N is the number of items in the bag.

An enumerator for enumerating all the items in the OrderedBag.
Determines if this bag contains an item equal to . The bag is not changed. Searching the bag for an item takes time O(log N), where N is the number of items in the bag. The item to search for. True if the bag contains . False if the bag does not contain . Enumerates all of the items in this bag that are equal to , according to the comparison mechanism that was used when the bag was created. The bag is not changed. If the bag does contain an item equal to , then the enumeration contains no items. Enumeration the items in the bag equal to takes time O(log N + M), where N is the total number of items in the bag, and M is the number of items equal to . The item to search for. An IEnumerable<T> that enumerates all the items in the bag equal to . Enumerates all the items in the bag, but enumerates equal items just once, even if they occur multiple times in the bag. If the bag is changed while items are being enumerated, the enumeration will terminate with an InvalidOperationException. An IEnumerable<T> that enumerates the unique items. Get the index of the given item in the sorted order. The smallest item has index 0, the next smallest item has index 1, and the largest item has index Count-1. If multiple equal items exist, the largest index of the equal items is returned. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the last item in the sorted bag equal to , or -1 if the item is not present in the set. Get the index of the given item in the sorted order. The smallest item has index 0, the next smallest item has index 1, and the largest item has index Count-1. If multiple equal items exist, the smallest index of the equal items is returned. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the first item in the sorted bag equal to , or -1 if the item is not present in the set. Adds a new item to the bag. Since bags can contain duplicate items, the item is added even if the bag already contains an item equal to . In this case, the new item is placed after all equal items already present in the bag. Adding an item takes time O(log N), where N is the number of items in the bag. The item to add to the bag. Adds all the items in to the bag. Adding the collection takes time O(M log N), where N is the number of items in the bag, and M is the number of items in . A collection of items to add to the bag. is null. Searches the bag for one item equal to , and if found, removes it from the bag. If not found, the bag is unchanged. If more than one item equal to , the item that was last inserted is removed. Equality between items is determined by the comparison instance or delegate used to create the bag. Removing an item from the bag takes time O(log N), where N is the number of items in the bag. The item to remove. True if was found and removed. False if was not in the bag. Searches the bag for all items equal to , and removes all of them from the bag. If not found, the bag is unchanged. Equality between items is determined by the comparison instance or delegate used to create the bag. RemoveAllCopies() takes time O(M log N), where N is the total number of items in the bag, and M is the number of items equal to . The item to remove. The number of copies of that were found and removed. Removes all the items in from the bag. Items not present in the bag are ignored. Equality between items is determined by the comparison instance or delegate used to create the bag. Removing the collection takes time O(M log N), where N is the number of items in the bag, and M is the number of items in . A collection of items to remove from the bag. The number of items removed from the bag. is null. Removes all items from the bag. Clearing the bag takes a constant amount of time, regardless of the number of items in it. If the collection is empty, throw an invalid operation exception. The bag is empty. Returns the first item in the bag: the item that would appear first if the bag was enumerated. This is also the smallest item in the bag. GetFirst() takes time O(log N), where N is the number of items in the bag. The first item in the bag. If more than one item is smallest, the first one added is returned. The bag is empty. Returns the last item in the bag: the item that would appear last if the bag was enumerated. This is also the largest item in the bag. GetLast() takes time O(log N), where N is the number of items in the bag. The last item in the bag. If more than one item is largest, the last one added is returned. The bag is empty. Removes the first item in the bag. This is also the smallest item in the bag. RemoveFirst() takes time O(log N), where N is the number of items in the bag. The item that was removed, which was the smallest item in the bag. The bag is empty. Removes the last item in the bag. This is also the largest item in the bag. RemoveLast() takes time O(log N), where N is the number of items in the bag. The item that was removed, which was the largest item in the bag. The bag is empty. Check that this bag and another bag were created with the same comparison mechanism. Throws exception if not compatible. Other bag to check comparision mechanism. If otherBag and this bag don't use the same method for comparing items. is null. Determines if this bag is a superset of another bag. Neither bag is modified. This bag is a superset of if every element in is also in this bag, at least the same number of times. IsSupersetOf is computed in time O(M log N), where M is the size of the , and N is the size of the this set. OrderedBag to compare to. True if this is a superset of . This bag and don't use the same method for comparing items. is null. Determines if this bag is a proper superset of another bag. Neither bag is modified. This bag is a proper superset of if every element in is also in this bag, at least the same number of times. Additional, this bag must have strictly more items than . IsProperSupersetOf is computed in time O(M log N), where M is the number of unique items in . OrderedBag to compare to. True if this is a proper superset of . This bag and don't use the same method for comparing items. is null. Determines if this bag is a subset of another bag. Neither bag is modified. This bag is a subset of if every element in this bag is also in , at least the same number of times. IsSubsetOf is computed in time O(N log M), where M is the size of the , and N is the size of the this bag. OrderedBag to compare to. True if this is a subset of . This bag and don't use the same method for comparing items. is null. Determines if this bag is a proper subset of another bag. Neither bag is modified. This bag is a subset of if every element in this bag is also in , at least the same number of times. Additional, this bag must have strictly fewer items than . IsSubsetOf is computed in time O(N log M), where M is the size of the , and N is the size of the this bag. OrderedBag to compare to. True if this is a proper subset of . This bag and don't use the same method for comparing items. is null. Determines if this bag is disjoint from another bag. Two bags are disjoint if no item from one set is equal to any item in the other bag. The answer is computed in time O(N), where N is the size of the smaller set. Bag to check disjointness with. True if the two bags are disjoint, false otherwise. This bag and don't use the same method for comparing items. Determines if this bag is equal to another bag. This bag is equal to if they contain the same items, each the same number of times. IsEqualTo is computed in time O(N), where N is the number of items in this bag. OrderedBag to compare to True if this bag is equal to , false otherwise. This bag and don't use the same method for comparing items. Computes the union of this bag with another bag. The union of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the union contains the item Maximum(X,Y) times. This bag receives the union of the two bags, the other bag is unchanged. The union of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to union with. This bag and don't use the same method for comparing items. is null. Computes the union of this bag with another bag. The union of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the union contains the item Maximum(X,Y) times. A new bag is created with the union of the bags and is returned. This bag and the other bag are unchanged. The union of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to union with. The union of the two bags. This bag and don't use the same method for comparing items. is null. Computes the sum of this bag with another bag. The sum of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item (X+Y) times. This bag receives the sum of the two bags, the other bag is unchanged. The sum of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to sum with. This bag and don't use the same method for comparing items. is null. Computes the sum of this bag with another bag. he sum of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item (X+Y) times. A new bag is created with the sum of the bags and is returned. This bag and the other bag are unchanged. The sum of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to sum with. The sum of the two bags. This bag and don't use the same method for comparing items. is null. Computes the intersection of this bag with another bag. The intersection of two bags is all items that appear in both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item Minimum(X,Y) times. This bag receives the intersection of the two bags, the other bag is unchanged. When equal items appear in both bags, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two bags is computed in time O(N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to intersection with. This bag and don't use the same method for comparing items. is null. Computes the intersection of this bag with another bag. The intersection of two bags is all items that appear in both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item Minimum(X,Y) times. A new bag is created with the intersection of the bags and is returned. This bag and the other bag are unchanged. When equal items appear in both bags, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two bags is computed in time O(N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to intersection with. The intersection of the two bags. This bag and don't use the same method for comparing items. is null. Computes the difference of this bag with another bag. The difference of these two bags is all items that appear in this bag, but not in . If an item appears X times in this bag, and Y times in the other bag, the difference contains the item X - Y times (zero times if Y >= X). This bag receives the difference of the two bags; the other bag is unchanged. The difference of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to difference with. This bag and don't use the same method for comparing items. is null. Computes the difference of this bag with another bag. The difference of these two bags is all items that appear in this bag, but not in . If an item appears X times in this bag, and Y times in the other bag, the difference contains the item X - Y times (zero times if Y >= X). A new bag is created with the difference of the bags and is returned. This bag and the other bag are unchanged. The difference of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to difference with. The difference of the two bags. This bag and don't use the same method for comparing items. is null. Computes the symmetric difference of this bag with another bag. The symmetric difference of two bags is all items that appear in either of the bags, but not both. If an item appears X times in one bag, and Y times in the other bag, the symmetric difference contains the item AbsoluteValue(X - Y times). This bag receives the symmetric difference of the two bags; the other bag is unchanged. The symmetric difference of two bags is computed in time O(M + N), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to symmetric difference with. This bag and don't use the same method for comparing items. is null. Computes the symmetric difference of this bag with another bag. The symmetric difference of two bags is all items that appear in either of the bags, but not both. If an item appears X times in one bag, and Y times in the other bag, the symmetric difference contains the item AbsoluteValue(X - Y times). A new bag is created with the symmetric difference of the bags and is returned. This bag and the other bag are unchanged. The symmetric difference of two bags is computed in time O(M + N), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to symmetric difference with. The symmetric difference of the two bags. This bag and don't use the same method for comparing items. is null. Get a read-only list view of the items in this ordered bag. The items in the list are in sorted order, with the smallest item at index 0. This view does not copy any data, and reflects any changes to the underlying OrderedBag. A read-only IList<T> view onto this OrderedBag. Returns a View collection that can be used for enumerating the items in the bag in reversed order.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in bag.Reversed()) { // process item }

If an item is added to or deleted from the bag while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Reverse does not copy the data in the tree, and the operation takes constant time.

An OrderedBag.View of items in reverse order.
Returns a View collection that can be used for enumerating a range of the items in the bag. Only items that are greater than and less than are included. The items are enumerated in sorted order. Items equal to the end points of the range can be included or excluded depending on the and parameters.

If is greater than or equal to , the returned collection is empty.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in bag.Range(from, true, to, false)) { // process item }

If an item is added to or deleted from the bag while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Range does not copy the data in the tree, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--items equal to the lower bound will be included in the range. If false, the lower bound is exclusive--items equal to the lower bound will not be included in the range. The upper bound of the range. If true, the upper bound is inclusive--items equal to the upper bound will be included in the range. If false, the upper bound is exclusive--items equal to the upper bound will not be included in the range. An OrderedBag.View of items in the given range.
Returns a View collection that can be used for enumerating a range of the items in the bag. Only items that are greater than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in bag.RangeFrom(from, true)) { // process item }

If an item is added to or deleted from the bag while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling RangeFrom does not copy the data in the tree, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--items equal to the lower bound will be included in the range. If false, the lower bound is exclusive--items equal to the lower bound will not be included in the range. An OrderedBag.View of items in the given range.
Returns a View collection that can be used for enumerating a range of the items in the bag. Only items that are less than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in bag.RangeTo(to, false)) { // process item }

If an item is added to or deleted from the bag while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling RangeTo does not copy the data in the tree, and the operation takes constant time.

The upper bound of the range. If true, the upper bound is inclusive--items equal to the upper bound will be included in the range. If false, the upper bound is exclusive--items equal to the upper bound will not be included in the range. An OrderedBag.View of items in the given range.
Returns the IComparer<T> used to compare items in this bag. If the bag was created using a comparer, that comparer is returned. If the bag was created using a comparison delegate, then a comparer equivalent to that delegate is returned. Otherwise the default comparer for T (Comparer<T>.Default) is returned. Returns the number of items in the bag. The size of the bag is returned in constant time. The number of items in the bag. Get the item by its index in the sorted order. The smallest item has index 0, the next smallest item has index 1, and the largest item has index Count-1. The indexer takes time O(log N), which N is the number of items in the set. The index to get the item by. The item at the given index. is less than zero or greater than or equal to Count. The nested class that provides a read-only list view of all or part of the collection. ReadOnlyListBase is an abstract class that can be used as a base class for a read-only collection that needs to implement the generic IList<T> and non-generic IList collections. The derived class needs to override the Count property and the get part of the indexer. The implementation of all the other methods in IList<T> and IList are handled by ListBase. Creates a new ReadOnlyListBase. Throws an NotSupportedException stating that this collection cannot be modified. Enumerates all of the items in the list, in order. The item at index 0 is enumerated first, then the item at index 1, and so on. An IEnumerator<T> that enumerates all the items in the list. Determines if the list contains any item that compares equal to . The implementation simply checks whether IndexOf(item) returns a non-negative value. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. True if the list contains an item that compares equal to . Copies all the items in the list, in order, to , starting at index 0. The array to copy to. This array must have a size that is greater than or equal to Count. Copies all the items in the list, in order, to , starting at . The array to copy to. This array must have a size that is greater than or equal to Count + arrayIndex. The starting index in to copy to. Copies a range of elements from the list to , starting at . The starting index in the source list of the range to copy. The array to copy to. This array must have a size that is greater than or equal to Count + arrayIndex. The starting index in to copy to. The number of items to copy. Finds the first item in the list that satisfies the condition defined by . If no item matches the condition, than the default value for T (null or all-zero) is returned. If the default value for T (null or all-zero) matches the condition defined by , and the list might contain the default value, then it is impossible to distinguish the different between finding the default value and not finding any item. To distinguish these cases, use . A delegate that defined the condition to check for. The first item that satisfies the condition . If no item satisfies that condition, the default value for T is returned. Finds the first item in the list that satisfies the condition defined by . A delegate that defines the condition to check for. If true is returned, this parameter receives the first item in the list that satifies the condition defined by . True if an item that satisfies the condition was found. False if no item in the list satisfies that condition. Finds the last item in the list that satisfies the condition defined by . If no item matches the condition, than the default value for T (null or all-zero) is returned. If the default value for T (null or all-zero) matches the condition defined by , and the list might contain the default value, then it is impossible to distinguish the different between finding the default value and not finding any item. To distinguish these cases, use . A delegate that defined the condition to check for. The last item that satisfies the condition . If no item satisfies that condition, the default value for T is returned. Finds the last item in the list that satisfies the condition defined by . A delegate that defines the condition to check for. If true is returned, this parameter receives the last item in the list that satifies the condition defined by . True if an item that satisfies the condition was found. False if no item in the list satisfies that condition. Finds the index of the first item in the list that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The index of the first item that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item, in the range of items extending from to the end, that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The starting index of the range to check. The index of the first item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item, in the range of items starting from , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The starting index of the range to check. The number of items in range to check. The index of the first item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item in the list that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The index of the last item that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item, in the range of items extending from the beginning of the list to , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The ending index of the range to check. The index of the last item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item, in the range of items ending at , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The ending index of the range to check. The number of items in range to check. The index of the last item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item in the list that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The index of the first item in the list that that is equal to . If no item is equal to , -1 is returned. Finds the index of the first item, in the range of items extending from to the end, that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The starting index of the range to check. The index of the first item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the first item, in the range of items starting from , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The starting index of the range to check. The number of items in range to check. The index of the first item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item in the list that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The index of the last item in the list that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item, in the range of items extending from the beginning of the list to , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The ending index of the range to check. The index of the last item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item, in the range of items ending at , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search for. The ending index of the range to check. The number of items in range to check. The index of the last item in the given range that that is equal to . If no item is equal to , -1 is returned. Returns a view onto a sub-range of this list. Items are not copied; the returned IList<T> is simply a different view onto the same underlying items. This method can be used to apply an algorithm to a portion of a list. For example: Algorithms.Reverse(deque.Range(3, 6)) will return the reverse opf the 6 items beginning at index 3. The starting index of the view. The number of items in the view. A list that is a view onto the given sub-part of this list. or is negative. + is greater than the size of the list. Inserts a new item at the given index. This implementation throws a NotSupportedException indicating that the list is read-only. The index in the list to insert the item at. After the insertion, the inserted item is located at this index. The first item in the list has index 0. The item to insert at the given index. Always thrown. Removes the item at the given index. This implementation throws a NotSupportedException indicating that the list is read-only. The index in the list to remove the item at. The first item in the list has index 0. Always thrown. Adds an item to the end of the list. This implementation throws a NotSupportedException indicating that the list is read-only. The item to add to the list. Always thrown. Removes all the items from the list, resulting in an empty list. This implementation throws a NotSupportedException indicating that the list is read-only. Always thrown. Determines if the list contains any item that compares equal to . Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. Find the first occurrence of an item equal to in the list, and returns the index of that item. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. The index of , or -1 if no item in the list compares equal to . Insert a new item at the given index. This implementation throws a NotSupportedException indicating that the list is read-only. The index in the list to insert the item at. After the insertion, the inserted item is located at this index. The first item in the list has index 0. The item to insert at the given index. Always thrown. Searches the list for the first item that compares equal to . If one is found, it is removed. Otherwise, the list is unchanged. This implementation throws a NotSupportedException indicating that the list is read-only. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to remove from the list. Always thrown. Removes the item at the given index. This implementation throws a NotSupportedException indicating that the list is read-only. The index in the list to remove the item at. The first item in the list has index 0. Always thrown. The property must be overridden by the derived class to return the number of items in the list. The number of items in the list. The get part of the indexer must be overridden by the derived class to get values of the list at a particular index. The index in the list to get or set an item at. The first item in the list has index 0, and the last has index Count-1. The item at the given index. is less than zero or greater than or equal to Count. Returns whether the list is a fixed size. This implementation always returns true. Alway true, indicating that the list is fixed size. Returns whether the list is read only. This implementation always returns true. Alway true, indicating that the list is read-only. Gets or sets the value at a particular index in the list. The index in the list to get or set an item at. The first item in the list has index 0, and the last has index Count-1. The item at the given index. is less than zero or greater than or equal to Count. cannot be converted to T. Always thrown from the setter, indicating that the list is read-only. Create a new list view wrapped the given set. The ordered bag to wrap. Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Used to optimize some operations. Is the view enuemerated in reverse order? The OrderedBag<T>.View class is used to look at a subset of the items inside an ordered bag. It is returned from the Range, RangeTo, RangeFrom, and Reversed methods.

Views are dynamic. If the underlying bag changes, the view changes in sync. If a change is made to the view, the underlying bag changes accordingly.

Typically, this class is used in conjunction with a foreach statement to enumerate the items in a subset of the OrderedBag. For example:

foreach(T item in bag.Range(from, to)) { // process item }
Initialize the view. OrderedBag being viewed Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Is the view enuemerated in reverse order? Determine if the given item lies within the bounds of this view. Item to test. True if the item is within the bounds of this view. Enumerate all the items in this view. An IEnumerator<T> with the items in this view. Removes all the items within this view from the underlying bag. The following removes all the items that start with "A" from an OrderedBag. bag.Range("A", "B").Clear(); Adds a new item to the bag underlying this View. If the bag already contains an item equal to , that item is replaces with . If is outside the range of this view, an InvalidOperationException is thrown. Equality between items is determined by the comparison instance or delegate used to create the bag. Adding an item takes time O(log N), where N is the number of items in the bag. The item to add. True if the bag already contained an item equal to (which was replaced), false otherwise. Searches the underlying bag for an item equal to , and if found, removes it from the bag. If not found, the bag is unchanged. If the item is outside the range of this view, the bag is unchanged. Equality between items is determined by the comparison instance or delegate used to create the bag. Removing an item from the bag takes time O(log N), where N is the number of items in the bag. The item to remove. True if was found and removed. False if was not in the bag, or was outside the range of this view. Determines if this view of the bag contains an item equal to . The bag is not changed. If Searching the bag for an item takes time O(log N), where N is the number of items in the bag. The item to search for. True if the bag contains , and is within the range of this view. False otherwise. Get the first index of the given item in the view. The smallest item in the view has index 0, the next smallest item has index 1, and the largest item has index Count-1. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the first item in the view equal to , or -1 if the item is not present in the view. Get the last index of the given item in the view. The smallest item in the view has index 0, the next smallest item has index 1, and the largest item has index Count-1. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the last item in the view equal to , or -1 if the item is not present in the view. Get a read-only list view of the items in this view. The items in the list are in sorted order, with the smallest item at index 0. This view does not copy any data, and reflects any changes to the underlying OrderedSet. A read-only IList<T> view onto this view. Creates a new View that has the same items as this view, in the reversed order. A new View that has the reversed order of this view, with the same upper and lower bounds. Returns the first item in this view: the item that would appear first if the view was enumerated. GetFirst() takes time O(log N), where N is the number of items in the bag. The first item in the view. The view has no items in it. Returns the last item in the view: the item that would appear last if the view was enumerated. GetLast() takes time O(log N), where N is the number of items in the bag. The last item in the view. The view has no items in it. Number of items in this view. Number of items that lie within the bounds the view. Get the item by its index in the sorted order. The smallest item in the view has index 0, the next smallest item has index 1, and the largest item has index Count-1. The indexer takes time O(log N), which N is the number of items in the set. The index to get the item by. The item at the given index. is less than zero or greater than or equal to Count. Stores a triple of objects within a single struct. This struct is useful to use as the T of a collection, or as the TKey or TValue of a dictionary. Comparers for the first and second type that are used to compare values. The first element of the triple. The second element of the triple. The thrid element of the triple. Creates a new triple with given elements. The first element of the triple. The second element of the triple. The third element of the triple. Determines if this triple is equal to another object. The triple is equal to another object if that object is a Triple, all element types are the same, and the all three elements compare equal using object.Equals. Object to compare for equality. True if the objects are equal. False if the objects are not equal. Determines if this triple is equal to another triple. Two triples are equal if the all three elements compare equal using IComparable<T>.Equals or object.Equals. Triple to compare with for equality. True if the triples are equal. False if the triples are not equal. Returns a hash code for the triple, suitable for use in a hash-table or other hashed collection. Two triples that compare equal (using Equals) will have the same hash code. The hash code for the triple is derived by combining the hash codes for each of the two elements of the triple. The hash code. Compares this triple to another triple of the some type. The triples are compared by using the IComparable<T> or IComparable interface on TFirst, TSecond, and TThird. The triples are compared by their first elements first, if their first elements are equal, then they are compared by their second elements. If their second elements are also equal, then they are compared by their third elements. If TFirst, TSecond, or TThird does not implement IComparable<T> or IComparable, then an NotSupportedException is thrown, because the triples cannot be compared. The triple to compare to. An integer indicating how this triple compares to . Less than zero indicates this triple is less than . Zero indicate this triple is equals to . Greater than zero indicates this triple is greater than . Either FirstSecond, TSecond, or TThird is not comparable via the IComparable<T> or IComparable interfaces. Compares this triple to another triple of the some type. The triples are compared by using the IComparable<T> or IComparable interface on TFirst, TSecond, and TThird. The triples are compared by their first elements first, if their first elements are equal, then they are compared by their second elements. If their second elements are also equal, then they are compared by their third elements. If TFirst, TSecond, or TThird does not implement IComparable<T> or IComparable, then an NotSupportedException is thrown, because the triples cannot be compared. The triple to compare to. An integer indicating how this triple compares to . Less than zero indicates this triple is less than . Zero indicate this triple is equals to . Greater than zero indicates this triple is greater than . is not of the correct type. Either FirstSecond, TSecond, or TThird is not comparable via the IComparable<T> or IComparable interfaces. Returns a string representation of the triple. The string representation of the triple is of the form: First: {0}, Second: {1}, Third: {2} where {0} is the result of First.ToString(), {1} is the result of Second.ToString(), and {2} is the result of Third.ToString() (or "null" if they are null.) The string representation of the triple. Determines if two triples are equal. Two triples are equal if the all three elements compare equal using IComparable<T>.Equals or object.Equals. First triple to compare. Second triple to compare. True if the triples are equal. False if the triples are not equal. Determines if two triples are not equal. Two triples are equal if the all three elements compare equal using IComparable<T>.Equals or object.Equals. First triple to compare. Second triple to compare. True if the triples are not equal. False if the triples are equal. A holder class for localizable strings that are used. Currently, these are not loaded from resources, but just coded into this class. To make this library localizable, simply change this class to load the given strings from resources. The MultiDictionary class that associates values with a key. Unlike an Dictionary, each key can have multiple values associated with it. When indexing an MultiDictionary, instead of a single value associated with a key, you retrieve an enumeration of values. When constructed, you can chose to allow the same value to be associated with a key multiple times, or only one time. The type of the keys. The of values associated with the keys. MultiDictionaryBase is a base class that can be used to more easily implement a class that associates multiple values to a single key. The class implements the generic IDictionary<TKey, ICollection<TValue>> interface. To use MultiDictionaryBase as a base class, the derived class must override Count, Clear, Add, Remove(TKey), Remove(TKey,TValue), Contains(TKey,TValue), EnumerateKeys, and TryEnumerateValuesForKey. It may wish consider overriding CountValues, CountAllValues, ContainsKey, and EqualValues, but these are not required. The key type of the dictionary. The value type of the dictionary. Creates a new MultiDictionaryBase. Clears the dictionary. This method must be overridden in the derived class. Enumerate all the keys in the dictionary. This method must be overridden by a derived class. An IEnumerator<TKey> that enumerates all of the keys in the collection that have at least one value associated with them. Enumerate all of the values associated with a given key. This method must be overridden by the derived class. If the key exists and has values associated with it, an enumerator for those values is returned throught . If the key does not exist, false is returned. The key to get values for. If true is returned, this parameter receives an enumerators that enumerates the values associated with that key. True if the key exists and has values associated with it. False otherwise. Adds a key-value pair to the collection. The value part of the pair must be a collection of values to associate with the key. If values are already associated with the given key, the new values are added to the ones associated with that key. A KeyValuePair contains the Key and Value collection to add. Implements IDictionary<TKey, IEnumerable<TValue>>.Add. If the key is already present, and ArgumentException is thrown. Otherwise, a new key is added, and new values are associated with that key. Key to add. Values to associate with that key. The key is already present in the dictionary. Adds new values to be associated with a key. If duplicate values are permitted, this method always adds new key-value pairs to the dictionary. If duplicate values are not permitted, and already has a value equal to one of associated with it, then that value is replaced, and the number of values associate with is unchanged. The key to associate with. A collection of values to associate with . Adds a new key-value pair to the dictionary. This method must be overridden in the derived class. Key to add. Value to associated with the key. key is already present in the dictionary Removes a key from the dictionary. This method must be overridden in the derived class. Key to remove from the dictionary. True if the key was found, false otherwise. Removes a key-value pair from the dictionary. This method must be overridden in the derived class. Key to remove from the dictionary. Associated value to remove from the dictionary. True if the key-value pair was found, false otherwise. Removes a set of values from a given key. If all values associated with a key are removed, then the key is removed also. A KeyValuePair contains a key and a set of values to remove from that key. True if at least one values was found and removed. Removes a collection of values from the values associated with a key. If the last value is removed from a key, the key is removed also. A key to remove values from. A collection of values to remove. The number of values that were present and removed. Remove all of the keys (and any associated values) in a collection of keys. If a key is not present in the dictionary, nothing happens. A collection of key values to remove. The number of keys from the collection that were present and removed. Determines if this dictionary contains a key equal to . If so, all the values associated with that key are returned through the values parameter. This method must be overridden by the derived class. The key to search for. Returns all values associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Determines whether a given key is found in the dictionary. The default implementation simply calls TryEnumerateValuesForKey. It may be appropriate to override this method to provide a more efficient implementation. Key to look for in the dictionary. True if the key is present in the dictionary. Determines if this dictionary contains a key-value pair equal to and . The dictionary is not changed. This method must be overridden in the derived class. The key to search for. The value to search for. True if the dictionary has associated with . Determines if this dictionary contains the given key and all of the values associated with that key.. A key and collection of values to search for. True if the dictionary has associated all of the values in .Value with .Key. If the derived class does not use the default comparison for values, this methods should be overridden to compare two values for equality. This is used for the correct implementation of ICollection.Contains on the Values and KeyValuePairs collections. First value to compare. Second value to compare. True if the values are equal. Gets a count of the number of values associated with a key. The default implementation is slow; it enumerators all of the values (using TryEnumerateValuesForKey) to count them. A derived class may be able to supply a more efficient implementation. The key to count values for. The number of values associated with . Gets a total count of values in the collection. This default implementation is slow; it enumerates all of the keys in the dictionary and calls CountValues on each. A derived class may be able to supply a more efficient implementation. The total number of values associated with all keys in the dictionary. Replaces all values associated with with the single value . This implementation simply calls Remove, followed by Add. The key to associate with. The new values to be associated with . Returns true if some values were removed. Returns false if was not present in the dictionary before Replace was called. Replaces all values associated with with a new collection of values. If the collection does not permit duplicate values, and has duplicate items, then only the last of duplicates is added. The key to associate with. The new values to be associated with . Returns true if some values were removed. Returns false if was not present in the dictionary before Replace was called. Shows the string representation of the dictionary. The string representation contains a list of the mappings in the dictionary. The string representation of the dictionary. Display the contents of the dictionary in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). Enumerate all the keys in the dictionary, and for each key, the collection of values for that key. An enumerator to enumerate all the key, ICollection<value> pairs in the dictionary. Gets the number of keys in the dictionary. This property must be overridden in the derived class. Gets a read-only collection all the keys in this dictionary. An readonly ICollection<TKey> of all the keys in this dictionary. Gets a read-only collection of all the values in the dictionary. A read-only ICollection<TValue> of all the values in the dictionary. Gets a read-only collection of all the value collections in the dictionary. A read-only ICollection<IEnumerable<TValue>> of all the values in the dictionary. Gets a read-only collection of all key-value pairs in the dictionary. If a key has multiple values associated with it, then a key-value pair is present for each value associated with the key. Returns a collection of all of the values in the dictionary associated with , or changes the set of values associated with . If the key is not present in the dictionary, an ICollection enumerating no values is returned. The returned collection of values is read-write, and can be used to modify the collection of values associated with the key. The key to get the values associated with. An ICollection<TValue> with all the values associated with . Gets a collection of all the values in the dictionary associated with , or changes the set of values associated with . If the key is not present in the dictionary, a KeyNotFound exception is thrown. The key to get the values associated with. An IEnumerable<TValue> that enumerates all the values associated with . The given key is not present in the dictionary. A private class that provides the ICollection<TValue> for a particular key. This is the collection that is returned from the indexer. The collections is read-write, live, and can be used to add, remove, etc. values from the multi-dictionary. Constructor. Initializes this collection. Dictionary we're using. The key we're looking at. Remove the key and all values associated with it. Add a new values to this key. New values to add. Remove a value currently associated with key. Value to remove. True if item was assocaited with key, false otherwise. A simple function that returns an IEnumerator<TValue> that doesn't yield any values. A helper. An IEnumerator<TValue> that yields no values. Enumerate all the values associated with key. An IEnumerator<TValue> that enumerates all the values associated with key. Determines if the given values is associated with key. Value to check for. True if value is associated with key, false otherwise. Get the number of values associated with the key. A private class that implements ICollection<TKey> and ICollection for the Keys collection. The collection is read-only. Constructor. The dictionary this is associated with. A private class that implements ICollection<TValue> and ICollection for the Values collection. The collection is read-only. A private class that implements ICollection<ICollection<TValue>> and ICollection for the Values collection on IDictionary. The collection is read-only. A private class that implements ICollection<KeyValuePair<TKey,TValue>> and ICollection for the KeyValuePairs collection. The collection is read-only. Create a new MultiDictionary. The default ordering of keys and values are used. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. The default ordering of keys and values will be used, as defined by TKey and TValue's implementation of IComparable<T> (or IComparable if IComparable<T> is not implemented). If a different ordering should be used, other constructors allow a custom Comparer or IComparer to be passed to changed the ordering. Can the same value be associated with a key multiple times? TKey or TValue does not implement either IComparable<T> or IComparable. Create a new MultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? An IEqualityComparer<TKey> instance that will be used to compare keys. TValue does not implement either IComparable<TValue> or IComparable. Create a new MultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? An IEqualityComparer<TKey> instance that will be used to compare keys. An IEqualityComparer<TValue> instance that will be used to compare values. Create a new MultiDictionary. Private constructor, for use by Clone(). Adds a new value to be associated with a key. If duplicate values are permitted, this method always adds a new key-value pair to the dictionary. If duplicate values are not permitted, and already has a value equal to associated with it, then that value is replaced with , and the number of values associate with is unchanged. The key to associate with. The value to associated with . Removes a given value from the values associated with a key. If the last value is removed from a key, the key is removed also. A key to remove a value from. The value to remove. True if was associated with (and was therefore removed). False if was not associated with . Removes a key and all associated values from the dictionary. If the key is not present in the dictionary, it is unchanged and false is returned. The key to remove. True if the key was present and was removed. Returns false if the key was not present. Removes all keys and values from the dictionary. Determine if two values are equal. First value to compare. Second value to compare. True if the values are equal. Checks to see if is associated with in the dictionary. The key to check. The value to check. True if is associated with . Checks to see if the key is present in the dictionary and has at least one value associated with it. The key to check. True if is present and has at least one value associated with it. Returns false otherwise. Enumerate all the keys in the dictionary. An IEnumerator<TKey> that enumerates all of the keys in the dictionary that have at least one value associated with them. Enumerate the values in the a KeyAndValues structure. Can't return the array directly because: a) The array might be larger than the count. b) We can't allow clients to down-cast to the array and modify it. c) We have to abort enumeration if the hash changes. Item with the values to enumerate.. An enumerable that enumerates the items in the KeyAndValues structure. Determines if this dictionary contains a key equal to . If so, all the values associated with that key are returned through the values parameter. The key to search for. Returns all values associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Gets the number of values associated with a given key. The key to count values of. The number of values associated with . If is not present in the dictionary, zero is returned. Makes a shallow clone of this dictionary; i.e., if keys or values of the dictionary are reference types, then they are not cloned. If TKey or TValue is a value type, then each element is copied as if by simple assignment. Cloning the dictionary takes time O(N), where N is the number of key-value pairs in the dictionary. The cloned dictionary. Implements ICloneable.Clone. Makes a shallow clone of this dictionary; i.e., if keys or values are reference types, then they are not cloned. The cloned dictionary. Throw an InvalidOperationException indicating that this type is not cloneable. Type to test. Makes a deep clone of this dictionary. A new dictionary is created with a clone of each entry of this dictionary, by calling ICloneable.Clone on each element. If TKey or TValue is a value type, then each element is copied as if by simple assignment. If TKey or TValue is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the dictionary takes time O(N log N), where N is the number of key-value pairs in the dictionary. The cloned dictionary. TKey or TValue is a reference type that does not implement ICloneable. Returns the IEqualityComparer<T> used to compare keys in this dictionary. If the dictionary was created using a comparer, that comparer is returned. Otherwise the default comparer for TKey (EqualityComparer<TKey>.Default) is returned. Returns the IEqualityComparer<T> used to compare values in this dictionary. If the dictionary was created using a comparer, that comparer is returned. Otherwise the default comparer for TValue (EqualityComparer<TValue>.Default) is returned. Gets the number of key-value pairs in the dictionary. Each value associated with a given key is counted. If duplicate values are permitted, each duplicate value is included in the count. The number of key-value pairs in the dictionary. A structure to hold the key and the values associated with the key. The number of values must always be 1 or greater in a version that is stored, but can be zero in a dummy version used only for lookups. The key. The number of values. Always at least 1 except in a dummy version for lookups. An array of values. Create a dummy KeyAndValues with just the key, for lookups. The key to use. Make a copy of a KeyAndValues, copying the array. KeyAndValues to copy. A copied version. This class implements IEqualityComparer for KeysAndValues, allowing them to be compared by their keys. An IEqualityComparer on keys is required. ListBase is an abstract class that can be used as a base class for a read-write collection that needs to implement the generic IList<T> and non-generic IList collections. The derived class needs to override the following methods: Count, Clear, Insert, RemoveAt, and the indexer. The implementation of all the other methods in IList<T> and IList are handled by ListBase. Creates a new ListBase. This method must be overridden by the derived class to empty the list of all items. This method must be overridden by the derived class to insert a new item at the given index. The index in the list to insert the item at. After the insertion, the inserted item is located at this index. The first item in the list has index 0. The item to insert at the given index. is less than zero or greater than Count. This method must be overridden by the derived class to remove the item at the given index. The index in the list to remove the item at. The first item in the list has index 0. is less than zero or greater than or equal to Count. Enumerates all of the items in the list, in order. The item at index 0 is enumerated first, then the item at index 1, and so on. The enumerator does not check for changes made to the structure of the list. Thus, changes to the list during enumeration may cause incorrect enumeration or out of range exceptions. Consider overriding this method and adding checks for structural changes. An IEnumerator<T> that enumerates all the items in the list. Determines if the list contains any item that compares equal to . The implementation simply checks whether IndexOf(item) returns a non-negative value. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. True if the list contains an item that compares equal to . Adds an item to the end of the list. This method is equivalent to calling: Insert(Count, item) The item to add to the list. Searches the list for the first item that compares equal to . If one is found, it is removed. Otherwise, the list is unchanged. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to remove from the list. True if an item was found and removed that compared equal to . False if no such item was in the list. Copies all the items in the list, in order, to , starting at index 0. The array to copy to. This array must have a size that is greater than or equal to Count. Copies all the items in the list, in order, to , starting at . The array to copy to. This array must have a size that is greater than or equal to Count + arrayIndex. The starting index in to copy to. Copies a range of elements from the list to , starting at . The starting index in the source list of the range to copy. The array to copy to. This array must have a size that is greater than or equal to Count + arrayIndex. The starting index in to copy to. The number of items to copy. Provides a read-only view of this list. The returned IList<T> provides a view of the list that prevents modifications to the list. Use the method to provide access to the list without allowing changes. Since the returned object is just a view, changes to the list will be reflected in the view. An IList<T> that provides read-only access to the list. Finds the first item in the list that satisfies the condition defined by . If no item matches the condition, than the default value for T (null or all-zero) is returned. If the default value for T (null or all-zero) matches the condition defined by , and the list might contain the default value, then it is impossible to distinguish the different between finding the default value and not finding any item. To distinguish these cases, use . A delegate that defined the condition to check for. The first item that satisfies the condition . If no item satisfies that condition, the default value for T is returned. Finds the first item in the list that satisfies the condition defined by . A delegate that defines the condition to check for. If true is returned, this parameter receives the first item in the list that satifies the condition defined by . True if an item that satisfies the condition was found. False if no item in the list satisfies that condition. Finds the last item in the list that satisfies the condition defined by . If no item matches the condition, than the default value for T (null or all-zero) is returned. If the default value for T (null or all-zero) matches the condition defined by , and the list might contain the default value, then it is impossible to distinguish the different between finding the default value and not finding any item. To distinguish these cases, use . A delegate that defined the condition to check for. The last item that satisfies the condition . If no item satisfies that condition, the default value for T is returned. Finds the last item in the list that satisfies the condition defined by . A delegate that defines the condition to check for. If true is returned, this parameter receives the last item in the list that satifies the condition defined by . True if an item that satisfies the condition was found. False if no item in the list satisfies that condition. Finds the index of the first item in the list that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The index of the first item that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item, in the range of items extending from to the end, that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The starting index of the range to check. The index of the first item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item, in the range of items starting from , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The starting index of the range to check. The number of items in range to check. The index of the first item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item in the list that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The index of the last item that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item, in the range of items extending from the beginning of the list to , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The ending index of the range to check. The index of the last item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item, in the range of items ending at , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The ending index of the range to check. The number of items in range to check. The index of the last item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item in the list that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The index of the first item in the list that that is equal to . If no item is equal to , -1 is returned. Finds the index of the first item, in the range of items extending from to the end, that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The starting index of the range to check. The index of the first item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the first item, in the range of items starting from , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The starting index of the range to check. The number of items in range to check. The index of the first item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item in the list that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The index of the last item in the list that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item, in the range of items extending from the beginning of the list to , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The ending index of the range to check. The index of the last item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item, in the range of items ending at , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search for. The ending index of the range to check. The number of items in range to check. The index of the last item in the given range that that is equal to . If no item is equal to , -1 is returned. Returns a view onto a sub-range of this list. Items are not copied; the returned IList<T> is simply a different view onto the same underlying items. Changes to this list are reflected in the view, and vice versa. Insertions and deletions in the view change the size of the view, but insertions and deletions in the underlying list do not. This method can be used to apply an algorithm to a portion of a list. For example: Algorithms.ReverseInPlace(deque.Range(3, 6)) will reverse the 6 items beginning at index 3. The starting index of the view. The number of items in the view. A list that is a view onto the given sub-part of this list. or is negative. + is greater than the size of the list. Convert the given parameter to T. Throw an ArgumentException if it isn't. parameter name parameter value Adds an item to the end of the list. This method is equivalent to calling: Insert(Count, item) The item to add to the list. cannot be converted to T. Removes all the items from the list, resulting in an empty list. Determines if the list contains any item that compares equal to . Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. Find the first occurrence of an item equal to in the list, and returns the index of that item. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. The index of , or -1 if no item in the list compares equal to . Insert a new item at the given index. The index in the list to insert the item at. After the insertion, the inserted item is located at this index. The first item in the list has index 0. The item to insert at the given index. is less than zero or greater than Count. cannot be converted to T. Searches the list for the first item that compares equal to . If one is found, it is removed. Otherwise, the list is unchanged. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to remove from the list. cannot be converted to T. Removes the item at the given index. The index in the list to remove the item at. The first item in the list has index 0. is less than zero or greater than or equal to Count. The property must be overridden by the derived class to return the number of items in the list. The number of items in the list. The indexer must be overridden by the derived class to get and set values of the list at a particular index. The index in the list to get or set an item at. The first item in the list has index 0, and the last has index Count-1. The item at the given index. is less than zero or greater than or equal to Count. Returns whether the list is a fixed size. This implementation always returns false. Alway false, indicating that the list is not fixed size. Returns whether the list is read only. This implementation returns the value from ICollection<T>.IsReadOnly, which is by default, false. By default, false, indicating that the list is not read only. Gets or sets the value at a particular index in the list. The index in the list to get or set an item at. The first item in the list has index 0, and the last has index Count-1. The item at the given index. is less than zero or greater than or equal to Count. cannot be converted to T. Set<T> is a collection that contains items of type T. The item are maintained in a haphazard, unpredictable order, and duplicate items are not allowed.

The items are compared in one of two ways. If T implements IComparable<T> then the Equals method of that interface will be used to compare items, otherwise the Equals method from Object will be used. Alternatively, an instance of IComparer<T> can be passed to the constructor to use to compare items.

Set is implemented as a hash table. Inserting, deleting, and looking up an an element all are done in approximately constant time, regardless of the number of items in the Set.

is similar, but uses comparison instead of hashing, and does maintains the items in sorted order.

Creates a new Set. The Equals method and GetHashCode method on T will be used to compare items for equality. Items that are null are permitted, and will be sorted before all other items. Creates a new Set. The Equals and GetHashCode method of the passed comparer object will be used to compare items in this set. An instance of IEqualityComparer<T> that will be used to compare items. Creates a new Set. The Equals method and GetHashCode method on T will be used to compare items for equality. Items that are null are permitted. A collection with items to be placed into the Set. Creates a new Set. The Equals and GetHashCode method of the passed comparer object will be used to compare items in this set. The set is initialized with all the items in the given collection. A collection with items to be placed into the Set. An instance of IEqualityComparer<T> that will be used to compare items. Creates a new Set given a comparer and a tree that contains the data. Used internally for Clone. EqualityComparer for the set. Data for the set. Makes a shallow clone of this set; i.e., if items of the set are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the set takes time O(N), where N is the number of items in the set. The cloned set. Makes a shallow clone of this set; i.e., if items of the set are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the set takes time O(N), where N is the number of items in the set. The cloned set. Makes a deep clone of this set. A new set is created with a clone of each element of this set, by calling ICloneable.Clone on each element. If T is a value type, then each element is copied as if by simple assignment. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the set takes time O(N), where N is the number of items in the set. The cloned set. T is a reference type that does not implement ICloneable. Returns an enumerator that enumerates all the items in the set. The items are enumerated in sorted order.

Typically, this method is not called directly. Instead the "foreach" statement is used to enumerate the items, which uses this method implicitly.

If an item is added to or deleted from the set while it is being enumerated, then the enumeration will end with an InvalidOperationException.

Enumerating all the items in the set takes time O(N), where N is the number of items in the set.

An enumerator for enumerating all the items in the Set.
Determines if this set contains an item equal to . The set is not changed. Searching the set for an item takes approximately constant time, regardless of the number of items in the set. The item to search for. True if the set contains . False if the set does not contain . Determines if this set contains an item equal to , according to the comparison mechanism that was used when the set was created. The set is not changed. If the set does contain an item equal to , then the item from the set is returned. Searching the set for an item takes approximately constant time, regardless of the number of items in the set. In the following example, the set contains strings which are compared in a case-insensitive manner. Set<string> set = new Set<string>(StringComparer.CurrentCultureIgnoreCase); set.Add("HELLO"); string s; bool b = set.TryGetItem("Hello", out s); // b receives true, s receives "HELLO". The item to search for. Returns the item from the set that was equal to . True if the set contains . False if the set does not contain . Adds a new item to the set. If the set already contains an item equal to , that item is replaced with . Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes approximately constant time, regardless of the number of items in the set. The item to add to the set. True if the set already contained an item equal to (which was replaced), false otherwise. Adds a new item to the set. If the set already contains an item equal to , that item is replaced with . Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes approximately constant time, regardless of the number of items in the set. The item to add to the set. True if the set already contained an item equal to (which was replaced), false otherwise. Adds all the items in to the set. If the set already contains an item equal to one of the items in , that item will be replaced. Equality between items is determined by the comparison instance or delegate used to create the set. Adding the collection takes time O(M), where M is the number of items in . A collection of items to add to the set. Searches the set for an item equal to , and if found, removes it from the set. If not found, the set is unchanged. Equality between items is determined by the comparison instance or delegate used to create the set. Removing an item from the set takes approximately constant time, regardless of the size of the set. The item to remove. True if was found and removed. False if was not in the set. Removes all the items in from the set. Equality between items is determined by the comparison instance or delegate used to create the set. Removing the collection takes time O(M), where M is the number of items in . A collection of items to remove from the set. The number of items removed from the set. is null. Removes all items from the set. Clearing the set takes a constant amount of time, regardless of the number of items in it. Check that this set and another set were created with the same comparison mechanism. Throws exception if not compatible. Other set to check comparision mechanism. If otherSet and this set don't use the same method for comparing items. Determines if this set is a superset of another set. Neither set is modified. This set is a superset of if every element in is also in this set. IsSupersetOf is computed in time O(M), where M is the size of the . Set to compare to. True if this is a superset of . This set and don't use the same method for comparing items. Determines if this set is a proper superset of another set. Neither set is modified. This set is a proper superset of if every element in is also in this set. Additionally, this set must have strictly more items than . IsProperSubsetOf is computed in time O(M), where M is the size of . Set to compare to. True if this is a proper superset of . This set and don't use the same method for comparing items. Determines if this set is a subset of another set. Neither set is modified. This set is a subset of if every element in this set is also in . IsSubsetOf is computed in time O(N), where N is the size of the this set. Set to compare to. True if this is a subset of . This set and don't use the same method for comparing items. Determines if this set is a proper subset of another set. Neither set is modified. This set is a subset of if every element in this set is also in . Additionally, this set must have strictly fewer items than . IsProperSubsetOf is computed in time O(N), where N is the size of the this set. Set to compare to. True if this is a proper subset of . This set and don't use the same method for comparing items. Determines if this set is equal to another set. This set is equal to if they contain the same items. IsEqualTo is computed in time O(N), where N is the number of items in this set. Set to compare to True if this set is equal to , false otherwise. This set and don't use the same method for comparing items. Determines if this set is disjoint from another set. Two sets are disjoint if no item from one set is equal to any item in the other set. The answer is computed in time O(N), where N is the size of the smaller set. Set to check disjointness with. True if the two sets are disjoint, false otherwise. This set and don't use the same method for comparing items. Computes the union of this set with another set. The union of two sets is all items that appear in either or both of the sets. This set receives the union of the two sets, the other set is unchanged. If equal items appear in both sets, the union will include an arbitrary choice of one of the two equal items. The union of two sets is computed in time O(M + N), where M is the size of the larger set, and N is the size of the smaller set. Set to union with. This set and don't use the same method for comparing items. Computes the union of this set with another set. The union of two sets is all items that appear in either or both of the sets. A new set is created with the union of the sets and is returned. This set and the other set are unchanged. If equal items appear in both sets, the union will include an arbitrary choice of one of the two equal items. The union of two sets is computed in time O(M + N), where M is the size of the one set, and N is the size of the other set. Set to union with. The union of the two sets. This set and don't use the same method for comparing items. Computes the intersection of this set with another set. The intersection of two sets is all items that appear in both of the sets. This set receives the intersection of the two sets, the other set is unchanged. When equal items appear in both sets, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two sets is computed in time O(N), where N is the size of the smaller set. Set to intersection with. This set and don't use the same method for comparing items. Computes the intersection of this set with another set. The intersection of two sets is all items that appear in both of the sets. A new set is created with the intersection of the sets and is returned. This set and the other set are unchanged. When equal items appear in both sets, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two sets is computed in time O(N), where N is the size of the smaller set. Set to intersection with. The intersection of the two sets. This set and don't use the same method for comparing items. Computes the difference of this set with another set. The difference of these two sets is all items that appear in this set, but not in . This set receives the difference of the two sets; the other set is unchanged. The difference of two sets is computed in time O(N), where N is the size of the smaller set. Set to difference with. This set and don't use the same method for comparing items. Computes the difference of this set with another set. The difference of these two sets is all items that appear in this set, but not in . A new set is created with the difference of the sets and is returned. This set and the other set are unchanged. The difference of two sets is computed in time O(N), where N is the size of the smaller set. Set to difference with. The difference of the two sets. This set and don't use the same method for comparing items. Computes the symmetric difference of this set with another set. The symmetric difference of two sets is all items that appear in either of the sets, but not both. This set receives the symmetric difference of the two sets; the other set is unchanged. The symmetric difference of two sets is computed in time O(N), where N is the size of the smaller set. Set to symmetric difference with. This set and don't use the same method for comparing items. Computes the symmetric difference of this set with another set. The symmetric difference of two sets is all items that appear in either of the sets, but not both. A new set is created with the symmetric difference of the sets and is returned. This set and the other set are unchanged. The symmetric difference of two sets is computed in time O(N), where N is the size of the smaller set. Set to symmetric difference with. The symmetric difference of the two sets. This set and don't use the same method for comparing items. Returns the IEqualityComparer<T> used to compare items in this set. If the set was created using a comparer, that comparer is returned. Otherwise the default comparer for T (EqualityComparer<T>.Default) is returned. Returns the number of items in the set. The size of the set is returned in constant time. The number of items in the set. A collection of methods to create IComparer and IEqualityComparer instances in various ways. Given an Comparison on a type, returns an IComparer on that type. T to compare. Comparison delegate on T IComparer that uses the comparison. Given an IComparer on TKey, returns an IComparer on key-value Pairs. TKey of the pairs TValue of the apris IComparer on TKey IComparer for comparing key-value pairs. Given an IEqualityComparer on TKey, returns an IEqualityComparer on key-value Pairs. TKey of the pairs TValue of the apris IComparer on TKey IEqualityComparer for comparing key-value pairs. Given an IComparer on TKey and TValue, returns an IComparer on key-value Pairs of TKey and TValue, comparing first keys, then values. TKey of the pairs TValue of the apris IComparer on TKey IComparer on TValue IComparer for comparing key-value pairs. Given an Comparison on TKey, returns an IComparer on key-value Pairs. TKey of the pairs TValue of the apris Comparison delegate on TKey IComparer for comparing key-value pairs. Given an element type, check that it implements IComparable<T> or IComparable, then returns a IComparer that can be used to compare elements of that type. The IComparer<T> instance. T does not implement IComparable<T>. Given an key and value type, check that TKey implements IComparable<T> or IComparable, then returns a IComparer that can be used to compare KeyValuePairs of those types. The IComparer<KeyValuePair<TKey, TValue>> instance. TKey does not implement IComparable<T>. Class to change an IEqualityComparer<TKey> to an IEqualityComparer<KeyValuePair<TKey, TValue>> Only the keys are compared. Class to change an IComparer<TKey> to an IComparer<KeyValuePair<TKey, TValue>> Only the keys are compared. Class to change an IComparer<TKey> and IComparer<TValue> to an IComparer<KeyValuePair<TKey, TValue>> Keys are compared, followed by values. Class to change an Comparison<T> to an IComparer<T>. Class to change an Comparison<TKey> to an IComparer<KeyValuePair<TKey, TValue>>. GetHashCode cannot be used on this class. MultiDictionaryBase is a base class that can be used to more easily implement a class that associates multiple values to a single key. The class implements the generic IDictionary<TKey, ICollection<TValue>> interface. The resulting collection is read-only -- items cannot be added or removed. To use ReadOnlyMultiDictionaryBase as a base class, the derived class must override Count, Contains(TKey,TValue), EnumerateKeys, and TryEnumerateValuesForKey . The key type of the dictionary. The value type of the dictionary. Creates a new ReadOnlyMultiDictionaryBase. Throws an NotSupportedException stating that this collection cannot be modified. Enumerate all the keys in the dictionary. This method must be overridden by a derived class. An IEnumerator<TKey> that enumerates all of the keys in the collection that have at least one value associated with them. Enumerate all of the values associated with a given key. This method must be overridden by the derived class. If the key exists and has values associated with it, an enumerator for those values is returned throught . If the key does not exist, false is returned. The key to get values for. If true is returned, this parameter receives an enumerators that enumerates the values associated with that key. True if the key exists and has values associated with it. False otherwise. Implements IDictionary<TKey, IEnumerable<TValue>>.Add. If the key is already present, and ArgumentException is thrown. Otherwise, a new key is added, and new values are associated with that key. Key to add. Values to associate with that key. The key is already present in the dictionary. Removes a key from the dictionary. This method must be overridden in the derived class. Key to remove from the dictionary. True if the key was found, false otherwise. Determines if this dictionary contains a key equal to . If so, all the values associated with that key are returned through the values parameter. This method must be overridden by the derived class. The key to search for. Returns all values associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Determines whether a given key is found in the dictionary. The default implementation simply calls TryGetValue. It may be appropriate to override this method to provide a more efficient implementation. Key to look for in the dictionary. True if the key is present in the dictionary. Determines if this dictionary contains a key-value pair equal to and . The dictionary is not changed. This method must be overridden in the derived class. The key to search for. The value to search for. True if the dictionary has associated with . Determines if this dictionary contains the given key and all of the values associated with that key.. A key and collection of values to search for. True if the dictionary has associated all of the values in .Value with .Key. If the derived class does not use the default comparison for values, this methods should be overridden to compare two values for equality. This is used for the correct implementation of ICollection.Contains on the Values and KeyValuePairs collections. First value to compare. Second value to compare. True if the values are equal. Gets a count of the number of values associated with a key. The default implementation is slow; it enumerators all of the values (using TryEnumerateValuesForKey) to count them. A derived class may be able to supply a more efficient implementation. The key to count values for. The number of values associated with . Gets a total count of values in the collection. This default implementation is slow; it enumerates all of the keys in the dictionary and calls CountValues on each. A derived class may be able to supply a more efficient implementation. The total number of values associated with all keys in the dictionary. Shows the string representation of the dictionary. The string representation contains a list of the mappings in the dictionary. The string representation of the dictionary. Display the contents of the dictionary in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). Enumerate all the keys in the dictionary, and for each key, the collection of values for that key. An enumerator to enumerate all the key, ICollection<value> pairs in the dictionary. Gets the number of keys in the dictionary. This property must be overridden in the derived class. Gets a read-only collection all the keys in this dictionary. An readonly ICollection<TKey> of all the keys in this dictionary. Gets a read-only collection of all the values in the dictionary. A read-only ICollection<TValue> of all the values in the dictionary. Gets a read-only collection of all the value collections in the dictionary. A read-only ICollection<IEnumerable<TValue>> of all the values in the dictionary. Gets a read-only collection of all key-value pairs in the dictionary. If a key has multiple values associated with it, then a key-value pair is present for each value associated with the key. Returns a collection of all of the values in the dictionary associated with . If the key is not present in the dictionary, an ICollection with no values is returned. The returned ICollection is read-only. The key to get the values associated with. An ICollection<TValue> with all the values associated with . Gets a collection of all the values in the dictionary associated with . If the key is not present in the dictionary, a KeyNotFound exception is thrown. The key to get the values associated with. An IEnumerable<TValue> that enumerates all the values associated with . The given key is not present in the dictionary. The set accessor is called. A private class that provides the ICollection<TValue> for a particular key. This is the collection that is returned from the indexer. The collections is read-write, live, and can be used to add, remove, etc. values from the multi-dictionary. Constructor. Initializes this collection. Dictionary we're using. The key we're looking at. A simple function that returns an IEnumerator<TValue> that doesn't yield any values. A helper. An IEnumerator<TValue> that yields no values. Enumerate all the values associated with key. An IEnumerator<TValue> that enumerates all the values associated with key. Determines if the given values is associated with key. Value to check for. True if value is associated with key, false otherwise. Get the number of values associated with the key. A private class that implements ICollection<TKey> and ICollection for the Keys collection. The collection is read-only. Constructor. The dictionary this is associated with. A private class that implements ICollection<TValue> and ICollection for the Values collection. The collection is read-only. A private class that implements ICollection<IEnumerable<TValue>> and ICollection for the Values collection on IDictionary. The collection is read-only. A private class that implements ICollection<KeyValuePair<TKey,TValue>> and ICollection for the KeyValuePairs collection. The collection is read-only. The BinaryPredicate delegate type encapsulates a method that takes two items of the same type, and returns a boolean value representating some relationship between them. For example, checking whether two items are equal or equivalent is one kind of binary predicate. The first item. The second item. Whether item1 and item2 satisfy the relationship that the BinaryPredicate defines. Algorithms contains a number of static methods that implement algorithms that work on collections. Most of the methods deal with the standard generic collection interfaces such as IEnumerable<T>, ICollection<T> and IList<T>. Returns a view onto a sub-range of a list. Items from are not copied; the returned IList<T> is simply a different view onto the same underlying items. Changes to are reflected in the view, and vice versa. Insertions and deletions in the view change the size of the view, but insertions and deletions in the underlying list do not. This method can be used to apply an algorithm to a portion of a list. For example: Algorithms.ReverseInPlace(Algorithms.Range(list, 3, 6)) will reverse the 6 items beginning at index 3. The type of the items in the list. The list to view. The starting index of the view. The number of items in the view. A list that is a view onto the given sub-list. is null. or is negative. + is greater than the size of . Returns a view onto a sub-range of an array. Items from are not copied; the returned IList<T> is simply a different view onto the same underlying items. Changes to are reflected in the view, and vice versa. Insertions and deletions in the view change the size of the view. After an insertion, the last item in "falls off the end". After a deletion, the last item in array becomes the default value (0 or null). This method can be used to apply an algorithm to a portion of a array. For example: Algorithms.ReverseInPlace(Algorithms.Range(array, 3, 6)) will reverse the 6 items beginning at index 3. The array to view. The starting index of the view. The number of items in the view. A list that is a view onto the given sub-array. is null. or is negative. + is greater than the size of . Returns a read-only view onto a collection. The returned ICollection<T> interface only allows operations that do not change the collection: GetEnumerator, Contains, CopyTo, Count. The ReadOnly property returns false, indicating that the collection is read-only. All other methods on the interface throw a NotSupportedException. The data in the underlying collection is not copied. If the underlying collection is changed, then the read-only view also changes accordingly. The type of items in the collection. The collection to wrap. A read-only view onto . If is null, then null is returned. Returns a read-only view onto a list. The returned IList<T> interface only allows operations that do not change the list: GetEnumerator, Contains, CopyTo, Count, IndexOf, and the get accessor of the indexer. The IsReadOnly property returns true, indicating that the list is read-only. All other methods on the interface throw a NotSupportedException. The data in the underlying list is not copied. If the underlying list is changed, then the read-only view also changes accordingly. The type of items in the list. The list to wrap. A read-only view onto . Returns null if is null. If is already read-only, returns . Returns a read-only view onto a dictionary. The returned IDictionary<TKey,TValue> interface only allows operations that do not change the dictionary. The IsReadOnly property returns true, indicating that the dictionary is read-only. All other methods on the interface throw a NotSupportedException. The data in the underlying dictionary is not copied. If the underlying dictionary is changed, then the read-only view also changes accordingly. The dictionary to wrap. A read-only view onto . Returns null if is null. If is already read-only, returns . Given a non-generic IEnumerable interface, wrap a generic IEnumerable<T> interface around it. The generic interface will enumerate the same objects as the underlying non-generic collection, but can be used in places that require a generic interface. The underlying non-generic collection must contain only items that are of type or a type derived from it. This method is useful when interfacing older, non-generic collections to newer code that uses generic interfaces. Some collections implement both generic and non-generic interfaces. For efficiency, this method will first attempt to cast to IEnumerable<T>. If that succeeds, it is returned; otherwise, a wrapper object is created. The item type of the wrapper collection. An untyped collection. This collection should only contain items of type or a type derived from it. A generic IEnumerable<T> wrapper around . If is null, then null is returned. Given a non-generic ICollection interface, wrap a generic ICollection<T> interface around it. The generic interface will enumerate the same objects as the underlying non-generic collection, but can be used in places that require a generic interface. The underlying non-generic collection must contain only items that are of type or a type derived from it. This method is useful when interfacing older, non-generic collections to newer code that uses generic interfaces. Some collections implement both generic and non-generic interfaces. For efficiency, this method will first attempt to cast to ICollection<T>. If that succeeds, it is returned; otherwise, a wrapper object is created. Unlike the generic interface, the non-generic ICollection interfaces does not contain methods for adding or removing items from the collection. For this reason, the returned ICollection<T> will be read-only. The item type of the wrapper collection. An untyped collection. This collection should only contain items of type or a type derived from it. A generic ICollection<T> wrapper around . If is null, then null is returned. Given a non-generic IList interface, wrap a generic IList<T> interface around it. The generic interface will enumerate the same objects as the underlying non-generic list, but can be used in places that require a generic interface. The underlying non-generic list must contain only items that are of type or a type derived from it. This method is useful when interfacing older, non-generic lists to newer code that uses generic interfaces. Some collections implement both generic and non-generic interfaces. For efficiency, this method will first attempt to cast to IList<T>. If that succeeds, it is returned; otherwise, a wrapper object is created. The item type of the wrapper list. An untyped list. This list should only contain items of type or a type derived from it. A generic IList<T> wrapper around . If is null, then null is returned. Given a generic ICollection<T> interface, wrap a non-generic (untyped) ICollection interface around it. The non-generic interface will contain the same objects as the underlying generic collection, but can be used in places that require a non-generic interface. This method is useful when interfacing generic interfaces with older code that uses non-generic interfaces. Many generic collections already implement the non-generic interfaces directly. This method will first attempt to simply cast to ICollection. If that succeeds, it is returned; if it fails, then a wrapper object is created. The item type of the underlying collection. A typed collection to wrap. A non-generic ICollection wrapper around . If is null, then null is returned. Given a generic IList<T> interface, wrap a non-generic (untyped) IList interface around it. The non-generic interface will contain the same objects as the underlying generic list, but can be used in places that require a non-generic interface. This method is useful when interfacing generic interfaces with older code that uses non-generic interfaces. Many generic collections already implement the non-generic interfaces directly. This method will first attempt to simply cast to IList. If that succeeds, it is returned; if it fails, then a wrapper object is created. The item type of the underlying list. A typed list to wrap. A non-generic IList wrapper around . If is null, then null is returned. Creates a read-write IList<T> wrapper around an array. When an array is implicitely converted to an IList<T>, changes to the items in the array cannot be made through the interface. This method creates a read-write IList<T> wrapper on an array that can be used to make changes to the array. Use this method when you need to pass an array to an algorithms that takes an IList<T> and that tries to modify items in the list. Algorithms in this class generally do not need this method, since they have been design to operate on arrays even when they are passed as an IList<T>. Since arrays cannot be resized, inserting an item causes the last item in the array to be automatically removed. Removing an item causes the last item in the array to be replaced with a default value (0 or null). Clearing the list causes all the items to be replaced with a default value. The array to wrap. An IList<T> wrapper onto . Replace all items in a collection equal to a particular value with another values, yielding another collection. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The collection to process. The value to find and replace within . The new value to replace with. An new collection with the items from , in the same order, with the appropriate replacements made. Replace all items in a collection equal to a particular value with another values, yielding another collection. A passed IEqualityComparer is used to determine equality. The collection to process. The value to find and replace within . The new value to replace with. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. An new collection with the items from , in the same order, with the appropriate replacements made. Replace all items in a collection that a predicate evalues at true with a value, yielding another collection. . The collection to process. The predicate used to evaluate items with the collection. If the predicate returns true for a particular item, the item is replaces with . The new value to replace with. An new collection with the items from , in the same order, with the appropriate replacements made. Replace all items in a list or array equal to a particular value with another value. The replacement is done in-place, changing the list. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. The value to find and replace within . The new value to replace with. Replace all items in a list or array equal to a particular value with another values. The replacement is done in-place, changing the list. A passed IEqualityComparer is used to determine equality. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. The value to find and replace within . The new value to replace with. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. Replace all items in a list or array that a predicate evaluates at true with a value. The replacement is done in-place, changing the list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. The predicate used to evaluate items with the collection. If the predicate returns true for a particular item, the item is replaces with . The new value to replace with. Remove consecutive equal items from a collection, yielding another collection. In each run of consecutive equal items in the collection, all items after the first item in the run are removed. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The collection to process. An new collection with the items from , in the same order, with consecutive duplicates removed. is null. Remove consecutive equal items from a collection, yielding another collection. In each run of consecutive equal items in the collection, all items after the first item in the run are removed. A passed IEqualityComparer is used to determine equality. The collection to process. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. An new collection with the items from , in the same order, with consecutive duplicates removed. or is null. Remove consecutive "equal" items from a collection, yielding another collection. In each run of consecutive equal items in the collection, all items after the first item in the run are removed. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being removed need not be true equality. The collection to process. The BinaryPredicate used to compare items for "equality". An item current is removed if predicate(first, current)==true, where first is the first item in the group of "duplicate" items. An new collection with the items from , in the same order, with consecutive "duplicates" removed. Remove consecutive equal items from a list or array. In each run of consecutive equal items in the list, all items after the first item in the run are removed. The removal is done in-place, changing the list. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. Remove subsequent consecutive equal items from a list or array. In each run of consecutive equal items in the list, all items after the first item in the run are removed. The replacement is done in-place, changing the list. A passed IEqualityComparer is used to determine equality. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. Remove consecutive "equal" items from a list or array. In each run of consecutive equal items in the list, all items after the first item in the run are removed. The replacement is done in-place, changing the list. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being tested for need not be true equality. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. The BinaryPredicate used to compare items for "equality". Finds the first occurence of consecutive equal items in the list. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to examine. The number of consecutive equal items to look for. The count must be at least 1. The index of the first item in the first run of consecutive equal items, or -1 if no such run exists.. Finds the first occurence of consecutive equal items in the list. A passed IEqualityComparer is used to determine equality. The list to examine. The number of consecutive equal items to look for. The count must be at least 1. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. The index of the first item in the first run of consecutive equal items, or -1 if no such run exists. Finds the first occurence of consecutive "equal" items in the list. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being tested for need not be true equality. The list to examine. The number of consecutive equal items to look for. The count must be at least 1. The BinaryPredicate used to compare items for "equality". The index of the first item in the first run of consecutive equal items, or -1 if no such run exists. Finds the first occurence of consecutive items in the list for which a given predicate returns true. The list to examine. The number of consecutive items to look for. The count must be at least 1. The predicate used to test each item. The index of the first item in the first run of items where returns true for all items in the run, or -1 if no such run exists. Finds the first item in a collection that satisfies the condition defined by . If the default value for T could be present in the collection, and would be matched by the predicate, then this method is inappropriate, because you cannot disguish whether the default value for T was actually present in the collection, or no items matched the predicate. In this case, use TryFindFirstWhere. The collection to search. A delegate that defined the condition to check for. The first item in the collection that matches the condition, or the default value for T (0 or null) if no item that matches the condition is found. Finds the first item in a collection that satisfies the condition defined by . The collection to search. A delegate that defined the condition to check for. Outputs the first item in the collection that matches the condition, if the method returns true. True if an item satisfying the condition was found. False if no such item exists in the collection. Finds the last item in a collection that satisfies the condition defined by . If the collection implements IList<T>, then the list is scanned in reverse until a matching item is found. Otherwise, the entire collection is iterated in the forward direction. If the default value for T could be present in the collection, and would be matched by the predicate, then this method is inappropriate, because you cannot disguish whether the default value for T was actually present in the collection, or no items matched the predicate. In this case, use TryFindFirstWhere. The collection to search. A delegate that defined the condition to check for. The last item in the collection that matches the condition, or the default value for T (0 or null) if no item that matches the condition is found. Finds the last item in a collection that satisfies the condition defined by . If the collection implements IList<T>, then the list is scanned in reverse until a matching item is found. Otherwise, the entire collection is iterated in the forward direction. The collection to search. A delegate that defined the condition to check for. Outputs the last item in the collection that matches the condition, if the method returns true. True if an item satisfying the condition was found. False if no such item exists in the collection. Enumerates all the items in that satisfy the condition defined by . The collection to check all the items in. A delegate that defines the condition to check for. An IEnumerable<T> that enumerates the items that satisfy the condition. Finds the index of the first item in a list that satisfies the condition defined by . The list to search. A delegate that defined the condition to check for. The index of the first item satisfying the condition. -1 if no such item exists in the list. Finds the index of the last item in a list that satisfies the condition defined by . The list to search. A delegate that defined the condition to check for. The index of the last item satisfying the condition. -1 if no such item exists in the list. Enumerates the indices of all the items in that satisfy the condition defined by . The list to check all the items in. A delegate that defines the condition to check for. An IEnumerable<T> that enumerates the indices of items that satisfy the condition. Finds the index of the first item in a list equal to a given item. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. The item to search for. The index of the first item equal to . -1 if no such item exists in the list. Finds the index of the first item in a list equal to a given item. A passed IEqualityComparer is used to determine equality. The list to search. The item to search for. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. The index of the first item equal to . -1 if no such item exists in the list. Finds the index of the last item in a list equal to a given item. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. The item to search for. The index of the last item equal to . -1 if no such item exists in the list. Finds the index of the last item in a list equal to a given item. A passed IEqualityComparer is used to determine equality. The list to search. The item to search for. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. The index of the last item equal to . -1 if no such item exists in the list. Enumerates the indices of all the items in a list equal to a given item. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. The item to search for. An IEnumerable<T> that enumerates the indices of items equal to . Enumerates the indices of all the items in a list equal to a given item. A passed IEqualityComparer is used to determine equality. The list to search. The item to search for. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. An IEnumerable<T> that enumerates the indices of items equal to . Finds the index of the first item in a list equal to one of several given items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. The items to search for. The index of the first item equal to any of the items in the collection . -1 if no such item exists in the list. Finds the index of the first item in a list equal to one of several given items. A passed IEqualityComparer is used to determine equality. The list to search. The items to search for. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode methods will be called. The index of the first item equal to any of the items in the collection . -1 if no such item exists in the list. Finds the index of the first item in a list "equal" to one of several given items. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being removed need not be true equality. This methods finds first item X which satisfies BinaryPredicate(X,Y), where Y is one of the items in The list to search. The items to search for. The BinaryPredicate used to compare items for "equality". The index of the first item "equal" to any of the items in the collection , using as the test for equality. -1 if no such item exists in the list. Finds the index of the last item in a list equal to one of several given items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. The items to search for. The index of the last item equal to any of the items in the collection . -1 if no such item exists in the list. Finds the index of the last item in a list equal to one of several given items. A passed IEqualityComparer is used to determine equality. The list to search. The items to search for. The IEqualityComparer<T> used to compare items for equality. The index of the last item equal to any of the items in the collection . -1 if no such item exists in the list. Finds the index of the last item in a list "equal" to one of several given items. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being removed need not be true equality. This methods finds last item X which satisfies BinaryPredicate(X,Y), where Y is one of the items in The list to search. The items to search for. The BinaryPredicate used to compare items for "equality". The index of the last item "equal" to any of the items in the collection , using as the test for equality. -1 if no such item exists in the list. Enumerates the indices of all the items in a list equal to one of several given items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. A collection of items to search for. An IEnumerable<T> that enumerates the indices of items equal to any of the items in the collection . Enumerates the indices of all the items in a list equal to one of several given items. A passed IEqualityComparer is used to determine equality. The list to search. A collection of items to search for. The IEqualityComparer<T> used to compare items for equality. An IEnumerable<T> that enumerates the indices of items equal to any of the items in the collection . Enumerates the indices of all the items in a list equal to one of several given items. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being removed need not be true equality. This methods finds last item X which satisfies BinaryPredicate(X,Y), where Y is one of the items in The list to search. A collection of items to search for. The BinaryPredicate used to compare items for "equality". An IEnumerable<T> that enumerates the indices of items "equal" to any of the items in the collection , using as the test for equality. Searchs a list for a sub-sequence of items that match a particular pattern. A subsequence of matches pattern at index i if list[i] is equal to the first item in , list[i+1] is equal to the second item in , and so forth for all the items in . The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The type of items in the list. The list to search. The sequence of items to search for. The first index with that matches the items in . Searchs a list for a sub-sequence of items that match a particular pattern. A subsequence of matches pattern at index i if list[i] is "equal" to the first item in , list[i+1] is "equal" to the second item in , and so forth for all the items in . The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being tested for in the pattern need not be equality. The type of items in the list. The list to search. The sequence of items to search for. The BinaryPredicate used to compare items for "equality". The first index with that matches the items in . Searchs a list for a sub-sequence of items that match a particular pattern. A subsequence of matches pattern at index i if list[i] is equal to the first item in , list[i+1] is equal to the second item in , and so forth for all the items in . The passed instance of IEqualityComparer<T> is used for determining if two items are equal. The type of items in the list. The list to search. The sequence of items to search for. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. The first index with that matches the items in . Determines if one collection is a subset of another, considered as sets. The first set is a subset of the second set if every item in the first set also occurs in the second set. If an item appears X times in the first set, it must appear at least X times in the second set. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsSubsetOf method on that class. The first collection. The second collection. True if is a subset of , considered as sets. or is null. Determines if one collection is a subset of another, considered as sets. The first set is a subset of the second set if every item in the first set also occurs in the second set. If an item appears X times in the first set, it must appear at least X times in the second set. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsSubsetOf method on that class. The first collection. The second collection. The IEqualityComparer<T> used to compare items for equality. True if is a subset of , considered as sets. or is null. Determines if one collection is a proper subset of another, considered as sets. The first set is a proper subset of the second set if every item in the first set also occurs in the second set, and the first set is strictly smaller than the second set. If an item appears X times in the first set, it must appear at least X times in the second set. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsSubsetOf method on that class. The first collection. The second collection. True if is a subset of , considered as sets. or is null. Determines if one collection is a proper subset of another, considered as sets. The first set is a proper subset of the second set if every item in the first set also occurs in the second set, and the first set is strictly smaller than the second set. If an item appears X times in the first set, it must appear at least X times in the second set. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsSubsetOf method on that class. The first collection. The second collection. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. True if is a proper subset of , considered as sets. or is null. Determines if two collections are disjoint, considered as sets. Two sets are disjoint if they have no common items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsDisjoint method on that class. The first collection. The second collection. True if are are disjoint, considered as sets. or is null. Determines if two collections are disjoint, considered as sets. Two sets are disjoint if they have no common items. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsDisjoint method on that class. The first collection. The second collection. The IEqualityComparerComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. True if are are disjoint, considered as sets. or is null. Determines if two collections are equal, considered as sets. Two sets are equal if they have have the same items, with order not being significant. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the EqualTo method on that class. The first collection. The second collection. True if are are equal, considered as sets. or is null. Determines if two collections are equal, considered as sets. Two sets are equal if they have have the same items, with order not being significant. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the EqualTo method on that class. The first collection. The second collection. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. True if are are equal, considered as sets. or is null. Computes the set-theoretic intersection of two collections. The intersection of two sets is all items that appear in both of the sets. If an item appears X times in one set, and Y times in the other set, the intersection contains the item Minimum(X,Y) times. The source collections are not changed. A new collection is created with the intersection of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the Intersection or IntersectionWith methods on that class. The first collection to intersect. The second collection to intersect. The intersection of the two collections, considered as sets. or is null. Computes the set-theoretic intersection of two collections. The intersection of two sets is all items that appear in both of the sets. If an item appears X times in one set, and Y times in the other set, the intersection contains the item Minimum(X,Y) times. The source collections are not changed. A new collection is created with the intersection of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the Intersection or IntersectionWith methods on that class. The first collection to intersect. The second collection to intersect. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. The intersection of the two collections, considered as sets. or is null. Computes the set-theoretic union of two collections. The union of two sets is all items that appear in either of the sets. If an item appears X times in one set, and Y times in the other set, the union contains the item Maximum(X,Y) times. The source collections are not changed. A new collection is created with the union of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the Union or UnionWith methods on that class. The first collection to union. The second collection to union. The union of the two collections, considered as sets. or is null. Computes the set-theoretic union of two collections. The union of two sets is all items that appear in either of the sets. If an item appears X times in one set, and Y times in the other set, the union contains the item Maximum(X,Y) times. The source collections are not changed. A new collection is created with the union of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the union or unionWith methods on that class. The first collection to union. The second collection to union. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. The union of the two collections, considered as sets. or is null. Computes the set-theoretic difference of two collections. The difference of two sets is all items that appear in the first set, but not in the second. If an item appears X times in the first set, and Y times in the second set, the difference contains the item X - Y times (0 times if X < Y). The source collections are not changed. A new collection is created with the difference of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the Difference or DifferenceWith methods on that class. The first collection to difference. The second collection to difference. The difference of and , considered as sets. or is null. Computes the set-theoretic difference of two collections. The difference of two sets is all items that appear in the first set, but not in the second. If an item appears X times in the first set, and Y times in the second set, the difference contains the item X - Y times (0 times if X < Y). The source collections are not changed. A new collection is created with the difference of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the difference or differenceWith methods on that class. The first collection to difference. The second collection to difference. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. The difference of and , considered as sets. or is null. Computes the set-theoretic symmetric difference of two collections. The symmetric difference of two sets is all items that appear in the one of the sets, but not in the other. If an item appears X times in the one set, and Y times in the other set, the symmetric difference contains the item AbsoluteValue(X - Y) times. The source collections are not changed. A new collection is created with the symmetric difference of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the SymmetricDifference or SymmetricDifferenceWith methods on that class. The first collection to symmetric difference. The second collection to symmetric difference. The symmetric difference of and , considered as sets. or is null. Computes the set-theoretic symmetric difference of two collections. The symmetric difference of two sets is all items that appear in the one of the sets, but not in the other. If an item appears X times in the one set, and Y times in the other set, the symmetric difference contains the item AbsoluteValue(X - Y) times. The source collections are not changed. A new collection is created with the symmetric difference of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the symmetric difference or symmetric differenceWith methods on that class. The first collection to symmetric difference. The second collection to symmetric difference. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. The symmetric difference of and , considered as sets. or is null. Computes the cartestian product of two collections: all possible pairs of items, with the first item taken from the first collection and the second item taken from the second collection. If the first collection has N items, and the second collection has M items, the cartesian product will have N * M pairs. The type of items in the first collection. The type of items in the second collection. The first collection. The second collection. An IEnumerable<Pair<TFirst, TSecond>> that enumerates the cartesian product of the two collections. Gets a string representation of the elements in the collection. The string representation starts with "{", has a list of items separated by commas (","), and ends with "}". Each item in the collection is converted to a string by calling its ToString method (null is represented by "null"). Contained collections (except strings) are recursively converted to strings by this method. A collection to get the string representation of. The string representation of the collection. If is null, then the string "null" is returned. Gets a string representation of the elements in the collection. The string to used at the beginning and end, and to separate items, and supplied by parameters. Each item in the collection is converted to a string by calling its ToString method (null is represented by "null"). A collection to get the string representation of. If true, contained collections (except strings) are converted to strings by a recursive call to this method, instead of by calling ToString. The string to appear at the beginning of the output string. The string to appear between each item in the string. The string to appear at the end of the output string. The string representation of the collection. If is null, then the string "null" is returned. , , or is null. Gets a string representation of the mappings in a dictionary. The string representation starts with "{", has a list of mappings separated by commas (", "), and ends with "}". Each mapping is represented by "key->value". Each key and value in the dictionary is converted to a string by calling its ToString method (null is represented by "null"). Contained collections (except strings) are recursively converted to strings by this method. A dictionary to get the string representation of. The string representation of the collection, or "null" if is null. Return a private random number generator to use if the user doesn't supply one. The private random number generator. Only one is ever created and is always returned. Randomly shuffles the items in a collection, yielding a new collection. The type of the items in the collection. The collection to shuffle. An array with the same size and items as , but the items in a randomly chosen order. Randomly shuffles the items in a collection, yielding a new collection. The type of the items in the collection. The collection to shuffle. The random number generator to use to select the random order. An array with the same size and items as , but the items in a randomly chosen order. Randomly shuffles the items in a list or array, in place. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to shuffle. Randomly shuffles the items in a list or array, in place. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to shuffle. The random number generator to use to select the random order. Picks a random subset of items from , and places those items into a random order. No item is selected more than once. If the collection implements IList<T>, then this method takes time O(). Otherwise, this method takes time O(N), where N is the number of items in the collection. The type of items in the collection. The collection of items to select from. This collection is not changed. The number of items in the subset to choose. An array of items, selected at random from . is negative or greater than .Count. Picks a random subset of items from , and places those items into a random order. No item is selected more than once. If the collection implements IList<T>, then this method takes time O(). Otherwise, this method takes time O(N), where N is the number of items in the collection. The type of items in the collection. The collection of items to select from. This collection is not changed. The number of items in the subset to choose. The random number generates used to make the selection. An array of items, selected at random from . is negative or greater than .Count. is null. Generates all the possible permutations of the items in . If has N items, then N factorial permutations will be generated. This method does not compare the items to determine if any of them are equal. If some items are equal, the same permutation may be generated more than once. For example, if the collections contains the three items A, A, and B, then this method will generate the six permutations, AAB, AAB, ABA, ABA, BAA, BAA (not necessarily in that order). To take equal items into account, use the GenerateSortedPermutations method. The type of items to permute. The collection of items to permute. An IEnumerable<T[]> that enumerations all the possible permutations of the items in . Each permutations is returned as an array. The items in the array should be copied if they need to be used after the next permutation is generated; each permutation may reuse the same array instance. Generates all the possible permutations of the items in , in lexicographical order. Even if some items are equal, the same permutation will not be generated more than once. For example, if the collections contains the three items A, A, and B, then this method will generate only the three permutations, AAB, ABA, BAA. The type of items to permute. The collection of items to permute. An IEnumerable<T[]> that enumerations all the possible permutations of the items in . Each permutations is returned as an array. The items in the array should be copied if they need to be used after the next permutation is generated; each permutation may reuse the same array instance. Generates all the possible permutations of the items in , in lexicographical order. A supplied IComparer<T> instance is used to compare the items. Even if some items are equal, the same permutation will not be generated more than once. For example, if the collections contains the three items A, A, and B, then this method will generate only the three permutations, AAB, ABA, BAA. The type of items to permute. The collection of items to permute. The IComparer<T> used to compare the items. An IEnumerable<T[]> that enumerations all the possible permutations of the items in . Each permutations is returned as an array. The items in the array should be copied if they need to be used after the next permutation is generated; each permutation may reuse the same array instance. Generates all the possible permutations of the items in , in lexicographical order. A supplied Comparison<T> delegate is used to compare the items. Even if some items are equal, the same permutation will not be generated more than once. For example, if the collections contains the three items A, A, and B, then this method will generate only the three permutations, AAB, ABA, BAA. The type of items to permute. The collection of items to permute. The Comparison<T> delegate used to compare the items. An IEnumerable<T[]> that enumerations all the possible permutations of the items in . Each permutations is returned as an array. The items in the array should be copied if they need to be used after the next permutation is generated; each permutation may reuse the same array instance. Finds the maximum value in a collection. Values in the collection are compared by using the IComparable<T> interfaces implementation on the type T. The type of items in the collection. The collection to search. The largest item in the collection. The collection is empty. is null. Finds the maximum value in a collection. A supplied IComparer<T> is used to compare the items in the collection. The type of items in the collection. The collection to search. The comparer instance used to compare items in the collection. The largest item in the collection. The collection is empty. or is null. Finds the maximum value in a collection. A supplied Comparison<T> delegate is used to compare the items in the collection. The type of items in the collection. The collection to search. The comparison used to compare items in the collection. The largest item in the collection. The collection is empty. or is null. Finds the minimum value in a collection. Values in the collection are compared by using the IComparable<T> interfaces implementation on the type T. The type of items in the collection. The collection to search. The smallest item in the collection. The collection is empty. is null. Finds the minimum value in a collection. A supplied IComparer<T> is used to compare the items in the collection. The type of items in the collection. The collection to search. The comparer instance used to compare items in the collection. The smallest item in the collection. The collection is empty. or is null. Finds the minimum value in a collection. A supplied Comparison<T> delegate is used to compare the items in the collection. The type of items in the collection. The collection to search. The comparison used to compare items in the collection. The smallest item in the collection. The collection is empty. or is null. Finds the index of the maximum value in a list. Values in the list are compared by using the IComparable<T> interfaces implementation on the type T. The type of items in the list. The list to search. The index of the largest item in the list. If the maximum value appears multiple times, the index of the first appearance is used. If the list is empty, -1 is returned. is null. Finds the index of the maximum value in a list. A supplied IComparer<T> is used to compare the items in the collection. The type of items in the list. The list to search. The comparer instance used to compare items in the collection. The index of the largest item in the list. If the maximum value appears multiple times, the index of the first appearance is used. If the list is empty, -1 is returned. or is null. Finds the index of the maximum value in a list. A supplied Comparison<T> delegate is used to compare the items in the collection. The type of items in the list. The list to search. The comparison used to compare items in the collection. The index of the largest item in the list. If the maximum value appears multiple times, the index of the first appearance is used. If the list is empty, -1 is returned. or is null. Finds the index of the minimum value in a list. Values in the list are compared by using the IComparable<T> interfaces implementation on the type T. The type of items in the list. The list to search. The index of the smallest item in the list. If the minimum value appears multiple times, the index of the first appearance is used. The collection is empty. is null. Finds the index of the minimum value in a list. A supplied IComparer<T> is used to compare the items in the collection. The type of items in the list. The list to search. The comparer instance used to compare items in the collection. The index of the smallest item in the list. If the minimum value appears multiple times, the index of the first appearance is used. The collection is empty. or is null. Finds the index of the minimum value in a list. A supplied Comparison<T> delegate is used to compare the items in the collection. The type of items in the list. The list to search. The comparison delegate used to compare items in the collection. The index of the smallest item in the list. If the minimum value appears multiple times, the index of the first appearance is used. The collection is empty. or is null. Creates a sorted version of a collection. Values are compared by using the IComparable<T> interfaces implementation on the type T. The collection to sort. An array containing the sorted version of the collection. Creates a sorted version of a collection. A supplied IComparer<T> is used to compare the items in the collection. The collection to sort. The comparer instance used to compare items in the collection. Only the Compare method is used. An array containing the sorted version of the collection. Creates a sorted version of a collection. A supplied Comparison<T> delegate is used to compare the items in the collection. The collection to sort. The comparison delegate used to compare items in the collection. An array containing the sorted version of the collection. Sorts a list or array in place. The Quicksort algorithms is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. Values are compared by using the IComparable<T> interfaces implementation on the type T. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. Sorts a list or array in place. A supplied IComparer<T> is used to compare the items in the list. The Quicksort algorithms is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. The comparer instance used to compare items in the collection. Only the Compare method is used. Sorts a list or array in place. A supplied Comparison<T> delegate is used to compare the items in the list. The Quicksort algorithms is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. The comparison delegate used to compare items in the collection. Creates a sorted version of a collection. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. Values are compared by using the IComparable<T> interfaces implementation on the type T. The collection to sort. An array containing the sorted version of the collection. Creates a sorted version of a collection. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. A supplied IComparer<T> is used to compare the items in the collection. The collection to sort. The comparer instance used to compare items in the collection. Only the Compare method is used. An array containing the sorted version of the collection. Creates a sorted version of a collection. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. A supplied Comparison<T> delegate is used to compare the items in the collection. Values are compared by using the IComparable<T> interfaces implementation on the type T. The collection to sort. The comparison delegate used to compare items in the collection. An array containing the sorted version of the collection. Sorts a list or array in place. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. Values are compared by using the IComparable<T> interfaces implementation on the type T. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. Sorts a list or array in place. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. A supplied IComparer<T> is used to compare the items in the list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. The comparer instance used to compare items in the collection. Only the Compare method is used. Sorts a list or array in place. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. A supplied Comparison<T> delegate is used to compare the items in the list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. The comparison delegate used to compare items in the collection. Searches a sorted list for an item via binary search. The list must be sorted by the natural ordering of the type (it's implementation of IComparable<T>). The sorted list to search. The item to search for. Returns the first index at which the item can be found. If the return value is zero, indicating that was not present in the list, then this returns the index at which could be inserted to maintain the sorted order of the list. The number of items equal to that appear in the list. Searches a sorted list for an item via binary search. The list must be sorted by the ordering in the passed instance of IComparer<T>. The sorted list to search. The item to search for. The comparer instance used to sort the list. Only the Compare method is used. Returns the first index at which the item can be found. If the return value is zero, indicating that was not present in the list, then this returns the index at which could be inserted to maintain the sorted order of the list. The number of items equal to that appear in the list. Searches a sorted list for an item via binary search. The list must be sorted by the ordering in the passed Comparison<T> delegate. The sorted list to search. The item to search for. The comparison delegate used to sort the list. Returns the first index at which the item can be found. If the return value is zero, indicating that was not present in the list, then this returns the index at which could be inserted to maintain the sorted order of the list. The number of items equal to that appear in the list. Merge several sorted collections into a single sorted collection. Each input collection must be sorted by the natural ordering of the type (it's implementation of IComparable<T>). The merging is stable; equal items maintain their ordering, and equal items in different collections are placed in the order of the collections. The set of collections to merge. In many languages, this parameter can be specified as several individual parameters. An IEnumerable<T> that enumerates all the items in all the collections in sorted order. Merge several sorted collections into a single sorted collection. Each input collection must be sorted by the ordering in the passed instance of IComparer<T>. The merging is stable; equal items maintain their ordering, and equal items in different collections are placed in the order of the collections. The set of collections to merge. In many languages, this parameter can be specified as several individual parameters. The comparer instance used to sort the list. Only the Compare method is used. An IEnumerable<T> that enumerates all the items in all the collections in sorted order. Merge several sorted collections into a single sorted collection. Each input collection must be sorted by the ordering in the passed Comparison<T> delegate. The merging is stable; equal items maintain their ordering, and equal items in different collections are placed in the order of the collections. The set of collections to merge. In many languages, this parameter can be specified as several individual parameters. The comparison delegate used to sort the collections. An IEnumerable<T> that enumerates all the items in all the collections in sorted order. Performs a lexicographical comparison of two sequences of values. A lexicographical comparison compares corresponding pairs of elements from two sequences in order. If the first element of sequence1 is less than the first element of sequence2, then the comparison ends and the first sequence is lexicographically less than the second. If the first elements of each sequence are equal, then the comparison proceeds to the second element of each sequence. If one sequence is shorter than the other, but corresponding elements are all equal, then the shorter sequence is considered less than the longer one. T must implement either IComparable<T> and this implementation is used to compare the items. Types of items to compare. This type must implement IComparable<T> to allow items to be compared. The first sequence to compare. The second sequence to compare. Less than zero if is lexicographically less than . Greater than zero if is lexicographically greater than . Zero if is equal to . T does not implement IComparable<T> or IComparable. Performs a lexicographical comparison of two sequences of values, using a supplied comparison delegate. A lexicographical comparison compares corresponding pairs of elements from two sequences in order. If the first element of sequence1 is less than the first element of sequence2, then the comparison ends and the first sequence is lexicographically less than the second. If the first elements of each sequence are equal, then the comparison proceeds to the second element of each sequence. If one sequence is shorter than the other, but corresponding elements are all equal, then the shorter sequence is considered less than the longer one. Types of items to compare. The first sequence to compare. The second sequence to compare. The IComparison<T> delegate to compare items. Only the Compare member function of this interface is called. Less than zero if is lexicographically less than . Greater than zero if is lexicographically greater than . Zero if is equal to . Performs a lexicographical comparison of two sequences of values, using a supplied comparer interface. A lexicographical comparison compares corresponding pairs of elements from two sequences in order. If the first element of sequence1 is less than the first element of sequence2, then the comparison ends and the first sequence is lexicographically less than the second. If the first elements of each sequence are equal, then the comparison proceeds to the second element of each sequence. If one sequence is shorter than the other, but corresponding elements are all equal, then the shorter sequence is considered less than the longer one. Types of items to compare. The first sequence to compare. The second sequence to compare. The IComparer<T> used to compare items. Only the Compare member function of this interface is called. Less than zero if is lexicographically less than . Greater than zero if is lexicographically greater than . Zero if is equal to . , , or is null. Creates an IComparer instance that can be used for comparing ordered sequences of type T; that is IEnumerable<Tgt;. This comparer can be used for collections or algorithms that use sequences of T as an item type. The Lexicographical ordered of sequences is for comparison. T must implement either IComparable<T> and this implementation is used to compare the items. At IComparer<IEnumerable<T>> that compares sequences of T. Creates an IComparer instance that can be used for comparing ordered sequences of type T; that is IEnumerable<Tgt;. This comparer can be uses for collections or algorithms that use sequences of T as an item type. The Lexicographics ordered of sequences is for comparison. A comparer instance used to compare individual items of type T. At IComparer<IEnumerable<T>> that compares sequences of T. Creates an IComparer instance that can be used for comparing ordered sequences of type T; that is IEnumerable<Tgt;. This comparer can be uses for collections or algorithms that use sequences of T as an item type. The Lexicographics ordered of sequences is for comparison. A comparison delegate used to compare individual items of type T. At IComparer<IEnumerable<T>> that compares sequences of T. Reverses the order of comparison of an IComparer<T>. The resulting comparer can be used, for example, to sort a collection in descending order. Equality and hash codes are unchanged. The type of items thta are being compared. The comparer to reverse. An IComparer<T> that compares items in the reverse order of . is null. Gets an IEqualityComparer<T> instance that can be used to compare objects of type T for object identity only. Two objects compare equal only if they are references to the same object. An IEqualityComparer<T> instance for identity comparison. Reverses the order of comparison of an Comparison<T>. The resulting comparison can be used, for example, to sort a collection in descending order. The type of items that are being compared. The comparison to reverse. A Comparison<T> that compares items in the reverse order of . is null. Given a comparison delegate that compares two items of type T, gets an IComparer<T> instance that performs the same comparison. The comparison delegate to use. An IComparer<T> that performs the same comparing operation as . Given in IComparer<T> instenace that comparers two items from type T, gets a Comparison delegate that performs the same comparison. The IComparer<T> instance to use. A Comparison<T> delegate that performans the same comparing operation as . Gets an IEqualityComparer<IEnumerable<T>> implementation that can be used to compare collections of elements (of type T). Two collections of T's are equal if they have the same number of items, and corresponding items are equal, considered in order. This is the same notion of equality as in Algorithms.EqualCollections, but encapsulated in an IEqualityComparer<IEnumerable<T>> implementation. The following code creates a Dictionary where the keys are a collection of strings. Dictionary<IEnumerable<string>, int> = new Dictionary<IEnumerable<string>, int>(Algorithms.GetCollectionEqualityComparer<string>()); IEqualityComparer<IEnumerable<T>> implementation suitable for comparing collections of T for equality. Gets an IEqualityComparer<IEnumerable<T>> implementation that can be used to compare collections of elements (of type T). Two collections of T's are equal if they have the same number of items, and corresponding items are equal, considered in order. This is the same notion of equality as in Algorithms.EqualCollections, but encapsulated in an IEqualityComparer<IEnumerable<T>> implementation. An IEqualityComparer<T> is used to determine if individual T's are equal The following code creates a Dictionary where the keys are a collection of strings, compared in a case-insensitive way Dictionary<IEnumerable<string>, int> = new Dictionary<IEnumerable<string>, int>(Algorithms.GetCollectionEqualityComparer<string>(StringComparer.CurrentCultureIgnoreCase)); An IEqualityComparer<T> implementation used to compare individual T's. IEqualityComparer<IEnumerable<T>> implementation suitable for comparing collections of T for equality. Gets an IEqualityComparer<IEnumerable<T>> implementation that can be used to compare collections of elements (of type T). Two collections of T's are equal if they have the same number of items, and corresponding items are equal, without regard to order. This is the same notion of equality as in Algorithms.EqualSets, but encapsulated in an IEqualityComparer<IEnumerable<T>> implementation. An IEqualityComparer<T> is used to determine if individual T's are equal The following code creates a Dictionary where the keys are a set of strings, without regard to order Dictionary<IEnumerable<string>, int> = new Dictionary<IEnumerable<string>, int>(Algorithms.GetSetEqualityComparer<string>(StringComparer.CurrentCultureIgnoreCase)); IEqualityComparer<IEnumerable<T>> implementation suitable for comparing collections of T for equality, without regard to order. Gets an IEqualityComparer<IEnumerable<T>> implementation that can be used to compare collections of elements (of type T). Two collections of T's are equal if they have the same number of items, and corresponding items are equal, without regard to order. This is the same notion of equality as in Algorithms.EqualSets, but encapsulated in an IEqualityComparer<IEnumerable<T>> implementation. The following code creates a Dictionary where the keys are a set of strings, without regard to order Dictionary<IEnumerable<string>, int> = new Dictionary<IEnumerable<string>, int>(Algorithms.GetSetEqualityComparer<string>()); An IEqualityComparer<T> implementation used to compare individual T's. IEqualityComparer<IEnumerable<T>> implementation suitable for comparing collections of T for equality, without regard to order. Determines if a collection contains any item that satisfies the condition defined by . The collection to check all the items in. A delegate that defines the condition to check for. True if the collection contains one or more items that satisfy the condition defined by . False if the collection does not contain an item that satisfies . Determines if all of the items in the collection satisfy the condition defined by . The collection to check all the items in. A delegate that defines the condition to check for. True if all of the items in the collection satisfy the condition defined by , or if the collection is empty. False if one or more items in the collection do not satisfy . Counts the number of items in the collection that satisfy the condition defined by . The collection to count items in. A delegate that defines the condition to check for. The number of items in the collection that satisfy . Removes all the items in the collection that satisfy the condition defined by . If the collection if an array or implements IList<T>, an efficient algorithm that compacts items is used. If not, then ICollection<T>.Remove is used to remove items from the collection. If the collection is an array or fixed-size list, the non-removed elements are placed, in order, at the beginning of the list, and the remaining list items are filled with a default value (0 or null). The collection to check all the items in. A delegate that defines the condition to check for. Returns a collection of the items that were removed. This collection contains the items in the same order that they orginally appeared in . Convert a collection of items by applying a delegate to each item in the collection. The resulting collection contains the result of applying to each item in , in order. The type of items in the collection to convert. The type each item is being converted to. The collection of item being converted. A delegate to the method to call, passing each item in . The resulting collection from applying to each item in , in order. or is null. Creates a delegate that converts keys to values by used a dictionary to map values. Keys that a not present in the dictionary are converted to the default value (zero or null). This delegate can be used as a parameter in Convert or ConvertAll methods to convert entire collections. The dictionary used to perform the conversion. A delegate to a method that converts keys to values. Creates a delegate that converts keys to values by used a dictionary to map values. Keys that a not present in the dictionary are converted to a supplied default value. This delegate can be used as a parameter in Convert or ConvertAll methods to convert entire collections. The dictionary used to perform the conversion. The result of the conversion for keys that are not present in the dictionary. A delegate to a method that converts keys to values. is null. Performs the specified action on each item in a collection. The collection to process. An Action delegate which is invoked for each item in . Partition a list or array based on a predicate. After partitioning, all items for which the predicate returned true precede all items for which the predicate returned false. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to partition. A delegate that defines the partitioning condition. The index of the first item in the second half of the partition; i.e., the first item for which returned false. If the predicate was true for all items in the list, list.Count is returned. Partition a list or array based on a predicate. After partitioning, all items for which the predicate returned true precede all items for which the predicate returned false. The partition is stable, which means that if items X and Y have the same result from the predicate, and X precedes Y in the original list, X will precede Y in the partitioned list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to partition. A delegate that defines the partitioning condition. The index of the first item in the second half of the partition; i.e., the first item for which returned false. If the predicate was true for all items in the list, list.Count is returned. Concatenates all the items from several collections. The collections need not be of the same type, but must have the same item type. The set of collections to concatenate. In many languages, this parameter can be specified as several individual parameters. An IEnumerable that enumerates all the items in each of the collections, in order. Determines if the two collections contain equal items in the same order. The two collections do not need to be of the same type; it is permissible to compare an array and an OrderedBag, for instance. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The type of items in the collections. The first collection to compare. The second collection to compare. True if the collections have equal items in the same order. If both collections are empty, true is returned. Determines if the two collections contain equal items in the same order. The passed instance of IEqualityComparer<T> is used for determining if two items are equal. The type of items in the collections. The first collection to compare. The second collection to compare. The IEqualityComparer<T> used to compare items for equality. Only the Equals member function of this interface is called. True if the collections have equal items in the same order. If both collections are empty, true is returned. , , or is null. Determines if the two collections contain "equal" items in the same order. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being tested for need not be equality. For example, the following code determines if each integer in list1 is less than or equal to the corresponding integer in list2. List<int> list1, list2; if (EqualCollections(list1, list2, delegate(int x, int y) { return x <= y; }) { // the check is true... } The type of items in the collections. The first collection to compare. The second collection to compare. The BinaryPredicate used to compare items for "equality". This predicate can compute any relation between two items; it need not represent equality or an equivalence relation. True if returns true for each corresponding pair of items in the two collections. If both collections are empty, true is returned. , , or is null. Create an array with the items in a collection. If implements ICollection<T>T, then ICollection<T>.CopyTo() is used to fill the array. Otherwise, the IEnumerable<T>.GetEnumerator() is used to fill the array. Element type of the collection. Collection to create array from. An array with the items from the collection, in enumeration order. is null. Count the number of items in an IEnumerable<T> collection. If a more specific collection type is being used, it is more efficient to use the Count property, if one is provided. If the collection implements ICollection<T>, this method simply returns ICollection<T>.Count. Otherwise, it enumerates all items and counts them. The collection to count items in. The number of items in the collection. is null. Counts the number of items in the collection that are equal to . The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The collection to count items in. The item to compare to. The number of items in the collection that are equal to . Counts the number of items in the collection that are equal to . The collection to count items in. The item to compare to. The comparer to use to determine if two items are equal. Only the Equals member function will be called. The number of items in the collection that are equal to . or is null. Creates an IEnumerator that enumerates a given item times. The following creates a list consisting of 1000 copies of the double 1.0. List<double> list = new List<double>(Algorithms.NCopiesOf(1000, 1.0)); The number of times to enumerate the item. The item that should occur in the enumeration. An IEnumerable<T> that yields copies of . The argument is less than zero. Replaces each item in a list with a given value. The list does not change in size. The type of items in the list. The list to modify. The value to fill with. is a read-only list. is null. Replaces each item in a array with a given value. The array to modify. The value to fill with. is null. Replaces each item in a part of a list with a given value. The type of items in the list. The list to modify. The index at which to start filling. The first index in the list has index 0. The number of items to fill. The value to fill with. is a read-only list. or is negative, or + is greater than .Count. is null. Replaces each item in a part of a array with a given value. The array to modify. The index at which to start filling. The first index in the array has index 0. The number of items to fill. The value to fill with. or is negative, or + is greater than .Length. is null. Copies all of the items from the collection to the list , starting at the index . If necessary, the size of the destination list is expanded. The collection that provide the source items. The list to store the items into. The index to begin copying items to. is negative or greater than .Count. or is null. Copies all of the items from the collection to the array , starting at the index . The collection that provide the source items. The array to store the items into. The index to begin copying items to. is negative or greater than .Length. or is null. The collection has more items than will fit into the array. In this case, the array has been filled with as many items as fit before the exception is thrown. Copies at most items from the collection to the list , starting at the index . If necessary, the size of the destination list is expanded. The source collection must not be the destination list or part thereof. The collection that provide the source items. The list to store the items into. The index to begin copying items to. The maximum number of items to copy. is negative or greater than .Count is negative. or is null. Copies at most items from the collection to the array , starting at the index . The source collection must not be the destination array or part thereof. The collection that provide the source items. The array to store the items into. The index to begin copying items to. The maximum number of items to copy. The array must be large enought to fit this number of items. is negative or greater than .Length. is negative or + is greater than .Length. or is null. Copies items from the list , starting at the index , to the list , starting at the index . If necessary, the size of the destination list is expanded. The source and destination lists may be the same. The collection that provide the source items. The index within to begin copying items from. The list to store the items into. The index within to begin copying items to. The maximum number of items to copy. is negative or greater than .Count is negative or greater than .Count is negative or too large. or is null. Copies items from the list or array , starting at the index , to the array , starting at the index . The source may be the same as the destination array. The list or array that provide the source items. The index within to begin copying items from. The array to store the items into. The index within to begin copying items to. The maximum number of items to copy. The destination array must be large enough to hold this many items. is negative or greater than .Count is negative or greater than .Length is negative or too large. or is null. Reverses a list and returns the reversed list, without changing the source list. The list to reverse. A collection that contains the items from in reverse order. is null. Reverses a list or array in place. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to reverse. is null. is read only. Rotates a list and returns the rotated list, without changing the source list. The list to rotate. The number of elements to rotate. This value can be positive or negative. For example, rotating by positive 3 means that source[3] is the first item in the returned collection. Rotating by negative 3 means that source[source.Count - 3] is the first item in the returned collection. A collection that contains the items from in rotated order. is null. Rotates a list or array in place. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to rotate. The number of elements to rotate. This value can be positive or negative. For example, rotating by positive 3 means that list[3] is the first item in the resulting list. Rotating by negative 3 means that list[list.Count - 3] is the first item in the resulting list. is null. The class that is used to implement IList<T> to view a sub-range of a list. The object stores a wrapped list, and a start/count indicating a sub-range of the list. Insertion/deletions through the sub-range view cause the count to change also; insertions and deletions directly on the wrapped list do not. Create a sub-range view object on the indicate part of the list. List to wrap. The start index of the view in the wrapped list. The number of items in the view. The class that is used to implement IList<T> to view a sub-range of an array. The object stores a wrapped array, and a start/count indicating a sub-range of the array. Insertion/deletions through the sub-range view cause the count to change up to the size of the underlying array. Elements fall off the end of the underlying array. Create a sub-range view object on the indicate part of the array. Array to wrap. The start index of the view in the wrapped list. The number of items in the view. The read-only ICollection<T> implementation that is used by the ReadOnly method. Methods that modify the collection throw a NotSupportedException, methods that don't modify are fowarded through to the wrapped collection. Create a ReadOnlyCollection wrapped around the given collection. Collection to wrap. Throws an NotSupportedException stating that this collection cannot be modified. The read-only IList<T> implementation that is used by the ReadOnly method. Methods that modify the list throw a NotSupportedException, methods that don't modify are fowarded through to the wrapped list. Create a ReadOnlyList wrapped around the given list. List to wrap. Throws an NotSupportedException stating that this collection cannot be modified. The private class that implements a read-only wrapped for IDictionary <TKey,TValue>. Create a read-only dictionary wrapped around the given dictionary. The IDictionary<TKey,TValue> to wrap. Throws an NotSupportedException stating that this collection cannot be modified. The class that provides a typed IEnumerator<T> view onto an untyped IEnumerator interface. Create a typed IEnumerator<T> view onto an untyped IEnumerator interface IEnumerator to wrap. The class that provides a typed IEnumerable<T> view onto an untyped IEnumerable interface. Create a typed IEnumerable<T> view onto an untyped IEnumerable interface. IEnumerable interface to wrap. The class that provides a typed ICollection<T> view onto an untyped ICollection interface. The ICollection<T> is read-only. Create a typed ICollection<T> view onto an untyped ICollection interface. ICollection interface to wrap. Throws an NotSupportedException stating that this collection cannot be modified. The class used to create a typed IList<T> view onto an untype IList interface. Create a typed IList<T> view onto an untype IList interface. The IList to wrap. The class that is used to provide an untyped ICollection view onto a typed ICollection<T> interface. Create an untyped ICollection view onto a typed ICollection<T> interface. The ICollection<T> to wrap. The class that implements a non-generic IList wrapper around a generic IList<T> interface. Create a non-generic IList wrapper around a generic IList<T> interface. The IList<T> interface to wrap. Convert the given parameter to T. Throw an ArgumentException if it isn't. parameter name parameter value The class that is used to implement IList<T> to view an array in a read-write way. Insertions cause the last item in the array to fall off, deletions replace the last item with the default value. Create a list wrapper object on an array. Array to wrap. Return true, to indicate that the list is fixed size. A private class used by the LexicographicalComparer method to compare sequences (IEnumerable) of T by there Lexicographical ordering. Creates a new instance that comparer sequences of T by their lexicographical ordered. The IComparer used to compare individual items of type T. An IComparer instance that can be used to reverse the sense of a wrapped IComparer instance. The comparer to reverse. A class, implementing IEqualityComparer<T>, that compares objects for object identity only. Only Equals and GetHashCode can be used; this implementation is not appropriate for ordering. A private class used to implement GetCollectionEqualityComparer(). This class implements IEqualityComparer<IEnumerable<T>gt; to compare two enumerables for equality, where order is significant. A private class used to implement GetSetEqualityComparer(). This class implements IEqualityComparer<IEnumerable<T>gt; to compare two enumerables for equality, where order is not significant. A holder class for various internal utility functions that need to be shared. Determine if a type is cloneable: either a value type or implementing ICloneable. Type to check. Returns if the type is a value type, and does not implement ICloneable. True if the type is cloneable. Returns the simple name of the class, for use in exception messages. The simple name of this class. Wrap an enumerable so that clients can't get to the underlying implementation via a down-case Enumerable to wrap. A wrapper around the enumerable. Gets the hash code for an object using a comparer. Correctly handles null. Item to get hash code for. Can be null. The comparer to use. The hash code for the item. Wrap an enumerable so that clients can't get to the underlying implementation via a down-cast. Create the wrapper around an enumerable. IEnumerable to wrap. BigList<T> provides a list of items, in order, with indices of the items ranging from 0 to one less than the count of items in the collection. BigList<T> is optimized for efficient operations on large (>100 items) lists, especially for insertions, deletions, copies, and concatinations. BigList<T> class is similar in functionality to the standard List<T> class. Both classes provide a collection that stores an set of items in order, with indices of the items ranging from 0 to one less than the count of items in the collection. Both classes provide the ability to add and remove items from any index, and the get or set the item at any index. BigList<T> differs significantly from List<T> in the performance of various operations, especially when the lists become large (several hundred items or more). With List<T>, inserting or removing elements from anywhere in a large list except the end is very inefficient -- every item after the point of inserting or deletion has to be moved in the list. The BigList<T> class, however, allows for fast insertions and deletions anywhere in the list. Furthermore, BigList<T> allows copies of a list, sub-parts of a list, and concatinations of two lists to be very fast. When a copy is made of part or all of a BigList, two lists shared storage for the parts of the lists that are the same. Only when one of the lists is changed is additional memory allocated to store the distinct parts of the lists. Of course, there is a small price to pay for this extra flexibility. Although still quite efficient, using an index to get or change one element of a BigList, while still reasonably efficient, is significantly slower than using a plain List. Because of this, if you want to process every element of a BigList, using a foreach loop is a lot more efficient than using a for loop and indexing the list. In general, use a List when the only operations you are using are Add (to the end), foreach, or indexing, or you are very sure the list will always remain small (less than 100 items). For large (>100 items) lists that do insertions, removals, copies, concatinations, or sub-ranges, BigList will be more efficient than List. In almost all cases, BigList is more efficient and easier to use than LinkedList. The type of items to store in the BigList. Must be called whenever there is a structural change in the tree. Causes changeStamp to be changed, which causes any in-progress enumerations to throw exceptions. Checks the given stamp against the current change stamp. If different, the collection has changed during enumeration and an InvalidOperationException must be thrown changeStamp at the start of the enumeration. Creates a new BigList. The BigList is initially empty. Creating a empty BigList takes constant time and consumes a very small amount of memory. Creates a new BigList initialized with the items from , in order. Initializing the tree list with the elements of collection takes time O(N), where N is the number of items in . The collection used to initialize the BigList. is null. Creates a new BigList initialized with a given number of copies of the items from , in order. Initializing the tree list with the elements of collection takes time O(N + log K), where N is the number of items in , and K is the number of copies. Number of copies of the collection to use. The collection used to initialize the BigList. is negative. is null. Creates a new BigList that is a copy of . Copying a BigList takes constant time, and little additional memory, since the storage for the items of the two lists is shared. However, changing either list will take additional time and memory. Portions of the list are copied when they are changed. The BigList to copy. is null. Creates a new BigList that is several copies of . Creating K copies of a BigList takes time O(log K), and O(log K) additional memory, since the storage for the items of the two lists is shared. However, changing either list will take additional time and memory. Portions of the list are copied when they are changed. Number of copies of the collection to use. The BigList to copy. is null. Creates a new BigList from the indicated Node. Node that becomes the new root. If null, the new BigList is empty. Removes all of the items from the BigList. Clearing a BigList takes constant time. Inserts a new item at the given index in the BigList. All items at indexes equal to or greater than move up one index. The amount of time to insert an item is O(log N), no matter where in the list the insertion occurs. Inserting an item at the beginning or end of the list is O(N). The index to insert the item at. After the insertion, the inserted item is located at this index. The first item has index 0. The item to insert at the given index. is less than zero or greater than Count. Inserts a collection of items at the given index in the BigList. All items at indexes equal to or greater than increase their indices by the number of items inserted. The amount of time to insert an arbitrary collection in the BigList is O(M + log N), where M is the number of items inserted, and N is the number of items in the list. The index to insert the collection at. After the insertion, the first item of the inserted collection is located at this index. The first item has index 0. The collection of items to insert at the given index. is less than zero or greater than Count. is null. Inserts a BigList of items at the given index in the BigList. All items at indexes equal to or greater than increase their indices by the number of items inserted. The amount of time to insert another BigList is O(log N), where N is the number of items in the list, regardless of the number of items in the inserted list. Storage is shared between the two lists until one of them is changed. The index to insert the collection at. After the insertion, the first item of the inserted collection is located at this index. The first item has index 0. The BigList of items to insert at the given index. is less than zero or greater than Count. is null. Removes the item at the given index in the BigList. All items at indexes greater than move down one index. The amount of time to delete an item in the BigList is O(log N), where N is the number of items in the list. The index in the list to remove the item at. The first item in the list has index 0. is less than zero or greater than or equal to Count. Removes a range of items at the given index in the Deque. All items at indexes greater than move down indices in the Deque. The amount of time to delete items in the Deque is proportional to the distance of index from the closest end of the Deque, plus : O(count + Min(, Count - 1 - )). The index in the list to remove the range at. The first item in the list has index 0. The number of items to remove. is less than zero or greater than or equal to Count, or is less than zero or too large. Adds an item to the end of the BigList. The indices of all existing items in the Deque are unchanged. Adding an item takes, on average, constant time. The item to add. Adds an item to the beginning of the BigList. The indices of all existing items in the Deque are increased by one, and the new item has index zero. Adding an item takes, on average, constant time. The item to add. Adds a collection of items to the end of BigList. The indices of all existing items are unchanged. The last item in the added collection becomes the last item in the BigList. This method takes time O(M + log N), where M is the number of items in the , and N is the size of the BigList. The collection of items to add. is null. Adds a collection of items to the front of BigList. The indices of all existing items in the are increased by the number of items in . The first item in the added collection becomes the first item in the BigList. This method takes time O(M + log N), where M is the number of items in the , and N is the size of the BigList. The collection of items to add. is null. Creates a new BigList that is a copy of this list. Copying a BigList takes constant time, and little additional memory, since the storage for the items of the two lists is shared. However, changing either list will take additional time and memory. Portions of the list are copied when they are changed. A copy of the current list Creates a new BigList that is a copy of this list. Copying a BigList takes constant time, and little additional memory, since the storage for the items of the two lists is shared. However, changing either list will take additional time and memory. Portions of the list are copied when they are changed. A copy of the current list Makes a deep clone of this BigList. A new BigList is created with a clone of each element of this set, by calling ICloneable.Clone on each element. If T is a value type, then this method is the same as Clone. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. If T is a reference type, cloning the list takes time approximate O(N), where N is the number of items in the list. The cloned set. T is a reference type that does not implement ICloneable. Adds a BigList of items to the end of BigList. The indices of all existing items are unchanged. The last item in becomes the last item in this list. The added list is unchanged. This method takes, on average, constant time, regardless of the size of either list. Although conceptually all of the items in are copied, storage is shared between the two lists until changes are made to the shared sections. The list of items to add. is null. Adds a BigList of items to the front of BigList. The indices of all existing items are increased by the number of items in . The first item in becomes the first item in this list. The added list is unchanged. This method takes, on average, constant time, regardless of the size of either list. Although conceptually all of the items in are copied, storage is shared between the two lists until changes are made to the shared sections. The list of items to add. is null. Concatenates two lists together to create a new list. Both lists being concatenated are unchanged. The resulting list contains all the items in , followed by all the items in . This method takes, on average, constant time, regardless of the size of either list. Although conceptually all of the items in both lists are copied, storage is shared until changes are made to the shared sections. The first list to concatenate. The second list to concatenate. or is null. Creates a new list that contains a subrange of elements from this list. The current list is unchanged. This method takes take O(log N), where N is the size of the current list. Although the sub-range is conceptually copied, storage is shared between the two lists until a change is made to the shared items. If a view of a sub-range is desired, instead of a copy, use the more efficient method, which provides a view onto a sub-range of items. The starting index of the sub-range. The number of items in the sub-range. If this is zero, the returned list is empty. A new list with the items that start at . Returns a view onto a sub-range of this list. Items are not copied; the returned IList<T> is simply a different view onto the same underlying items. Changes to this list are reflected in the view, and vice versa. Insertions and deletions in the view change the size of the view, but insertions and deletions in the underlying list do not. If a copy of the sub-range is desired, use the method instead. This method can be used to apply an algorithm to a portion of a list. For example: Algorithms.ReverseInPlace(list.Range(3, 6)) will reverse the 6 items beginning at index 3. The starting index of the view. The number of items in the view. A list that is a view onto the given sub-list. or is negative. + is greater than the size of this list. Enumerates a range of the items in the list, in order. The item at is enumerated first, then the next item at index 1, and so on. At most items are enumerated. Enumerating all of the items in the list take time O(N), where N is the number of items being enumerated. Using GetEnumerator() or foreach is much more efficient than accessing all items by index. Index to start enumerating at. Max number of items to enumerate. An IEnumerator<T> that enumerates all the items in the given range. Enumerates all of the items in the list, in order. The item at index 0 is enumerated first, then the item at index 1, and so on. Usually, the foreach statement is used to call this method implicitly. Enumerating all of the items in the list take time O(N), where N is the number of items in the list. Using GetEnumerator() or foreach is much more efficient than accessing all items by index. An IEnumerator<T> that enumerates all the items in the list. Given an IEnumerable<T>, create a new Node with all of the items in the enumerable. Returns null if the enumerable has no items. The collection to copy. Returns a Node, not shared or with any shared children, with the items from the collection. If the collection was empty, null is returned. Consumes up to MAXLEAF items from an Enumerator and places them in a leaf node. If the enumerator is at the end, null is returned. The enumerator to take items from. A LeafNode with items taken from the enumerator. Create a node that has N copies of the given node. Number of copies. Must be non-negative. Node to make copies of. null if node is null or copies is 0. Otherwise, a node consisting of copies of node. copies is negative. Check the balance of the current tree and rebalance it if it is more than BALANCEFACTOR levels away from fully balanced. Note that rebalancing a tree may leave it two levels away from fully balanced. Rebalance the current tree. Once rebalanced, the depth of the current tree is no more than two levels from fully balanced, where fully balanced is defined as having Fibonacci(N+2) or more items in a tree of depth N. The rebalancing algorithm is from "Ropes: an Alternative to Strings", by Boehm, Atkinson, and Plass, in SOFTWARE--PRACTICE AND EXPERIENCE, VOL. 25(12), 1315–1330 (DECEMBER 1995). Part of the rebalancing algorithm. Adds a node to the rebalance array. If it is already balanced, add it directly, otherwise add its children. Rebalance array to insert into. Node to add. If true, mark the node as shared before adding, because one of its parents was shared. Part of the rebalancing algorithm. Adds a balanced node to the rebalance array. Rebalance array to insert into. Node to add. Convert the list to a new list by applying a delegate to each item in the collection. The resulting list contains the result of applying to each item in the list, in order. The current list is unchanged. The type each item is being converted to. A delegate to the method to call, passing each item in . The resulting BigList from applying to each item in this list. is null. Reverses the current list in place. Reverses the items in the range of items starting from , in place. The starting index of the range to reverse. The number of items in range to reverse. Sorts the list in place. The Quicksort algorithm is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. Values are compared by using the IComparable or IComparable<T> interface implementation on the type T. The type T does not implement either the IComparable or IComparable<T> interfaces. Sorts the list in place. A supplied IComparer<T> is used to compare the items in the list. The Quicksort algorithms is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. The comparer instance used to compare items in the collection. Only the Compare method is used. Sorts the list in place. A supplied Comparison<T> delegate is used to compare the items in the list. The Quicksort algorithms is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. The comparison delegate used to compare items in the collection. Searches a sorted list for an item via binary search. The list must be sorted in the order defined by the default ordering of the item type; otherwise, incorrect results will be returned. The item to search for. Returns the index of the first occurence of in the list. If the item does not occur in the list, the bitwise complement of the first item larger than in the list is returned. If no item is larger than , the bitwise complement of Count is returned. The type T does not implement either the IComparable or IComparable<T> interfaces. Searches a sorted list for an item via binary search. The list must be sorted by the ordering defined by the passed IComparer<T> interface; otherwise, incorrect results will be returned. The item to search for. The IComparer<T> interface used to sort the list. Returns the index of the first occurence of in the list. If the item does not occur in the list, the bitwise complement of the first item larger than in the list is returned. If no item is larger than , the bitwise complement of Count is returned. Searches a sorted list for an item via binary search. The list must be sorted by the ordering defined by the passed Comparison<T> delegate; otherwise, incorrect results will be returned. The item to search for. The comparison delegate used to sort the list. Returns the index of the first occurence of in the list. If the item does not occur in the list, the bitwise complement of the first item larger than in the list is returned. If no item is larger than , the bitwise complement of Count is returned. Gets the number of items stored in the BigList. The indices of the items range from 0 to Count-1. Getting the number of items in the BigList takes constant time. The number of items in the BigList. Gets or sets an item in the list, by index. Gettingor setting an item takes time O(log N), where N is the number of items in the list. To process each of the items in the list, using GetEnumerator() or a foreach loop is more efficient that accessing each of the elements by index. The index of the item to get or set. The first item in the list has index 0, the last item has index Count-1. The value of the item at the given index. is less than zero or greater than or equal to Count. The base class for the two kinds of nodes in the tree: Concat nodes and Leaf nodes. Marks this node as shared by setting the shared variable. Returns the items at the given index in this node. 0-based index, relative to this node. Item at that index. Returns a node that has a sub-range of items from this node. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive first element, relative to this node. Inclusize last element, relative to this node. Node with the given sub-range. Changes the item at the given index. Never changes this node, but always returns a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A new node with the given item changed. Changes the item at the given index. May change this node, or return a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A node with the give item changed. If it can be done in place then "this" is returned. Append a node after this node. Never changes this node, but returns a new node with the given appending done. Node to append. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A new node with the give node appended to this node. Append a node after this node. May change this node, or return a new node. Node to append. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the give node appended to this node. May be a new node or the current node. Append a item after this node. May change this node, or return a new node. Equivalent to AppendInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to append. A node with the given item appended to this node. May be a new node or the current node. Remove a range of items from this node. Never changes this node, but returns a new node with the removing done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A new node with the sub-range removed. Remove a range of items from this node. May change this node, or returns a new node with the given appending done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A node with the sub-range removed. If done in-place, returns "this". Inserts a node inside this node. Never changes this node, but returns a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A new node with the give node inserted. Inserts an item inside this node. May change this node, or return a new node with the given appending done. Equivalent to InsertInPlace(new LeafNode(item), true), but may be more efficient. Index, relative to this node, to insert at. Must be in bounds. Item to insert. A node with the give item inserted. If done in-place, returns "this". Inserts a node inside this node. May change this node, or return a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the given item inserted. If done in-place, returns "this". Prefpend a node before this node. Never changes this node, but returns a new node with the given prepending done. Node to prepend. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A new node with the give node prepended to this node. Prepend a node before this node. May change this node, or return a new node. Node to prepend. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the give node prepended to this node. May be a new node or the current node. Prepend a item before this node. May change this node, or return a new node. Equivalent to PrependInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to prepend. A node with the given item prepended to this node. May be a new node or the current node. Determine if this node is balanced. A node is balanced if the number of items is greater than Fibonacci(Depth+2). Balanced nodes are never rebalanced unless they go out of balance again. True if the node is balanced by this definition. Determine if this node is almost balanced. A node is almost balanced if t its depth is at most one greater than a fully balanced node with the same count. True if the node is almost balanced by this definition. The number of items stored in the node (or below it). The number of items in the node or below. Is this node shared by more that one list (or within a single) lists. If true, indicates that this node, and any nodes below it, may never be modified. Never becomes false after being set to true. Gets the depth of this node. A leaf node has depth 0, a concat node with two leaf children has depth 1, etc. The depth of this node. The LeafNode class is the type of node that lives at the leaf of a tree and holds the actual items stored in the list. Each leaf holds at least 1, and at most MAXLEAF items in the items array. The number of items stored is found in "count", which may be less than "items.Length". Array that stores the items in the nodes. Always has a least "count" elements, but may have more as padding. Creates a LeafNode that holds a single item. Item to place into the leaf node. Creates a new leaf node with the indicates count of item and the Number of items. Can't be zero. The array of items. The LeafNode takes possession of this array. Returns the items at the given index in this node. 0-based index, relative to this node. Item at that index. Changes the item at the given index. May change this node, or return a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A node with the give item changed. If it can be done in place then "this" is returned. Changes the item at the given index. Never changes this node, but always returns a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A new node with the given item changed. If other is a leaf node, and the resulting size would be less than MAXLEAF, merge the other leaf node into this one (after this one) and return true. Other node to possible merge. If could be merged into this node, returns true. Otherwise returns false and the current node is unchanged. If other is a leaf node, and the resulting size would be less than MAXLEAF, merge the other leaf node with this one (after this one) and return a new node with the merged items. Does not modify this. If no merging, return null. Other node to possible merge. If the nodes could be merged, returns the new node. Otherwise returns null. Prepend a item before this node. May change this node, or return a new node. Equivalent to PrependInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to prepend. A node with the given item prepended to this node. May be a new node or the current node. Append a item after this node. May change this node, or return a new node. Equivalent to AppendInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to append. A node with the given item appended to this node. May be a new node or the current node. Append a node after this node. May change this node, or return a new node. Node to append. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the give node appended to this node. May be a new node or the current node. Inserts an item inside this node. May change this node, or return a new node with the given appending done. Equivalent to InsertInPlace(new LeafNode(item), true), but may be more efficient. Index, relative to this node, to insert at. Must be in bounds. Item to insert. A node with the give item inserted. If done in-place, returns "this". Inserts a node inside this node. May change this node, or return a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the given item inserted. If done in-place, returns "this". Inserts a node inside this node. Never changes this node, but returns a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A new node with the give node inserted. Remove a range of items from this node. May change this node, or returns a new node with the given appending done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A node with the sub-range removed. If done in-place, returns "this". Remove a range of items from this node. Never changes this node, but returns a new node with the removing done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A new node with the sub-range removed. Returns a node that has a sub-range of items from this node. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive first element, relative to this node. Inclusize last element, relative to this node. Node with the given sub-range. A ConcatNode is an interior (non-leaf) node that represents the concatination of the left and right child nodes. Both children must always be non-null. The left and right child nodes. They are never null. The left and right child nodes. They are never null. The depth of this node -- the maximum length path to a leaf. If this node has two children that are leaves, the depth in 1. Create a new ConcatNode with the given children. The left child. May not be null. The right child. May not be null. Create a new node with the given children. Mark unchanged children as shared. There are four possible cases: 1. If one of the new children is null, the other new child is returned. 2. If neither child has changed, then this is marked as shared as returned. 3. If one child has changed, the other child is marked shared an a new node is returned. 4. If both children have changed, a new node is returned. New left child. New right child. New node with the given children. Returns null if and only if both new children are null. Updates a node with the given new children. If one of the new children is null, the other is returned. If both are null, null is returned. New left child. New right child. Node with the given children. Usually, but not always, this. Returns null if and only if both new children are null. Returns the items at the given index in this node. 0-based index, relative to this node. Item at that index. Changes the item at the given index. May change this node, or return a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A node with the give item changed. If it can be done in place then "this" is returned. Changes the item at the given index. Never changes this node, but always returns a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A new node with the given item changed. Prepend a item before this node. May change this node, or return a new node. Equivalent to PrependInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to prepend. A node with the given item prepended to this node. May be a new node or the current node. Append a item after this node. May change this node, or return a new node. Equivalent to AppendInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to append. A node with the given item appended to this node. May be a new node or the current node. Append a node after this node. May change this node, or return a new node. Node to append. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the give node appended to this node. May be a new node or the current node. Inserts an item inside this node. May change this node, or return a new node with the given appending done. Equivalent to InsertInPlace(new LeafNode(item), true), but may be more efficient. Index, relative to this node, to insert at. Must be in bounds. Item to insert. A node with the give item inserted. If done in-place, returns "this". Inserts a node inside this node. May change this node, or return a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the given item inserted. If done in-place, returns "this". Inserts a node inside this node. Never changes this node, but returns a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A new node with the give node inserted. Remove a range of items from this node. May change this node, or returns a new node with the given appending done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A node with the sub-range removed. If done in-place, returns "this". Remove a range of items from this node. Never changes this node, but returns a new node with the removing done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A new node with the sub-range removed. Returns a node that has a sub-range of items from this node. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive first element, relative to this node. Inclusize last element, relative to this node. Node with the given sub-range. The depth of this node -- the maximum length path to a leaf. If this node has two children that are leaves, the depth in 1. The depth of this node. The class that is used to implement IList<T> to view a sub-range of a BigList. The object stores a wrapped list, and a start/count indicating a sub-range of the list. Insertion/deletions through the sub-range view cause the count to change also; insertions and deletions directly on the wrapped list do not. This is different from Algorithms.Range in a very few respects: it is specialized to only wrap BigList, and it is a lot more efficient in enumeration. Create a sub-range view object on the indicate part of the list. List to wrap. The start index of the view in the wrapped list. The number of items in the view. OrderedSet<T> is a collection that contains items of type T. The item are maintained in a sorted order, and duplicate items are not allowed. Each item has an index in the set: the smallest item has index 0, the next smallest item has index 1, and so forth.

The items are compared in one of three ways. If T implements IComparable<TKey> or IComparable, then the CompareTo method of that interface will be used to compare items. Alternatively, a comparison function can be passed in either as a delegate, or as an instance of IComparer<TKey>.

OrderedSet is implemented as a balanced binary tree. Inserting, deleting, and looking up an an element all are done in log(N) type, where N is the number of keys in the tree.

is similar, but uses hashing instead of comparison, and does not maintain the items in sorted order.

Creates a new OrderedSet. The T must implement IComparable<T> or IComparable. The CompareTo method of this interface will be used to compare items in this set. Items that are null are permitted, and will be sorted before all other items. T does not implement IComparable<TKey>. Creates a new OrderedSet. The passed delegate will be used to compare items in this set. A delegate to a method that will be used to compare items. Creates a new OrderedSet. The Compare method of the passed comparison object will be used to compare items in this set. The GetHashCode and Equals methods of the provided IComparer<T> will never be called, and need not be implemented. An instance of IComparer<T> that will be used to compare items. Creates a new OrderedSet. The T must implement IComparable<T> or IComparable. The CompareTo method of this interface will be used to compare items in this set. The set is initialized with all the items in the given collection. Items that are null are permitted, and will be sorted before all other items. A collection with items to be placed into the OrderedSet. T does not implement IComparable<TKey>. Creates a new OrderedSet. The passed delegate will be used to compare items in this set. The set is initialized with all the items in the given collection. A collection with items to be placed into the OrderedSet. A delegate to a method that will be used to compare items. Creates a new OrderedSet. The Compare method of the passed comparison object will be used to compare items in this set. The set is initialized with all the items in the given collection. The GetHashCode and Equals methods of the provided IComparer<T> will never be called, and need not be implemented. A collection with items to be placed into the OrderedSet. An instance of IComparer<T> that will be used to compare items. Creates a new OrderedSet given a comparer and a tree that contains the data. Used internally for Clone. Comparer for the set. Data for the set. Makes a shallow clone of this set; i.e., if items of the set are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the set takes time O(N), where N is the number of items in the set. The cloned set. Makes a shallow clone of this set; i.e., if items of the set are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the set takes time O(N), where N is the number of items in the set. The cloned set. Makes a deep clone of this set. A new set is created with a clone of each element of this set, by calling ICloneable.Clone on each element. If T is a value type, then each element is copied as if by simple assignment. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the set takes time O(N log N), where N is the number of items in the set. The cloned set. T is a reference type that does not implement ICloneable. Returns an enumerator that enumerates all the items in the set. The items are enumerated in sorted order.

Typically, this method is not called directly. Instead the "foreach" statement is used to enumerate the items, which uses this method implicitly.

If an item is added to or deleted from the set while it is being enumerated, then the enumeration will end with an InvalidOperationException.

Enumeration all the items in the set takes time O(N log N), where N is the number of items in the set.

An enumerator for enumerating all the items in the OrderedSet.
Determines if this set contains an item equal to . The set is not changed. Searching the set for an item takes time O(log N), where N is the number of items in the set. The item to search for. True if the set contains . False if the set does not contain . Determines if this set contains an item equal to , according to the comparison mechanism that was used when the set was created. The set is not changed. If the set does contain an item equal to , then the item from the set is returned. Searching the set for an item takes time O(log N), where N is the number of items in the set. In the following example, the set contains strings which are compared in a case-insensitive manner. OrderedSet<string> set = new OrderedSet<string>(StringComparer.CurrentCultureIgnoreCase); set.Add("HELLO"); string s; bool b = set.TryGetItem("Hello", out s); // b receives true, s receives "HELLO". The item to search for. Returns the item from the set that was equal to . True if the set contains . False if the set does not contain . Get the index of the given item in the sorted order. The smallest item has index 0, the next smallest item has index 1, and the largest item has index Count-1. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the item in the sorted set, or -1 if the item is not present in the set. Adds a new item to the set. If the set already contains an item equal to , that item is replaced with . Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes time O(log N), where N is the number of items in the set. The item to add to the set. True if the set already contained an item equal to (which was replaced), false otherwise. Adds a new item to the set. If the set already contains an item equal to , that item is replaces with . Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes time O(log N), where N is the number of items in the set. The item to add to the set. Adds all the items in to the set. If the set already contains an item equal to one of the items in , that item will be replaced. Equality between items is determined by the comparison instance or delegate used to create the set. Adding the collection takes time O(M log N), where N is the number of items in the set, and M is the number of items in . A collection of items to add to the set. Searches the set for an item equal to , and if found, removes it from the set. If not found, the set is unchanged. Equality between items is determined by the comparison instance or delegate used to create the set. Removing an item from the set takes time O(log N), where N is the number of items in the set. The item to remove. True if was found and removed. False if was not in the set. Removes all the items in from the set. Items not present in the set are ignored. Equality between items is determined by the comparison instance or delegate used to create the set. Removing the collection takes time O(M log N), where N is the number of items in the set, and M is the number of items in . A collection of items to remove from the set. The number of items removed from the set. is null. Removes all items from the set. Clearing the sets takes a constant amount of time, regardless of the number of items in it. If the collection is empty, throw an invalid operation exception. The set is empty. Returns the first item in the set: the item that would appear first if the set was enumerated. This is also the smallest item in the set. GetFirst() takes time O(log N), where N is the number of items in the set. The first item in the set. The set is empty. Returns the lastl item in the set: the item that would appear last if the set was enumerated. This is also the largest item in the set. GetLast() takes time O(log N), where N is the number of items in the set. The lastl item in the set. The set is empty. Removes the first item in the set. This is also the smallest item in the set. RemoveFirst() takes time O(log N), where N is the number of items in the set. The item that was removed, which was the smallest item in the set. The set is empty. Removes the last item in the set. This is also the largest item in the set. RemoveLast() takes time O(log N), where N is the number of items in the set. The item that was removed, which was the largest item in the set. The set is empty. Check that this set and another set were created with the same comparison mechanism. Throws exception if not compatible. Other set to check comparision mechanism. If otherSet and this set don't use the same method for comparing items. Determines if this set is a superset of another set. Neither set is modified. This set is a superset of if every element in is also in this set. IsSupersetOf is computed in time O(M log N), where M is the size of the , and N is the size of the this set. OrderedSet to compare to. True if this is a superset of . This set and don't use the same method for comparing items. Determines if this set is a proper superset of another set. Neither set is modified. This set is a proper superset of if every element in is also in this set. Additionally, this set must have strictly more items than . IsProperSupersetOf is computed in time O(M log N), where M is the number of unique items in . OrderedSet to compare to. True if this is a proper superset of . This set and don't use the same method for comparing items. Determines if this set is a subset of another set. Neither set is modified. This set is a subset of if every element in this set is also in . IsSubsetOf is computed in time O(N log M), where M is the size of the , and N is the size of the this set. Set to compare to. True if this is a subset of . This set and don't use the same method for comparing items. Determines if this set is a proper subset of another set. Neither set is modified. This set is a subset of if every element in this set is also in . Additionally, this set must have strictly fewer items than . IsSubsetOf is computed in time O(N log M), where M is the size of the , and N is the size of the this set. Set to compare to. True if this is a proper subset of . This set and don't use the same method for comparing items. Determines if this set is equal to another set. This set is equal to if they contain the same items. IsEqualTo is computed in time O(N), where N is the number of items in this set. Set to compare to True if this set is equal to , false otherwise. This set and don't use the same method for comparing items. Computes the union of this set with another set. The union of two sets is all items that appear in either or both of the sets. This set receives the union of the two sets, the other set is unchanged. If equal items appear in both sets, the union will include an arbitrary choice of one of the two equal items. The union of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to union with. This set and don't use the same method for comparing items. Determines if this set is disjoint from another set. Two sets are disjoint if no item from one set is equal to any item in the other set. The answer is computed in time O(N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to check disjointness with. True if the two sets are disjoint, false otherwise. This set and don't use the same method for comparing items. Computes the union of this set with another set. The union of two sets is all items that appear in either or both of the sets. A new set is created with the union of the sets and is returned. This set and the other set are unchanged. If equal items appear in both sets, the union will include an arbitrary choice of one of the two equal items. The union of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to union with. The union of the two sets. This set and don't use the same method for comparing items. Computes the intersection of this set with another set. The intersection of two sets is all items that appear in both of the sets. This set receives the intersection of the two sets, the other set is unchanged. When equal items appear in both sets, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two sets is computed in time O(N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to intersection with. This set and don't use the same method for comparing items. Computes the intersection of this set with another set. The intersection of two sets is all items that appear in both of the sets. A new set is created with the intersection of the sets and is returned. This set and the other set are unchanged. When equal items appear in both sets, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two sets is computed in time O(N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to intersection with. The intersection of the two sets. This set and don't use the same method for comparing items. Computes the difference of this set with another set. The difference of these two sets is all items that appear in this set, but not in . This set receives the difference of the two sets; the other set is unchanged. The difference of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to difference with. This set and don't use the same method for comparing items. Computes the difference of this set with another set. The difference of these two sets is all items that appear in this set, but not in . A new set is created with the difference of the sets and is returned. This set and the other set are unchanged. The difference of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to difference with. The difference of the two sets. This set and don't use the same method for comparing items. Computes the symmetric difference of this set with another set. The symmetric difference of two sets is all items that appear in either of the sets, but not both. This set receives the symmetric difference of the two sets; the other set is unchanged. The symmetric difference of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to symmetric difference with. This set and don't use the same method for comparing items. Computes the symmetric difference of this set with another set. The symmetric difference of two sets is all items that appear in either of the sets, but not both. A new set is created with the symmetric difference of the sets and is returned. This set and the other set are unchanged. The symmetric difference of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to symmetric difference with. The symmetric difference of the two sets. This set and don't use the same method for comparing items. Get a read-only list view of the items in this ordered set. The items in the list are in sorted order, with the smallest item at index 0. This view does not copy any data, and reflects any changes to the underlying OrderedSet. A read-only IList<T> view onto this OrderedSet. Returns a View collection that can be used for enumerating the items in the set in reversed order.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in set.Reversed()) { // process item }

If an item is added to or deleted from the set while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Reverse does not copy the data in the tree, and the operation takes constant time.

An OrderedSet.View of items in reverse order.
Returns a View collection that can be used for enumerating a range of the items in the set.. Only items that are greater than and less than are included. The items are enumerated in sorted order. Items equal to the end points of the range can be included or excluded depending on the and parameters.

If is greater than , the returned collection is empty.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in set.Range(from, true, to, false)) { // process item }

If an item is added to or deleted from the set while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Range does not copy the data in the tree, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--items equal to the lower bound will be included in the range. If false, the lower bound is exclusive--items equal to the lower bound will not be included in the range. The upper bound of the range. If true, the upper bound is inclusive--items equal to the upper bound will be included in the range. If false, the upper bound is exclusive--items equal to the upper bound will not be included in the range. An OrderedSet.View of items in the given range.
Returns a View collection that can be used for enumerating a range of the items in the set.. Only items that are greater than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in set.RangeFrom(from, true)) { // process item }

If an item is added to or deleted from the set while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling RangeFrom does not copy the data in the tree, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--items equal to the lower bound will be included in the range. If false, the lower bound is exclusive--items equal to the lower bound will not be included in the range. An OrderedSet.View of items in the given range.
Returns a View collection that can be used for enumerating a range of the items in the set.. Only items that are less than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in set.RangeTo(to, false)) { // process item }

If an item is added to or deleted from the set while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling RangeTo does not copy the data in the tree, and the operation takes constant time.

The upper bound of the range. If true, the upper bound is inclusive--items equal to the upper bound will be included in the range. If false, the upper bound is exclusive--items equal to the upper bound will not be included in the range. An OrderedSet.View of items in the given range.
Returns the IComparer<T> used to compare items in this set. If the set was created using a comparer, that comparer is returned. If the set was created using a comparison delegate, then a comparer equivalent to that delegate is returned. Otherwise the default comparer for T (Comparer<T>.Default) is returned. Returns the number of items in the set. The size of the set is returned in constant time. The number of items in the set. Get the item by its index in the sorted order. The smallest item has index 0, the next smallest item has index 1, and the largest item has index Count-1. The indexer takes time O(log N), which N is the number of items in the set. The index to get the item by. The item at the given index. is less than zero or greater than or equal to Count. The nested class that provides a read-only list view of all or part of the collection. Create a new list view wrapped the given set. Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Used to optimize some operations. Is the view enuemerated in reverse order? The OrderedSet<T>.View class is used to look at a subset of the Items inside an ordered set. It is returned from the Range, RangeTo, RangeFrom, and Reversed methods.

Views are dynamic. If the underlying set changes, the view changes in sync. If a change is made to the view, the underlying set changes accordingly.

Typically, this class is used in conjunction with a foreach statement to enumerate the items in a subset of the OrderedSet. For example:

foreach(T item in set.Range(from, to)) { // process item }
Initialize the view. OrderedSet being viewed Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Used to optimize some operations. Is the view enuemerated in reverse order? Determine if the given item lies within the bounds of this view. Item to test. True if the item is within the bounds of this view. Enumerate all the items in this view. An IEnumerator<T> with the items in this view. Removes all the items within this view from the underlying set. The following removes all the items that start with "A" from an OrderedSet. set.Range("A", "B").Clear(); Adds a new item to the set underlying this View. If the set already contains an item equal to , that item is replaces with . If is outside the range of this view, an InvalidOperationException is thrown. Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes time O(log N), where N is the number of items in the set. The item to add. True if the set already contained an item equal to (which was replaced), false otherwise. Adds a new item to the set underlying this View. If the set already contains an item equal to , that item is replaces with . If is outside the range of this view, an InvalidOperationException is thrown. Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes time O(log N), where N is the number of items in the set. The item to add. Searches the underlying set for an item equal to , and if found, removes it from the set. If not found, the set is unchanged. If the item is outside the range of this view, the set is unchanged. Equality between items is determined by the comparison instance or delegate used to create the set. Removing an item from the set takes time O(log N), where N is the number of items in the set. The item to remove. True if was found and removed. False if was not in the set, or was outside the range of this view. Determines if this view of the set contains an item equal to . The set is not changed. If Searching the set for an item takes time O(log N), where N is the number of items in the set. The item to search for. True if the set contains , and is within the range of this view. False otherwise. Get the index of the given item in the view. The smallest item in the view has index 0, the next smallest item has index 1, and the largest item has index Count-1. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the item in the view, or -1 if the item is not present in the view. Get a read-only list view of the items in this view. The items in the list are in sorted order, with the smallest item at index 0. This view does not copy any data, and reflects any changes to the underlying OrderedSet. A read-only IList<T> view onto this view. Creates a new View that has the same items as this view, in the reversed order. A new View that has the reversed order of this view, with the same upper and lower bounds. Returns the first item in this view: the item that would appear first if the view was enumerated. GetFirst() takes time O(log N), where N is the number of items in the set. The first item in the view. The view has no items in it. Returns the last item in the view: the item that would appear last if the view was enumerated. GetLast() takes time O(log N), where N is the number of items in the set. The last item in the view. The view has no items in it. Number of items in this view. Number of items that lie within the bounds the view. Get the item by its index in the sorted order. The smallest item in the view has index 0, the next smallest item has index 1, and the largest item has index Count-1. The indexer takes time O(log N), which N is the number of items in the set. The index to get the item by. The item at the given index. is less than zero or greater than or equal to Count. The Deque class implements a type of list known as a Double Ended Queue. A Deque is quite similar to a List, in that items have indices (starting at 0), and the item at any index can be efficiently retrieved. The difference between a List and a Deque lies in the efficiency of inserting elements at the beginning. In a List, items can be efficiently added to the end, but inserting an item at the beginning of the List is slow, taking time proportional to the size of the List. In a Deque, items can be added to the beginning or end equally efficiently, regardless of the number of items in the Deque. As a trade-off for this increased flexibility, Deque is somewhat slower than List (but still constant time) when being indexed to get or retrieve elements. The Deque class can also be used as a more flexible alternative to the Queue and Stack classes. Deque is as efficient as Queue and Stack for adding or removing items, but is more flexible: it allows access to all items in the queue, and allows adding or removing from either end. Deque is implemented as a ring buffer, which is grown as necessary. The size of the buffer is doubled whenever the existing capacity is too small to hold all the elements. The type of items stored in the Deque. Must be called whenever there is a structural change in the tree. Causes changeStamp to be changed, which causes any in-progress enumerations to throw exceptions. Checks the given stamp against the current change stamp. If different, the collection has changed during enumeration and an InvalidOperationException must be thrown changeStamp at the start of the enumeration. Create a new Deque that is initially empty. Create a new Deque initialized with the items from the passed collection, in order. A collection of items to initialize the Deque with. Copies all the items in the Deque into an array. Array to copy to. Starting index in to copy to. Trims the amount of memory used by the Deque by changing the Capacity to be equal to Count. If no more items will be added to the Deque, calling TrimToSize will reduce the amount of memory used by the Deque. Removes all items from the Deque. Clearing the Deque takes a small constant amount of time, regardless of how many items are currently in the Deque. Enumerates all of the items in the list, in order. The item at index 0 is enumerated first, then the item at index 1, and so on. If the items are added to or removed from the Deque during enumeration, the enumeration ends with an InvalidOperationException. An IEnumerator<T> that enumerates all the items in the list. The Deque has an item added or deleted during the enumeration. Creates the initial buffer and initialized the Deque to contain one initial item. First and only item for the Deque. Inserts a new item at the given index in the Deque. All items at indexes equal to or greater than move up one index in the Deque. The amount of time to insert an item in the Deque is proportional to the distance of index from the closest end of the Deque: O(Min(, Count - )). Thus, inserting an item at the front or end of the Deque is always fast; the middle of of the Deque is the slowest place to insert. The index in the Deque to insert the item at. After the insertion, the inserted item is located at this index. The front item in the Deque has index 0. The item to insert at the given index. is less than zero or greater than Count. Inserts a collection of items at the given index in the Deque. All items at indexes equal to or greater than increase their indices in the Deque by the number of items inserted. The amount of time to insert a collection in the Deque is proportional to the distance of index from the closest end of the Deque, plus the number of items inserted (M): O(M + Min(, Count - )). The index in the Deque to insert the collection at. After the insertion, the first item of the inserted collection is located at this index. The front item in the Deque has index 0. The collection of items to insert at the given index. is less than zero or greater than Count. Removes the item at the given index in the Deque. All items at indexes greater than move down one index in the Deque. The amount of time to delete an item in the Deque is proportional to the distance of index from the closest end of the Deque: O(Min(, Count - 1 - )). Thus, deleting an item at the front or end of the Deque is always fast; the middle of of the Deque is the slowest place to delete. The index in the list to remove the item at. The first item in the list has index 0. is less than zero or greater than or equal to Count. Removes a range of items at the given index in the Deque. All items at indexes greater than move down indices in the Deque. The amount of time to delete items in the Deque is proportional to the distance to the closest end of the Deque: O(Min(, Count - - )). The index in the list to remove the range at. The first item in the list has index 0. The number of items to remove. is less than zero or greater than or equal to Count, or is less than zero or too large. Increase the amount of buffer space. When calling this method, the Deque must not be empty. If start and end are equal, that indicates a completely full Deque. Adds an item to the front of the Deque. The indices of all existing items in the Deque are increased by 1. This method is equivalent to Insert(0, item) but is a little more efficient. Adding an item to the front of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item to add. Adds a collection of items to the front of the Deque. The indices of all existing items in the Deque are increased by the number of items inserted. The first item in the added collection becomes the first item in the Deque. This method takes time O(M), where M is the number of items in the . The collection of items to add. Adds an item to the back of the Deque. The indices of all existing items in the Deque are unchanged. This method is equivalent to Insert(Count, item) but is a little more efficient. Adding an item to the back of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item to add. Adds an item to the back of the Deque. The indices of all existing items in the Deque are unchanged. This method is equivalent to AddToBack(item). Adding an item to the back of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item to add. Adds a collection of items to the back of the Deque. The indices of all existing items in the Deque are unchanged. The last item in the added collection becomes the last item in the Deque. This method takes time O(M), where M is the number of items in the . The collection of item to add. Removes an item from the front of the Deque. The indices of all existing items in the Deque are decreased by 1. This method is equivalent to RemoveAt(0) but is a little more efficient. Removing an item from the front of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item that was removed. The Deque is empty. Removes an item from the back of the Deque. The indices of all existing items in the Deque are unchanged. This method is equivalent to RemoveAt(Count-1) but is a little more efficient. Removing an item from the back of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The Deque is empty. Retreives the item currently at the front of the Deque. The Deque is unchanged. This method is equivalent to deque[0] (except that a different exception is thrown). Retreiving the item at the front of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item at the front of the Deque. The Deque is empty. Retreives the item currently at the back of the Deque. The Deque is unchanged. This method is equivalent to deque[deque.Count - 1] (except that a different exception is thrown). Retreiving the item at the back of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item at the back of the Deque. The Deque is empty. Creates a new Deque that is a copy of this one. Copying a Deque takes O(N) time, where N is the number of items in this Deque.. A copy of the current deque. Creates a new Deque that is a copy of this one. Copying a Deque takes O(N) time, where N is the number of items in this Deque.. A copy of the current deque. Makes a deep clone of this Deque. A new Deque is created with a clone of each element of this set, by calling ICloneable.Clone on each element. If T is a value type, then each element is copied as if by simple assignment. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the Deque takes time O(N), where N is the number of items in the Deque. The cloned Deque. T is a reference type that does not implement ICloneable. Gets the number of items currently stored in the Deque. The last item in the Deque has index Count-1. Getting the count of items in the Deque takes a small constant amount of time. The number of items stored in this Deque. Gets or sets the capacity of the Deque. The Capacity is the number of items that this Deque can hold without expanding its internal buffer. Since Deque will automatically expand its buffer when necessary, in almost all cases it is unnecessary to worry about the capacity. However, if it is known that a Deque will contain exactly 1000 items eventually, it can slightly improve efficiency to set the capacity to 1000 up front, so that the Deque does not have to expand automatically. The number of items that this Deque can hold without expanding its internal buffer. The capacity is being set to less than Count, or to too large a value. Gets or sets an item at a particular index in the Deque. Getting or setting the item at a particular index takes a small constant amount of time, no matter what index is used. The index of the item to retrieve or change. The front item has index 0, and the back item has index Count-1. The value at the indicated index. The index is less than zero or greater than or equal to Count. Describes what to do if a key is already in the tree when doing an insertion. The base implementation for various collections classes that use Red-Black trees as part of their implementation. This class should not (and can not) be used directly by end users; it's only for internal use by the collections package. The Red-Black tree manages items of type T, and uses a IComparer<T> that compares items to sort the tree. Multiple items can compare equal and be stored in the tree. Insert, Delete, and Find operations are provided in their full generality; all operations allow dealing with either the first or last of items that compare equal. Create an array of Nodes big enough for any path from top to bottom. This is cached, and reused from call-to-call, so only one can be around at a time per tree. The node stack. Must be called whenever there is a structural change in the tree. Causes changeStamp to be changed, which causes any in-progress enumerations to throw exceptions. Checks the given stamp against the current change stamp. If different, the collection has changed during enumeration and an InvalidOperationException must be thrown changeStamp at the start of the enumeration. Initialize a red-black tree, using the given interface instance to compare elements. Only Compare is used on the IComparer interface. The IComparer<T> used to sort keys. Clone the tree, returning a new tree containing the same items. Should take O(N) take. Clone version of this tree. Finds the key in the tree. If multiple items in the tree have compare equal to the key, finds the first or last one. Optionally replaces the item with the one searched for. Key to search for. If true, find the first of duplicates, else finds the last of duplicates. If true, replaces the item with key (if function returns true) Returns the found item, before replacing (if function returns true). True if the key was found. Finds the index of the key in the tree. If multiple items in the tree have compare equal to the key, finds the first or last one. Key to search for. If true, find the first of duplicates, else finds the last of duplicates. Index of the item found if the key was found, -1 if not found. Find the item at a particular index in the tree. The zero-based index of the item. Must be >= 0 and < Count. The item at the particular index. Insert a new node into the tree, maintaining the red-black invariants. Algorithm from Sedgewick, "Algorithms". The new item to insert What to do if equal item is already present. If false, returned, the previous item. false if duplicate exists, otherwise true. Split a node with two red children (a 4-node in the 2-3-4 tree formalism), as part of an insert operation. great grand-parent of "node", can be null near root grand-parent of "node", can be null near root parent of "node", can be null near root Node to split, can't be null Indicates that rotation(s) occurred in the tree. Node to continue searching from. Performs a rotation involving the node, it's child and grandchild. The counts of childs and grand-child are set the correct values from their children; this is important if they have been adjusted on the way down the try as part of an insert/delete. Top node of the rotation. Can be null if child==root. One child of "node". Not null. One child of "child". Not null. Deletes a key from the tree. If multiple elements are equal to key, deletes the first or last. If no element is equal to the key, returns false. Top-down algorithm from Weiss. Basic plan is to move down in the tree, rotating and recoloring along the way to always keep the current node red, which ensures that the node we delete is red. The details are quite complex, however! Key to delete. Which item to delete if multiple are equal to key. True to delete the first, false to delete last. Returns the item that was deleted, if true returned. True if an element was deleted, false if no element had specified key. Enumerate all the items in-order An enumerator for all the items, in order. The tree has an item added or deleted during the enumeration. Enumerate all the items in-order An enumerator for all the items, in order. The tree has an item added or deleted during the enumeration. Gets a range tester that defines a range by first and last items. If true, bound the range on the bottom by first. If useFirst is true, the inclusive lower bound. If true, bound the range on the top by last. If useLast is true, the exclusive upper bound. A RangeTester delegate that tests for an item in the given range. Gets a range tester that defines a range by first and last items. The lower bound. True if the lower bound is inclusive, false if exclusive. The upper bound. True if the upper bound is inclusive, false if exclusive. A RangeTester delegate that tests for an item in the given range. Gets a range tester that defines a range by a lower bound. The lower bound. True if the lower bound is inclusive, false if exclusive. A RangeTester delegate that tests for an item in the given range. Gets a range tester that defines a range by upper bound. The upper bound. True if the upper bound is inclusive, false if exclusive. A RangeTester delegate that tests for an item in the given range. Gets a range tester that defines a range by all items equal to an item. The item that is contained in the range. A RangeTester delegate that tests for an item equal to . A range tester that defines a range that is the entire tree. Item to test. Always returns 0. Enumerate the items in a custom range in the tree. The range is determined by a RangeTest delegate. Tests an item against the custom range. An IEnumerable<T> that enumerates the custom range in order. The tree has an item added or deleted during the enumeration. Enumerate all the items in a custom range, under and including node, in-order. Tests an item against the custom range. Node to begin enumeration. May be null. An enumerable of the items. The tree has an item added or deleted during the enumeration. Enumerate the items in a custom range in the tree, in reversed order. The range is determined by a RangeTest delegate. Tests an item against the custom range. An IEnumerable<T> that enumerates the custom range in reversed order. The tree has an item added or deleted during the enumeration. Enumerate all the items in a custom range, under and including node, in reversed order. Tests an item against the custom range. Node to begin enumeration. May be null. An enumerable of the items, in reversed oreder. The tree has an item added or deleted during the enumeration. Deletes either the first or last item from a range, as identified by a RangeTester delegate. If the range is empty, returns false. Top-down algorithm from Weiss. Basic plan is to move down in the tree, rotating and recoloring along the way to always keep the current node red, which ensures that the node we delete is red. The details are quite complex, however! Range to delete from. If true, delete the first item from the range, else the last. Returns the item that was deleted, if true returned. True if an element was deleted, false if the range is empty. Delete all the items in a range, identified by a RangeTester delegate. The delegate that defines the range to delete. The number of items deleted. Count the items in a custom range in the tree. The range is determined by a RangeTester delegate. The delegate that defines the range. The number of items in the range. Count all the items in a custom range, under and including node. The delegate that defines the range. Node to begin enumeration. May be null. This node and all under it are either in the range or below it. This node and all under it are either in the range or above it. The number of items in the range, under and include node. Find the first item in a custom range in the tree, and it's index. The range is determined by a RangeTester delegate. The delegate that defines the range. Returns the item found, if true was returned. Index of first item in range if range is non-empty, -1 otherwise. Find the last item in a custom range in the tree, and it's index. The range is determined by a RangeTester delegate. The delegate that defines the range. Returns the item found, if true was returned. Index of the item if range is non-empty, -1 otherwise. Returns the number of elements in the tree. The class that is each node in the red-black tree. Add one to the Count. Subtract one from the Count. The current Count must be non-zero. Clones a node and all its descendants. The cloned node. Is this a red node? Get or set the Count field -- a 31-bit field that holds the number of nodes at or below this level. A delegate that tests if an item is within a custom range. The range must be a contiguous range of items with the ordering of this tree. The range test function must test if an item is before, withing, or after the range. Item to test against the range. Returns negative if item is before the range, zero if item is withing the range, and positive if item is after the range. Bag<T> is a collection that contains items of type T. Unlike a Set, duplicate items (items that compare equal to each other) are allowed in an Bag.

The items are compared in one of two ways. If T implements IComparable<T> then the Equals method of that interface will be used to compare items, otherwise the Equals method from Object will be used. Alternatively, an instance of IComparer<T> can be passed to the constructor to use to compare items.

Bag is implemented as a hash table. Inserting, deleting, and looking up an an element all are done in approximately constant time, regardless of the number of items in the bag.

When multiple equal items are stored in the bag, they are stored as a representative item and a count. If equal items can be distinguished, this may be noticable. For example, if a case-insensitive comparer is used with a Bag<string>, and both "hello", and "HELLO" are added to the bag, then the bag will appear to contain two copies of "hello" (the representative item).

is similar, but uses comparison instead of hashing, maintain the items in sorted order, and stores distinct copies of items that compare equal.

Helper function to create a new KeyValuePair struct with an item and a count. The item. The number of appearances. A new KeyValuePair. Helper function to create a new KeyValuePair struct with a count of zero. The item. A new KeyValuePair. Creates a new Bag. Items that are null are permitted. Creates a new Bag. The Equals and GetHashCode methods of the passed comparison object will be used to compare items in this bag for equality. An instance of IEqualityComparer<T> that will be used to compare items. Creates a new Bag. The bag is initialized with all the items in the given collection. Items that are null are permitted. A collection with items to be placed into the Bag. Creates a new Bag. The Equals and GetHashCode methods of the passed comparison object will be used to compare items in this bag. The bag is initialized with all the items in the given collection. A collection with items to be placed into the Bag. An instance of IEqualityComparer<T> that will be used to compare items. Creates a new Bag given a comparer and a hash that contains the data. Used internally for Clone. IEqualityComparer for the bag. IEqualityComparer for the key. Data for the bag. Size of the bag. Makes a shallow clone of this bag; i.e., if items of the bag are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the bag takes time O(N), where N is the number of items in the bag. The cloned bag. Makes a shallow clone of this bag; i.e., if items of the bag are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the bag takes time O(N), where N is the number of unquie items in the bag. The cloned bag. Makes a deep clone of this bag. A new bag is created with a clone of each element of this bag, by calling ICloneable.Clone on each element. If T is a value type, then each element is copied as if by simple assignment. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the bag takes time O(N log N), where N is the number of items in the bag. The cloned bag. T is a reference type that does not implement ICloneable. Returns the number of copies of in the bag. NumberOfCopies() takes approximately constant time, no matter how many items are stored in the bag. The item to search for in the bag. The number of items in the bag that compare equal to . Returns the representative item stored in the bag that is equal to the provided item. Also returns the number of copies of the item in the bag. Item to find in the bag. If one or more items equal to are present in the bag, returns the representative item. If no items equal to are stored in the bag, returns . The number of items equal to stored in the bag. Returns an enumerator that enumerates all the items in the bag. If an item is present multiple times in the bag, the representative item is yielded by the enumerator multiple times. The order of enumeration is haphazard and may change.

Typically, this method is not called directly. Instead the "foreach" statement is used to enumerate the items, which uses this method implicitly.

If an item is added to or deleted from the bag while it is being enumerated, then the enumeration will end with an InvalidOperationException.

Enumeration all the items in the bag takes time O(N), where N is the number of items in the bag.

An enumerator for enumerating all the items in the Bag.
Determines if this bag contains an item equal to . The bag is not changed. Searching the bag for an item takes time O(log N), where N is the number of items in the bag. The item to search for. True if the bag contains . False if the bag does not contain . Enumerates all the items in the bag, but enumerates equal items just once, even if they occur multiple times in the bag. If the bag is changed while items are being enumerated, the enumeration will terminate with an InvalidOperationException. An IEnumerable<T> that enumerates the unique items. Adds a new item to the bag. Since bags can contain duplicate items, the item is added even if the bag already contains an item equal to . In this case, the count of items for the representative item is increased by one, but the existing represetative item is unchanged. Adding an item takes approximately constant time, regardless of the number of items in the bag. The item to add to the bag. Adds a new item to the bag. Since bags can contain duplicate items, the item is added even if the bag already contains an item equal to . In this case (unlike Add), the new item becomes the representative item. Adding an item takes approximately constant time, regardless of the number of items in the bag. The item to add to the bag. Changes the number of copies of an existing item in the bag, or adds the indicated number of copies of the item to the bag. Changing the number of copies takes approximately constant time, regardless of the number of items in the bag. The item to change the number of copies of. This may or may not already be present in the bag. The new number of copies of the item. Adds all the items in to the bag. Adding the collection takes time O(M log N), where N is the number of items in the bag, and M is the number of items in . A collection of items to add to the bag. Searches the bag for one item equal to , and if found, removes it from the bag. If not found, the bag is unchanged. Equality between items is determined by the comparison instance or delegate used to create the bag. Removing an item from the bag takes approximated constant time, regardless of the number of items in the bag. The item to remove. True if was found and removed. False if was not in the bag. Searches the bag for all items equal to , and removes all of them from the bag. If not found, the bag is unchanged. Equality between items is determined by the comparer instance used to create the bag. RemoveAllCopies() takes time O(M log N), where N is the total number of items in the bag, and M is the number of items equal to . The item to remove. The number of copies of that were found and removed. Removes all the items in from the bag. Items that are not present in the bag are ignored. Equality between items is determined by the comparer instance used to create the bag. Removing the collection takes time O(M), where M is the number of items in . A collection of items to remove from the bag. The number of items removed from the bag. is null. Removes all items from the bag. Clearing the bag takes a constant amount of time, regardless of the number of items in it. Check that this bag and another bag were created with the same comparison mechanism. Throws exception if not compatible. Other bag to check comparision mechanism. If otherBag and this bag don't use the same method for comparing items. Determines if this bag is equal to another bag. This bag is equal to if they contain the same number of of copies of equal elements. IsSupersetOf is computed in time O(N), where N is the number of unique items in this bag. Bag to compare to True if this bag is equal to , false otherwise. This bag and don't use the same method for comparing items. Determines if this bag is a superset of another bag. Neither bag is modified. This bag is a superset of if every element in is also in this bag, at least the same number of times. IsSupersetOf is computed in time O(M), where M is the number of unique items in . Bag to compare to. True if this is a superset of . This bag and don't use the same method for comparing items. Determines if this bag is a proper superset of another bag. Neither bag is modified. This bag is a proper superset of if every element in is also in this bag, at least the same number of times. Additional, this bag must have strictly more items than . IsProperSupersetOf is computed in time O(M), where M is the number of unique items in . Set to compare to. True if this is a proper superset of . This bag and don't use the same method for comparing items. Determines if this bag is a subset of another ba11 items in this bag. Bag to compare to. True if this is a subset of . This bag and don't use the same method for comparing items. Determines if this bag is a proper subset of another bag. Neither bag is modified. This bag is a subset of if every element in this bag is also in , at least the same number of times. Additional, this bag must have strictly fewer items than . IsProperSubsetOf is computed in time O(N), where N is the number of unique items in this bag. Bag to compare to. True if this is a proper subset of . This bag and don't use the same method for comparing items. Determines if this bag is disjoint from another bag. Two bags are disjoint if no item from one set is equal to any item in the other bag. The answer is computed in time O(N), where N is the size of the smaller set. Bag to check disjointness with. True if the two bags are disjoint, false otherwise. This bag and don't use the same method for comparing items. Computes the union of this bag with another bag. The union of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the union contains the item Maximum(X,Y) times. This bag receives the union of the two bags, the other bag is unchanged. The union of two bags is computed in time O(M+N), where M and N are the size of the two bags. Bag to union with. This bag and don't use the same method for comparing items. Computes the union of this bag with another bag. The union of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the union contains the item Maximum(X,Y) times. A new bag is created with the union of the bags and is returned. This bag and the other bag are unchanged. The union of two bags is computed in time O(M+N), where M and N are the size of the two bags. Bag to union with. The union of the two bags. This bag and don't use the same method for comparing items. Computes the sum of this bag with another bag. The sum of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item (X+Y) times. This bag receives the sum of the two bags, the other bag is unchanged. The sum of two bags is computed in time O(M), where M is the size of the other bag.. Bag to sum with. This bag and don't use the same method for comparing items. Computes the sum of this bag with another bag. he sum of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item (X+Y) times. A new bag is created with the sum of the bags and is returned. This bag and the other bag are unchanged. The sum of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to sum with. The sum of the two bags. This bag and don't use the same method for comparing items. Computes the intersection of this bag with another bag. The intersection of two bags is all items that appear in both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item Minimum(X,Y) times. This bag receives the intersection of the two bags, the other bag is unchanged. When equal items appear in both bags, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two bags is computed in time O(N), where N is the size of the smaller bag. Bag to intersection with. This bag and don't use the same method for comparing items. Computes the intersection of this bag with another bag. The intersection of two bags is all items that appear in both of the bags. If an item appears X times in one bag, and Y times in the other bag, the intersection contains the item Minimum(X,Y) times. A new bag is created with the intersection of the bags and is returned. This bag and the other bag are unchanged. When equal items appear in both bags, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two bags is computed in time O(N), where N is the size of the smaller bag. Bag to intersection with. The intersection of the two bags. This bag and don't use the same method for comparing items. Computes the difference of this bag with another bag. The difference of these two bags is all items that appear in this bag, but not in . If an item appears X times in this bag, and Y times in the other bag, the difference contains the item X - Y times (zero times if Y >= X). This bag receives the difference of the two bags; the other bag is unchanged. The difference of two bags is computed in time O(M), where M is the size of the other bag. Bag to difference with. This bag and don't use the same method for comparing items. Computes the difference of this bag with another bag. The difference of these two bags is all items that appear in this bag, but not in . If an item appears X times in this bag, and Y times in the other bag, the difference contains the item X - Y times (zero times if Y >= X). A new bag is created with the difference of the bags and is returned. This bag and the other bag are unchanged. The difference of two bags is computed in time O(M + N), where M and N are the size of the two bags. Bag to difference with. The difference of the two bags. This bag and don't use the same method for comparing items. Computes the symmetric difference of this bag with another bag. The symmetric difference of two bags is all items that appear in either of the bags, but not both. If an item appears X times in one bag, and Y times in the other bag, the symmetric difference contains the item AbsoluteValue(X - Y) times. This bag receives the symmetric difference of the two bags; the other bag is unchanged. The symmetric difference of two bags is computed in time O(M + N), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to symmetric difference with. This bag and don't use the same method for comparing items. Computes the symmetric difference of this bag with another bag. The symmetric difference of two bags is all items that appear in either of the bags, but not both. If an item appears X times in one bag, and Y times in the other bag, the symmetric difference contains the item AbsoluteValue(X - Y) times. A new bag is created with the symmetric difference of the bags and is returned. This bag and the other bag are unchanged. The symmetric difference of two bags is computed in time O(M + N), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to symmetric difference with. The symmetric difference of the two bags. This bag and don't use the same method for comparing items. Returns the IEqualityComparer<T> used to compare items in this bag. If the bag was created using a comparer, that comparer is returned. Otherwise the default comparer for T (EqualityComparer<T>.Default) is returned. Returns the number of items in the bag. The size of the bag is returned in constant time. The number of items in the bag. The base implementation for various collections classes that use hash tables as part of their implementation. This class should not (and can not) be used directly by end users; it's only for internal use by the collections package. The Hash does not handle duplicate values. The Hash manages items of type T, and uses a IComparer<ItemTYpe> that hashes compares items to hash items into the table. Constructor. Create a new hash table. The comparer to use to compare items. Gets the current enumeration stamp. Call CheckEnumerationStamp later with this value to throw an exception if the hash table is changed. The current enumeration stamp. Must be called whenever there is a structural change in the tree. Causes changeStamp to be changed, which causes any in-progress enumerations to throw exceptions. Checks the given stamp against the current change stamp. If different, the collection has changed during enumeration and an InvalidOperationException must be thrown changeStamp at the start of the enumeration. Gets the full hash code for an item. Item to get hash code for. The full hash code. It is never zero. Get the initial bucket number and skip amount from the full hash value. The full hash value. Returns the initial bucket. Always in the range 0..(totalSlots - 1). Returns the skip values. Always odd in the range 0..(totalSlots - 1). Gets the full hash value, initial bucket number, and skip amount for an item. Item to get hash value of. Returns the initial bucket. Always in the range 0..(totalSlots - 1). Returns the skip values. Always odd in the range 0..(totalSlots - 1). The full hash value. This is never zero. Make sure there are enough slots in the hash table that items can be inserted into the table. Number of additional items we are inserting. Check if the number of items in the table is small enough that we should shrink the table again. Given the size of a hash table, compute the "secondary shift" value -- the shift that is used to determine the skip amount for collision resolution. The new size of the table. The secondary skip amount. Resize the hash table to the given new size, moving all items into the new hash table. The new size of the hash table. Must be a power of two. Insert a new item into the hash table. If a duplicate item exists, can replace or do nothing. The item to insert. If true, duplicate items are replaced. If false, nothing is done if a duplicate already exists. If a duplicate was found, returns it (whether replaced or not). True if no duplicate existed, false if a duplicate was found. Deletes an item from the hash table. Item to search for and delete. If true returned, the actual item stored in the hash table (must be equal to , but may not be identical. True if item was found and deleted, false if item wasn't found. Find an item in the hash table. If found, optionally replace it with the finding item. Item to find. If true, replaces the equal item in the hash table with . Returns the equal item found in the table, if true was returned. True if the item was found, false otherwise. Enumerate all of the items in the hash table. The items are enumerated in a haphazard, unpredictable order. An IEnumerator<T> that enumerates the items in the hash table. Enumerate all of the items in the hash table. The items are enumerated in a haphazard, unpredictable order. An IEnumerator that enumerates the items in the hash table. Creates a clone of this hash table. If non-null, this function is applied to each item when cloning. It must be the case that this function does not modify the hash code or equality function. A shallow clone that contains the same items. Serialize the hash table. Called from the serialization infrastructure. Called on deserialization. We cannot deserialize now, because hash codes might not be correct now. We do real deserialization in the OnDeserialization call. Deserialize the hash table. Called from the serialization infrastructure when the object graph has finished deserializing. Get the number of items in the hash table. The number of items stored in the hash table. Get the number of slots in the hash table. Exposed internally for testing purposes. The number of slots in the hash table. Get or change the load factor. Changing the load factor may cause the size of the table to grow or shrink accordingly. The structure that has each slot in the hash table. Each slot has three parts: 1. The collision bit. Indicates whether some item visited this slot but had to keep looking because the slot was full. 2. 31-bit full hash value of the item. If zero, the slot is empty. 3. The item itself. Clear this slot, leaving the collision bit alone. The full hash value associated with the value in this slot, or zero if the slot is empty. Is this slot empty? The "Collision" bit indicates that some value hit this slot and collided, so had to try another slot. The OrderedMultiDictionary class that associates values with a key. Unlike an OrderedDictionary, each key can have multiple values associated with it. When indexing an OrderedMultidictionary, instead of a single value associated with a key, you retrieve an enumeration of values. All of the key are stored in sorted order. Also, the values associated with a given key are kept in sorted order as well. When constructed, you can chose to allow the same value to be associated with a key multiple times, or only one time. The type of the keys. The of values associated with the keys. Helper function to create a new KeyValuePair struct. The key. The value. A new KeyValuePair. Helper function to create a new KeyValuePair struct with a default value. The key. A new KeyValuePair. Get a RangeTester that maps to the range of all items with the given key. Key in the given range. A RangeTester delegate that selects the range of items with that range. Gets a range tester that defines a range by first and last items. The lower bound. True if the lower bound is inclusive, false if exclusive. The upper bound. True if the upper bound is inclusive, false if exclusive. A RangeTester delegate that tests for a key in the given range. Gets a range tester that defines a range by a lower bound. The lower bound. True if the lower bound is inclusive, false if exclusive. A RangeTester delegate that tests for a key in the given range. Gets a range tester that defines a range by upper bound. The upper bound. True if the upper bound is inclusive, false if exclusive. A RangeTester delegate that tests for a key in the given range. Create a new OrderedMultiDictionary. The default ordering of keys and values are used. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. The default ordering of keys and values will be used, as defined by TKey and TValue's implementation of IComparable<T> (or IComparable if IComparable<T> is not implemented). If a different ordering should be used, other constructors allow a custom Comparer or IComparer to be passed to changed the ordering. Can the same value be associated with a key multiple times? TKey or TValue does not implement either IComparable<T> or IComparable. Create a new OrderedMultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? A delegate to a method that will be used to compare keys. TValue does not implement either IComparable<TValue> or IComparable. Create a new OrderedMultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? A delegate to a method that will be used to compare keys. A delegate to a method that will be used to compare values. Create a new OrderedMultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? An IComparer<TKey> instance that will be used to compare keys. TValue does not implement either IComparable<TValue> or IComparable. Create a new OrderedMultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? An IComparer<TKey> instance that will be used to compare keys. An IComparer<TValue> instance that will be used to compare values. Create a new OrderedMultiDictionary. Used internally for cloning. Can the same value be associated with a key multiple times? Number of keys. An IComparer<TKey> instance that will be used to compare keys. An IComparer<TValue> instance that will be used to compare values. Comparer of key-value pairs. The red-black tree used to store the data. Adds a new value to be associated with a key. If duplicate values are permitted, this method always adds a new key-value pair to the dictionary. If duplicate values are not permitted, and already has a value equal to associated with it, then that value is replaced with , and the number of values associate with is unchanged. The key to associate with. The value to associated with . Removes a given value from the values associated with a key. If the last value is removed from a key, the key is removed also. A key to remove a value from. The value to remove. True if was associated with (and was therefore removed). False if was not associated with . Removes a key and all associated values from the dictionary. If the key is not present in the dictionary, it is unchanged and false is returned. The key to remove. True if the key was present and was removed. Returns false if the key was not present. Removes all keys and values from the dictionary. Determine if two values are equal. First value to compare. Second value to compare. True if the values are equal. Checks to see if is associated with in the dictionary. The key to check. The value to check. True if is associated with . Checks to see if the key is present in the dictionary and has at least one value associated with it. The key to check. True if is present and has at least one value associated with it. Returns false otherwise. A private helper method that returns an enumerable that enumerates all the keys in a range. Defines the range to enumerate. Should the keys be enumerated in reverse order? An IEnumerable<TKey> that enumerates the keys in the given range. in the dictionary. A private helper method for the indexer to return an enumerable that enumerates all the values for a key. This is separate method because indexers can't use the yield return construct. An IEnumerable<TValue> that can be used to enumerate all the values associated with . If is not present, an enumerable that enumerates no items is returned. Determines if this dictionary contains a key equal to . If so, all the values associated with that key are returned through the values parameter. The key to search for. Returns all values associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Enumerate all of the keys in the dictionary. An IEnumerator<TKey> of all of the keys in the dictionary. Gets the number of values associated with a given key. The key to count values of. The number of values associated with . If is not present in the dictionary, zero is returned. Gets a total count of values in the collection. The total number of values associated with all keys in the dictionary. Makes a shallow clone of this dictionary; i.e., if keys or values of the dictionary are reference types, then they are not cloned. If TKey or TValue is a value type, then each element is copied as if by simple assignment. Cloning the dictionary takes time O(N), where N is the number of key-value pairs in the dictionary. The cloned dictionary. Implements ICloneable.Clone. Makes a shallow clone of this dictionary; i.e., if keys or values are reference types, then they are not cloned. The cloned dictionary. Throw an InvalidOperationException indicating that this type is not cloneable. Type to test. Makes a deep clone of this dictionary. A new dictionary is created with a clone of each entry of this dictionary, by calling ICloneable.Clone on each element. If TKey or TValue is a value type, then each element is copied as if by simple assignment. If TKey or TValue is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the dictionary takes time O(N log N), where N is the number of key-value pairs in the dictionary. The cloned dictionary. TKey or TValue is a reference type that does not implement ICloneable. Returns a View collection that can be used for enumerating the keys and values in the collection in reversed order.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(KeyValuePair<TKey, TValue> pair in dictionary.Reversed()) { // process pair }

If an entry is added to or deleted from the dictionary while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Reverse does not copy the data in the dictionary, and the operation takes constant time.

An OrderedDictionary.View of key-value pairs in reverse order.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only keys that are greater than and less than are included. The keys are enumerated in sorted order. Keys equal to the end points of the range can be included or excluded depending on the and parameters.

If is greater than or equal to , the returned collection is empty.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.Range(from, true, to, false)) { // process pair }

Calling Range does not copy the data in the dictionary, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--keys equal to the lower bound will be included in the range. If false, the lower bound is exclusive--keys equal to the lower bound will not be included in the range. The upper bound of the range. If true, the upper bound is inclusive--keys equal to the upper bound will be included in the range. If false, the upper bound is exclusive--keys equal to the upper bound will not be included in the range. An OrderedMultiDictionary.View of key-value pairs in the given range.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only keys that are greater than (and optionally, equal to) are included. The keys are enumerated in sorted order. Keys equal to can be included or excluded depending on the parameter.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.RangeFrom(from, true)) { // process pair }

Calling RangeFrom does not copy of the data in the dictionary, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--keys equal to the lower bound will be included in the range. If false, the lower bound is exclusive--keys equal to the lower bound will not be included in the range. An OrderedMultiDictionary.View of key-value pairs in the given range.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only items that are less than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.RangeFrom(from, false)) { // process pair }

Calling RangeTo does not copy the data in the dictionary, and the operation takes constant time.

The upper bound of the range. If true, the upper bound is inclusive--keys equal to the upper bound will be included in the range. If false, the upper bound is exclusive--keys equal to the upper bound will not be included in the range. An OrderedMultiDictionary.View of key-value pairs in the given range.
Returns the IComparer<T> used to compare keys in this dictionary. If the dictionary was created using a comparer, that comparer is returned. If the dictionary was created using a comparison delegate, then a comparer equivalent to that delegate is returned. Otherwise the default comparer for TKey (Comparer<TKey>.Default) is returned. Returns the IComparer<T> used to compare values in this dictionary. If the dictionary was created using a comparer, that comparer is returned. If the dictionary was created using a comparison delegate, then a comparer equivalent to that delegate is returned. Otherwise the default comparer for TValue (Comparer<TValue>.Default) is returned. Gets the number of key-value pairs in the dictionary. Each value associated with a given key is counted. If duplicate values are permitted, each duplicate value is included in the count. The number of key-value pairs in the dictionary. Gets a read-only collection of all key-value pairs in the dictionary. If a key has multiple values associated with it, then a key-value pair is present for each value associated with the key. A private class that implements ICollection<KeyValuePair<TKey,TValue>> and ICollection for the KeyValuePairs collection. The collection is read-only. The OrderedMultiDictionary<TKey,TValue>.View class is used to look at a subset of the keys and values inside an ordered multi-dictionary. It is returned from the Range, RangeTo, RangeFrom, and Reversed methods.

Views are dynamic. If the underlying dictionary changes, the view changes in sync. If a change is made to the view, the underlying dictionary changes accordingly.

Typically, this class is used in conjunction with a foreach statement to enumerate the keys and values in a subset of the OrderedMultiDictionary. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.Range(from, to)) { // process pair }
Initialize the View. Associated OrderedMultiDictionary to be viewed. Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Is the view enuemerated in reverse order? Determine if the given key lies within the bounds of this view. Key to test. True if the key is within the bounds of this view. Enumerate all the keys in the dictionary. An IEnumerator<TKey> that enumerates all of the keys in the collection that have at least one value associated with them. Enumerate all of the values associated with a given key. If the key exists and has values associated with it, an enumerator for those values is returned throught . If the key does not exist, false is returned. The key to get values for. If true is returned, this parameter receives an enumerators that enumerates the values associated with that key. True if the key exists and has values associated with it. False otherwise. Tests if the key is present in the part of the dictionary being viewed. Key to check True if the key is within this view. Tests if the key-value pair is present in the part of the dictionary being viewed. Key to check for. Value to check for. True if the key-value pair is within this view. Gets the number of values associated with a given key. The key to count values of. The number of values associated with . If is not present in this view, zero is returned. Adds the given key-value pair to the underlying dictionary of this view. If is not within the range of this view, an ArgumentException is thrown. is not within the range of this view. Removes the key (and associated value) from the underlying dictionary of this view. If no key in the view is equal to the passed key, the dictionary and view are unchanged. The key to remove. True if the key was found and removed. False if the key was not found. Removes the key and value from the underlying dictionary of this view. that is equal to the passed in key. If no key in the view is equal to the passed key, or has the given value associated with it, the dictionary and view are unchanged. The key to remove. The value to remove. True if the key-value pair was found and removed. False if the key-value pair was not found. Removes all the keys and values within this view from the underlying OrderedMultiDictionary. The following removes all the keys that start with "A" from an OrderedMultiDictionary. dictionary.Range("A", "B").Clear(); Creates a new View that has the same keys and values as this, in the reversed order. A new View that has the reversed order of this view. Number of keys in this view. Number of keys that lie within the bounds the view.
================================================ FILE: Documentation/Requirements/PowerCollections/Binaries_Signed_4.5/PowerCollections.XML ================================================ PowerCollections The BinaryPredicate delegate type encapsulates a method that takes two items of the same type, and returns a boolean value representating some relationship between them. For example, checking whether two items are equal or equivalent is one kind of binary predicate. The first item. The second item. Whether item1 and item2 satisfy the relationship that the BinaryPredicate defines. Algorithms contains a number of static methods that implement algorithms that work on collections. Most of the methods deal with the standard generic collection interfaces such as IEnumerable<T>, ICollection<T> and IList<T>. Returns a view onto a sub-range of a list. Items from are not copied; the returned IList<T> is simply a different view onto the same underlying items. Changes to are reflected in the view, and vice versa. Insertions and deletions in the view change the size of the view, but insertions and deletions in the underlying list do not. This method can be used to apply an algorithm to a portion of a list. For example: Algorithms.ReverseInPlace(Algorithms.Range(list, 3, 6)) will reverse the 6 items beginning at index 3. The type of the items in the list. The list to view. The starting index of the view. The number of items in the view. A list that is a view onto the given sub-list. is null. or is negative. + is greater than the size of . Returns a view onto a sub-range of an array. Items from are not copied; the returned IList<T> is simply a different view onto the same underlying items. Changes to are reflected in the view, and vice versa. Insertions and deletions in the view change the size of the view. After an insertion, the last item in "falls off the end". After a deletion, the last item in array becomes the default value (0 or null). This method can be used to apply an algorithm to a portion of a array. For example: Algorithms.ReverseInPlace(Algorithms.Range(array, 3, 6)) will reverse the 6 items beginning at index 3. The array to view. The starting index of the view. The number of items in the view. A list that is a view onto the given sub-array. is null. or is negative. + is greater than the size of . Returns a read-only view onto a collection. The returned ICollection<T> interface only allows operations that do not change the collection: GetEnumerator, Contains, CopyTo, Count. The ReadOnly property returns false, indicating that the collection is read-only. All other methods on the interface throw a NotSupportedException. The data in the underlying collection is not copied. If the underlying collection is changed, then the read-only view also changes accordingly. The type of items in the collection. The collection to wrap. A read-only view onto . If is null, then null is returned. Returns a read-only view onto a list. The returned IList<T> interface only allows operations that do not change the list: GetEnumerator, Contains, CopyTo, Count, IndexOf, and the get accessor of the indexer. The IsReadOnly property returns true, indicating that the list is read-only. All other methods on the interface throw a NotSupportedException. The data in the underlying list is not copied. If the underlying list is changed, then the read-only view also changes accordingly. The type of items in the list. The list to wrap. A read-only view onto . Returns null if is null. If is already read-only, returns . Returns a read-only view onto a dictionary. The returned IDictionary<TKey,TValue> interface only allows operations that do not change the dictionary. The IsReadOnly property returns true, indicating that the dictionary is read-only. All other methods on the interface throw a NotSupportedException. The data in the underlying dictionary is not copied. If the underlying dictionary is changed, then the read-only view also changes accordingly. The dictionary to wrap. A read-only view onto . Returns null if is null. If is already read-only, returns . Given a non-generic IEnumerable interface, wrap a generic IEnumerable<T> interface around it. The generic interface will enumerate the same objects as the underlying non-generic collection, but can be used in places that require a generic interface. The underlying non-generic collection must contain only items that are of type or a type derived from it. This method is useful when interfacing older, non-generic collections to newer code that uses generic interfaces. Some collections implement both generic and non-generic interfaces. For efficiency, this method will first attempt to cast to IEnumerable<T>. If that succeeds, it is returned; otherwise, a wrapper object is created. The item type of the wrapper collection. An untyped collection. This collection should only contain items of type or a type derived from it. A generic IEnumerable<T> wrapper around . If is null, then null is returned. Given a non-generic ICollection interface, wrap a generic ICollection<T> interface around it. The generic interface will enumerate the same objects as the underlying non-generic collection, but can be used in places that require a generic interface. The underlying non-generic collection must contain only items that are of type or a type derived from it. This method is useful when interfacing older, non-generic collections to newer code that uses generic interfaces. Some collections implement both generic and non-generic interfaces. For efficiency, this method will first attempt to cast to ICollection<T>. If that succeeds, it is returned; otherwise, a wrapper object is created. Unlike the generic interface, the non-generic ICollection interfaces does not contain methods for adding or removing items from the collection. For this reason, the returned ICollection<T> will be read-only. The item type of the wrapper collection. An untyped collection. This collection should only contain items of type or a type derived from it. A generic ICollection<T> wrapper around . If is null, then null is returned. Given a non-generic IList interface, wrap a generic IList<T> interface around it. The generic interface will enumerate the same objects as the underlying non-generic list, but can be used in places that require a generic interface. The underlying non-generic list must contain only items that are of type or a type derived from it. This method is useful when interfacing older, non-generic lists to newer code that uses generic interfaces. Some collections implement both generic and non-generic interfaces. For efficiency, this method will first attempt to cast to IList<T>. If that succeeds, it is returned; otherwise, a wrapper object is created. The item type of the wrapper list. An untyped list. This list should only contain items of type or a type derived from it. A generic IList<T> wrapper around . If is null, then null is returned. Given a generic ICollection<T> interface, wrap a non-generic (untyped) ICollection interface around it. The non-generic interface will contain the same objects as the underlying generic collection, but can be used in places that require a non-generic interface. This method is useful when interfacing generic interfaces with older code that uses non-generic interfaces. Many generic collections already implement the non-generic interfaces directly. This method will first attempt to simply cast to ICollection. If that succeeds, it is returned; if it fails, then a wrapper object is created. The item type of the underlying collection. A typed collection to wrap. A non-generic ICollection wrapper around . If is null, then null is returned. Given a generic IList<T> interface, wrap a non-generic (untyped) IList interface around it. The non-generic interface will contain the same objects as the underlying generic list, but can be used in places that require a non-generic interface. This method is useful when interfacing generic interfaces with older code that uses non-generic interfaces. Many generic collections already implement the non-generic interfaces directly. This method will first attempt to simply cast to IList. If that succeeds, it is returned; if it fails, then a wrapper object is created. The item type of the underlying list. A typed list to wrap. A non-generic IList wrapper around . If is null, then null is returned. Creates a read-write IList<T> wrapper around an array. When an array is implicitely converted to an IList<T>, changes to the items in the array cannot be made through the interface. This method creates a read-write IList<T> wrapper on an array that can be used to make changes to the array. Use this method when you need to pass an array to an algorithms that takes an IList<T> and that tries to modify items in the list. Algorithms in this class generally do not need this method, since they have been design to operate on arrays even when they are passed as an IList<T>. Since arrays cannot be resized, inserting an item causes the last item in the array to be automatically removed. Removing an item causes the last item in the array to be replaced with a default value (0 or null). Clearing the list causes all the items to be replaced with a default value. The array to wrap. An IList<T> wrapper onto . Replace all items in a collection equal to a particular value with another values, yielding another collection. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The collection to process. The value to find and replace within . The new value to replace with. An new collection with the items from , in the same order, with the appropriate replacements made. Replace all items in a collection equal to a particular value with another values, yielding another collection. A passed IEqualityComparer is used to determine equality. The collection to process. The value to find and replace within . The new value to replace with. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. An new collection with the items from , in the same order, with the appropriate replacements made. Replace all items in a collection that a predicate evalues at true with a value, yielding another collection. . The collection to process. The predicate used to evaluate items with the collection. If the predicate returns true for a particular item, the item is replaces with . The new value to replace with. An new collection with the items from , in the same order, with the appropriate replacements made. Replace all items in a list or array equal to a particular value with another value. The replacement is done in-place, changing the list. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. The value to find and replace within . The new value to replace with. Replace all items in a list or array equal to a particular value with another values. The replacement is done in-place, changing the list. A passed IEqualityComparer is used to determine equality. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. The value to find and replace within . The new value to replace with. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. Replace all items in a list or array that a predicate evaluates at true with a value. The replacement is done in-place, changing the list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. The predicate used to evaluate items with the collection. If the predicate returns true for a particular item, the item is replaces with . The new value to replace with. Remove consecutive equal items from a collection, yielding another collection. In each run of consecutive equal items in the collection, all items after the first item in the run are removed. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The collection to process. An new collection with the items from , in the same order, with consecutive duplicates removed. is null. Remove consecutive equal items from a collection, yielding another collection. In each run of consecutive equal items in the collection, all items after the first item in the run are removed. A passed IEqualityComparer is used to determine equality. The collection to process. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. An new collection with the items from , in the same order, with consecutive duplicates removed. or is null. Remove consecutive "equal" items from a collection, yielding another collection. In each run of consecutive equal items in the collection, all items after the first item in the run are removed. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being removed need not be true equality. The collection to process. The BinaryPredicate used to compare items for "equality". An item current is removed if predicate(first, current)==true, where first is the first item in the group of "duplicate" items. An new collection with the items from , in the same order, with consecutive "duplicates" removed. Remove consecutive equal items from a list or array. In each run of consecutive equal items in the list, all items after the first item in the run are removed. The removal is done in-place, changing the list. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. Remove subsequent consecutive equal items from a list or array. In each run of consecutive equal items in the list, all items after the first item in the run are removed. The replacement is done in-place, changing the list. A passed IEqualityComparer is used to determine equality. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. Remove consecutive "equal" items from a list or array. In each run of consecutive equal items in the list, all items after the first item in the run are removed. The replacement is done in-place, changing the list. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being tested for need not be true equality. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to process. The BinaryPredicate used to compare items for "equality". Finds the first occurence of consecutive equal items in the list. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to examine. The number of consecutive equal items to look for. The count must be at least 1. The index of the first item in the first run of consecutive equal items, or -1 if no such run exists.. Finds the first occurence of consecutive equal items in the list. A passed IEqualityComparer is used to determine equality. The list to examine. The number of consecutive equal items to look for. The count must be at least 1. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. The index of the first item in the first run of consecutive equal items, or -1 if no such run exists. Finds the first occurence of consecutive "equal" items in the list. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being tested for need not be true equality. The list to examine. The number of consecutive equal items to look for. The count must be at least 1. The BinaryPredicate used to compare items for "equality". The index of the first item in the first run of consecutive equal items, or -1 if no such run exists. Finds the first occurence of consecutive items in the list for which a given predicate returns true. The list to examine. The number of consecutive items to look for. The count must be at least 1. The predicate used to test each item. The index of the first item in the first run of items where returns true for all items in the run, or -1 if no such run exists. Finds the first item in a collection that satisfies the condition defined by . If the default value for T could be present in the collection, and would be matched by the predicate, then this method is inappropriate, because you cannot disguish whether the default value for T was actually present in the collection, or no items matched the predicate. In this case, use TryFindFirstWhere. The collection to search. A delegate that defined the condition to check for. The first item in the collection that matches the condition, or the default value for T (0 or null) if no item that matches the condition is found. Finds the first item in a collection that satisfies the condition defined by . The collection to search. A delegate that defined the condition to check for. Outputs the first item in the collection that matches the condition, if the method returns true. True if an item satisfying the condition was found. False if no such item exists in the collection. Finds the last item in a collection that satisfies the condition defined by . If the collection implements IList<T>, then the list is scanned in reverse until a matching item is found. Otherwise, the entire collection is iterated in the forward direction. If the default value for T could be present in the collection, and would be matched by the predicate, then this method is inappropriate, because you cannot disguish whether the default value for T was actually present in the collection, or no items matched the predicate. In this case, use TryFindFirstWhere. The collection to search. A delegate that defined the condition to check for. The last item in the collection that matches the condition, or the default value for T (0 or null) if no item that matches the condition is found. Finds the last item in a collection that satisfies the condition defined by . If the collection implements IList<T>, then the list is scanned in reverse until a matching item is found. Otherwise, the entire collection is iterated in the forward direction. The collection to search. A delegate that defined the condition to check for. Outputs the last item in the collection that matches the condition, if the method returns true. True if an item satisfying the condition was found. False if no such item exists in the collection. Enumerates all the items in that satisfy the condition defined by . The collection to check all the items in. A delegate that defines the condition to check for. An IEnumerable<T> that enumerates the items that satisfy the condition. Finds the index of the first item in a list that satisfies the condition defined by . The list to search. A delegate that defined the condition to check for. The index of the first item satisfying the condition. -1 if no such item exists in the list. Finds the index of the last item in a list that satisfies the condition defined by . The list to search. A delegate that defined the condition to check for. The index of the last item satisfying the condition. -1 if no such item exists in the list. Enumerates the indices of all the items in that satisfy the condition defined by . The list to check all the items in. A delegate that defines the condition to check for. An IEnumerable<T> that enumerates the indices of items that satisfy the condition. Finds the index of the first item in a list equal to a given item. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. The item to search for. The index of the first item equal to . -1 if no such item exists in the list. Finds the index of the first item in a list equal to a given item. A passed IEqualityComparer is used to determine equality. The list to search. The item to search for. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. The index of the first item equal to . -1 if no such item exists in the list. Finds the index of the last item in a list equal to a given item. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. The item to search for. The index of the last item equal to . -1 if no such item exists in the list. Finds the index of the last item in a list equal to a given item. A passed IEqualityComparer is used to determine equality. The list to search. The item to search for. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. The index of the last item equal to . -1 if no such item exists in the list. Enumerates the indices of all the items in a list equal to a given item. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. The item to search for. An IEnumerable<T> that enumerates the indices of items equal to . Enumerates the indices of all the items in a list equal to a given item. A passed IEqualityComparer is used to determine equality. The list to search. The item to search for. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. An IEnumerable<T> that enumerates the indices of items equal to . Finds the index of the first item in a list equal to one of several given items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. The items to search for. The index of the first item equal to any of the items in the collection . -1 if no such item exists in the list. Finds the index of the first item in a list equal to one of several given items. A passed IEqualityComparer is used to determine equality. The list to search. The items to search for. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode methods will be called. The index of the first item equal to any of the items in the collection . -1 if no such item exists in the list. Finds the index of the first item in a list "equal" to one of several given items. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being removed need not be true equality. This methods finds first item X which satisfies BinaryPredicate(X,Y), where Y is one of the items in The list to search. The items to search for. The BinaryPredicate used to compare items for "equality". The index of the first item "equal" to any of the items in the collection , using as the test for equality. -1 if no such item exists in the list. Finds the index of the last item in a list equal to one of several given items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. The items to search for. The index of the last item equal to any of the items in the collection . -1 if no such item exists in the list. Finds the index of the last item in a list equal to one of several given items. A passed IEqualityComparer is used to determine equality. The list to search. The items to search for. The IEqualityComparer<T> used to compare items for equality. The index of the last item equal to any of the items in the collection . -1 if no such item exists in the list. Finds the index of the last item in a list "equal" to one of several given items. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being removed need not be true equality. This methods finds last item X which satisfies BinaryPredicate(X,Y), where Y is one of the items in The list to search. The items to search for. The BinaryPredicate used to compare items for "equality". The index of the last item "equal" to any of the items in the collection , using as the test for equality. -1 if no such item exists in the list. Enumerates the indices of all the items in a list equal to one of several given items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The list to search. A collection of items to search for. An IEnumerable<T> that enumerates the indices of items equal to any of the items in the collection . Enumerates the indices of all the items in a list equal to one of several given items. A passed IEqualityComparer is used to determine equality. The list to search. A collection of items to search for. The IEqualityComparer<T> used to compare items for equality. An IEnumerable<T> that enumerates the indices of items equal to any of the items in the collection . Enumerates the indices of all the items in a list equal to one of several given items. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being removed need not be true equality. This methods finds last item X which satisfies BinaryPredicate(X,Y), where Y is one of the items in The list to search. A collection of items to search for. The BinaryPredicate used to compare items for "equality". An IEnumerable<T> that enumerates the indices of items "equal" to any of the items in the collection , using as the test for equality. Searchs a list for a sub-sequence of items that match a particular pattern. A subsequence of matches pattern at index i if list[i] is equal to the first item in , list[i+1] is equal to the second item in , and so forth for all the items in . The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The type of items in the list. The list to search. The sequence of items to search for. The first index with that matches the items in . Searchs a list for a sub-sequence of items that match a particular pattern. A subsequence of matches pattern at index i if list[i] is "equal" to the first item in , list[i+1] is "equal" to the second item in , and so forth for all the items in . The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being tested for in the pattern need not be equality. The type of items in the list. The list to search. The sequence of items to search for. The BinaryPredicate used to compare items for "equality". The first index with that matches the items in . Searchs a list for a sub-sequence of items that match a particular pattern. A subsequence of matches pattern at index i if list[i] is equal to the first item in , list[i+1] is equal to the second item in , and so forth for all the items in . The passed instance of IEqualityComparer<T> is used for determining if two items are equal. The type of items in the list. The list to search. The sequence of items to search for. The IEqualityComparer<T> used to compare items for equality. Only the Equals method will be called. The first index with that matches the items in . Determines if one collection is a subset of another, considered as sets. The first set is a subset of the second set if every item in the first set also occurs in the second set. If an item appears X times in the first set, it must appear at least X times in the second set. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsSubsetOf method on that class. The first collection. The second collection. True if is a subset of , considered as sets. or is null. Determines if one collection is a subset of another, considered as sets. The first set is a subset of the second set if every item in the first set also occurs in the second set. If an item appears X times in the first set, it must appear at least X times in the second set. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsSubsetOf method on that class. The first collection. The second collection. The IEqualityComparer<T> used to compare items for equality. True if is a subset of , considered as sets. or is null. Determines if one collection is a proper subset of another, considered as sets. The first set is a proper subset of the second set if every item in the first set also occurs in the second set, and the first set is strictly smaller than the second set. If an item appears X times in the first set, it must appear at least X times in the second set. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsSubsetOf method on that class. The first collection. The second collection. True if is a subset of , considered as sets. or is null. Determines if one collection is a proper subset of another, considered as sets. The first set is a proper subset of the second set if every item in the first set also occurs in the second set, and the first set is strictly smaller than the second set. If an item appears X times in the first set, it must appear at least X times in the second set. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsSubsetOf method on that class. The first collection. The second collection. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. True if is a proper subset of , considered as sets. or is null. Determines if two collections are disjoint, considered as sets. Two sets are disjoint if they have no common items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsDisjoint method on that class. The first collection. The second collection. True if are are disjoint, considered as sets. or is null. Determines if two collections are disjoint, considered as sets. Two sets are disjoint if they have no common items. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the IsDisjoint method on that class. The first collection. The second collection. The IEqualityComparerComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. True if are are disjoint, considered as sets. or is null. Determines if two collections are equal, considered as sets. Two sets are equal if they have have the same items, with order not being significant. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the EqualTo method on that class. The first collection. The second collection. True if are are equal, considered as sets. or is null. Determines if two collections are equal, considered as sets. Two sets are equal if they have have the same items, with order not being significant. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the EqualTo method on that class. The first collection. The second collection. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. True if are are equal, considered as sets. or is null. Computes the set-theoretic intersection of two collections. The intersection of two sets is all items that appear in both of the sets. If an item appears X times in one set, and Y times in the other set, the intersection contains the item Minimum(X,Y) times. The source collections are not changed. A new collection is created with the intersection of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the Intersection or IntersectionWith methods on that class. The first collection to intersect. The second collection to intersect. The intersection of the two collections, considered as sets. or is null. Computes the set-theoretic intersection of two collections. The intersection of two sets is all items that appear in both of the sets. If an item appears X times in one set, and Y times in the other set, the intersection contains the item Minimum(X,Y) times. The source collections are not changed. A new collection is created with the intersection of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the Intersection or IntersectionWith methods on that class. The first collection to intersect. The second collection to intersect. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. The intersection of the two collections, considered as sets. or is null. Computes the set-theoretic union of two collections. The union of two sets is all items that appear in either of the sets. If an item appears X times in one set, and Y times in the other set, the union contains the item Maximum(X,Y) times. The source collections are not changed. A new collection is created with the union of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the Union or UnionWith methods on that class. The first collection to union. The second collection to union. The union of the two collections, considered as sets. or is null. Computes the set-theoretic union of two collections. The union of two sets is all items that appear in either of the sets. If an item appears X times in one set, and Y times in the other set, the union contains the item Maximum(X,Y) times. The source collections are not changed. A new collection is created with the union of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the union or unionWith methods on that class. The first collection to union. The second collection to union. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. The union of the two collections, considered as sets. or is null. Computes the set-theoretic difference of two collections. The difference of two sets is all items that appear in the first set, but not in the second. If an item appears X times in the first set, and Y times in the second set, the difference contains the item X - Y times (0 times if X < Y). The source collections are not changed. A new collection is created with the difference of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the Difference or DifferenceWith methods on that class. The first collection to difference. The second collection to difference. The difference of and , considered as sets. or is null. Computes the set-theoretic difference of two collections. The difference of two sets is all items that appear in the first set, but not in the second. If an item appears X times in the first set, and Y times in the second set, the difference contains the item X - Y times (0 times if X < Y). The source collections are not changed. A new collection is created with the difference of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the difference or differenceWith methods on that class. The first collection to difference. The second collection to difference. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. The difference of and , considered as sets. or is null. Computes the set-theoretic symmetric difference of two collections. The symmetric difference of two sets is all items that appear in the one of the sets, but not in the other. If an item appears X times in the one set, and Y times in the other set, the symmetric difference contains the item AbsoluteValue(X - Y) times. The source collections are not changed. A new collection is created with the symmetric difference of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the SymmetricDifference or SymmetricDifferenceWith methods on that class. The first collection to symmetric difference. The second collection to symmetric difference. The symmetric difference of and , considered as sets. or is null. Computes the set-theoretic symmetric difference of two collections. The symmetric difference of two sets is all items that appear in the one of the sets, but not in the other. If an item appears X times in the one set, and Y times in the other set, the symmetric difference contains the item AbsoluteValue(X - Y) times. The source collections are not changed. A new collection is created with the symmetric difference of the collections; the order of the items in this collection is undefined. When equal items appear in both collections, the returned collection will include an arbitrary choice of one of the two equal items. If both collections are Set, Bag, OrderedSet, or OrderedBag collections, it is more efficient to use the symmetric difference or symmetric differenceWith methods on that class. The first collection to symmetric difference. The second collection to symmetric difference. The IEqualityComparer<T> used to compare items for equality. Only the Equals and GetHashCode member functions of this interface are called. The symmetric difference of and , considered as sets. or is null. Computes the cartestian product of two collections: all possible pairs of items, with the first item taken from the first collection and the second item taken from the second collection. If the first collection has N items, and the second collection has M items, the cartesian product will have N * M pairs. The type of items in the first collection. The type of items in the second collection. The first collection. The second collection. An IEnumerable<Pair<TFirst, TSecond>> that enumerates the cartesian product of the two collections. Gets a string representation of the elements in the collection. The string representation starts with "{", has a list of items separated by commas (","), and ends with "}". Each item in the collection is converted to a string by calling its ToString method (null is represented by "null"). Contained collections (except strings) are recursively converted to strings by this method. A collection to get the string representation of. The string representation of the collection. If is null, then the string "null" is returned. Gets a string representation of the elements in the collection. The string to used at the beginning and end, and to separate items, and supplied by parameters. Each item in the collection is converted to a string by calling its ToString method (null is represented by "null"). A collection to get the string representation of. If true, contained collections (except strings) are converted to strings by a recursive call to this method, instead of by calling ToString. The string to appear at the beginning of the output string. The string to appear between each item in the string. The string to appear at the end of the output string. The string representation of the collection. If is null, then the string "null" is returned. , , or is null. Gets a string representation of the mappings in a dictionary. The string representation starts with "{", has a list of mappings separated by commas (", "), and ends with "}". Each mapping is represented by "key->value". Each key and value in the dictionary is converted to a string by calling its ToString method (null is represented by "null"). Contained collections (except strings) are recursively converted to strings by this method. A dictionary to get the string representation of. The string representation of the collection, or "null" if is null. Return a private random number generator to use if the user doesn't supply one. The private random number generator. Only one is ever created and is always returned. Randomly shuffles the items in a collection, yielding a new collection. The type of the items in the collection. The collection to shuffle. An array with the same size and items as , but the items in a randomly chosen order. Randomly shuffles the items in a collection, yielding a new collection. The type of the items in the collection. The collection to shuffle. The random number generator to use to select the random order. An array with the same size and items as , but the items in a randomly chosen order. Randomly shuffles the items in a list or array, in place. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to shuffle. Randomly shuffles the items in a list or array, in place. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to shuffle. The random number generator to use to select the random order. Picks a random subset of items from , and places those items into a random order. No item is selected more than once. If the collection implements IList<T>, then this method takes time O(). Otherwise, this method takes time O(N), where N is the number of items in the collection. The type of items in the collection. The collection of items to select from. This collection is not changed. The number of items in the subset to choose. An array of items, selected at random from . is negative or greater than .Count. Picks a random subset of items from , and places those items into a random order. No item is selected more than once. If the collection implements IList<T>, then this method takes time O(). Otherwise, this method takes time O(N), where N is the number of items in the collection. The type of items in the collection. The collection of items to select from. This collection is not changed. The number of items in the subset to choose. The random number generates used to make the selection. An array of items, selected at random from . is negative or greater than .Count. is null. Generates all the possible permutations of the items in . If has N items, then N factorial permutations will be generated. This method does not compare the items to determine if any of them are equal. If some items are equal, the same permutation may be generated more than once. For example, if the collections contains the three items A, A, and B, then this method will generate the six permutations, AAB, AAB, ABA, ABA, BAA, BAA (not necessarily in that order). To take equal items into account, use the GenerateSortedPermutations method. The type of items to permute. The collection of items to permute. An IEnumerable<T[]> that enumerations all the possible permutations of the items in . Each permutations is returned as an array. The items in the array should be copied if they need to be used after the next permutation is generated; each permutation may reuse the same array instance. Generates all the possible permutations of the items in , in lexicographical order. Even if some items are equal, the same permutation will not be generated more than once. For example, if the collections contains the three items A, A, and B, then this method will generate only the three permutations, AAB, ABA, BAA. The type of items to permute. The collection of items to permute. An IEnumerable<T[]> that enumerations all the possible permutations of the items in . Each permutations is returned as an array. The items in the array should be copied if they need to be used after the next permutation is generated; each permutation may reuse the same array instance. Generates all the possible permutations of the items in , in lexicographical order. A supplied IComparer<T> instance is used to compare the items. Even if some items are equal, the same permutation will not be generated more than once. For example, if the collections contains the three items A, A, and B, then this method will generate only the three permutations, AAB, ABA, BAA. The type of items to permute. The collection of items to permute. The IComparer<T> used to compare the items. An IEnumerable<T[]> that enumerations all the possible permutations of the items in . Each permutations is returned as an array. The items in the array should be copied if they need to be used after the next permutation is generated; each permutation may reuse the same array instance. Generates all the possible permutations of the items in , in lexicographical order. A supplied Comparison<T> delegate is used to compare the items. Even if some items are equal, the same permutation will not be generated more than once. For example, if the collections contains the three items A, A, and B, then this method will generate only the three permutations, AAB, ABA, BAA. The type of items to permute. The collection of items to permute. The Comparison<T> delegate used to compare the items. An IEnumerable<T[]> that enumerations all the possible permutations of the items in . Each permutations is returned as an array. The items in the array should be copied if they need to be used after the next permutation is generated; each permutation may reuse the same array instance. Finds the maximum value in a collection. Values in the collection are compared by using the IComparable<T> interfaces implementation on the type T. The type of items in the collection. The collection to search. The largest item in the collection. The collection is empty. is null. Finds the maximum value in a collection. A supplied IComparer<T> is used to compare the items in the collection. The type of items in the collection. The collection to search. The comparer instance used to compare items in the collection. The largest item in the collection. The collection is empty. or is null. Finds the maximum value in a collection. A supplied Comparison<T> delegate is used to compare the items in the collection. The type of items in the collection. The collection to search. The comparison used to compare items in the collection. The largest item in the collection. The collection is empty. or is null. Finds the minimum value in a collection. Values in the collection are compared by using the IComparable<T> interfaces implementation on the type T. The type of items in the collection. The collection to search. The smallest item in the collection. The collection is empty. is null. Finds the minimum value in a collection. A supplied IComparer<T> is used to compare the items in the collection. The type of items in the collection. The collection to search. The comparer instance used to compare items in the collection. The smallest item in the collection. The collection is empty. or is null. Finds the minimum value in a collection. A supplied Comparison<T> delegate is used to compare the items in the collection. The type of items in the collection. The collection to search. The comparison used to compare items in the collection. The smallest item in the collection. The collection is empty. or is null. Finds the index of the maximum value in a list. Values in the list are compared by using the IComparable<T> interfaces implementation on the type T. The type of items in the list. The list to search. The index of the largest item in the list. If the maximum value appears multiple times, the index of the first appearance is used. If the list is empty, -1 is returned. is null. Finds the index of the maximum value in a list. A supplied IComparer<T> is used to compare the items in the collection. The type of items in the list. The list to search. The comparer instance used to compare items in the collection. The index of the largest item in the list. If the maximum value appears multiple times, the index of the first appearance is used. If the list is empty, -1 is returned. or is null. Finds the index of the maximum value in a list. A supplied Comparison<T> delegate is used to compare the items in the collection. The type of items in the list. The list to search. The comparison used to compare items in the collection. The index of the largest item in the list. If the maximum value appears multiple times, the index of the first appearance is used. If the list is empty, -1 is returned. or is null. Finds the index of the minimum value in a list. Values in the list are compared by using the IComparable<T> interfaces implementation on the type T. The type of items in the list. The list to search. The index of the smallest item in the list. If the minimum value appears multiple times, the index of the first appearance is used. The collection is empty. is null. Finds the index of the minimum value in a list. A supplied IComparer<T> is used to compare the items in the collection. The type of items in the list. The list to search. The comparer instance used to compare items in the collection. The index of the smallest item in the list. If the minimum value appears multiple times, the index of the first appearance is used. The collection is empty. or is null. Finds the index of the minimum value in a list. A supplied Comparison<T> delegate is used to compare the items in the collection. The type of items in the list. The list to search. The comparison delegate used to compare items in the collection. The index of the smallest item in the list. If the minimum value appears multiple times, the index of the first appearance is used. The collection is empty. or is null. Creates a sorted version of a collection. Values are compared by using the IComparable<T> interfaces implementation on the type T. The collection to sort. An array containing the sorted version of the collection. Creates a sorted version of a collection. A supplied IComparer<T> is used to compare the items in the collection. The collection to sort. The comparer instance used to compare items in the collection. Only the Compare method is used. An array containing the sorted version of the collection. Creates a sorted version of a collection. A supplied Comparison<T> delegate is used to compare the items in the collection. The collection to sort. The comparison delegate used to compare items in the collection. An array containing the sorted version of the collection. Sorts a list or array in place. The Quicksort algorithms is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. Values are compared by using the IComparable<T> interfaces implementation on the type T. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. Sorts a list or array in place. A supplied IComparer<T> is used to compare the items in the list. The Quicksort algorithms is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. The comparer instance used to compare items in the collection. Only the Compare method is used. Sorts a list or array in place. A supplied Comparison<T> delegate is used to compare the items in the list. The Quicksort algorithms is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. The comparison delegate used to compare items in the collection. Creates a sorted version of a collection. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. Values are compared by using the IComparable<T> interfaces implementation on the type T. The collection to sort. An array containing the sorted version of the collection. Creates a sorted version of a collection. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. A supplied IComparer<T> is used to compare the items in the collection. The collection to sort. The comparer instance used to compare items in the collection. Only the Compare method is used. An array containing the sorted version of the collection. Creates a sorted version of a collection. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. A supplied Comparison<T> delegate is used to compare the items in the collection. Values are compared by using the IComparable<T> interfaces implementation on the type T. The collection to sort. The comparison delegate used to compare items in the collection. An array containing the sorted version of the collection. Sorts a list or array in place. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. Values are compared by using the IComparable<T> interfaces implementation on the type T. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. Sorts a list or array in place. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. A supplied IComparer<T> is used to compare the items in the list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. The comparer instance used to compare items in the collection. Only the Compare method is used. Sorts a list or array in place. The sort is stable, which means that if items X and Y are equal, and X precedes Y in the unsorted collection, X will precede Y is the sorted collection. A supplied Comparison<T> delegate is used to compare the items in the list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to sort. The comparison delegate used to compare items in the collection. Searches a sorted list for an item via binary search. The list must be sorted by the natural ordering of the type (it's implementation of IComparable<T>). The sorted list to search. The item to search for. Returns the first index at which the item can be found. If the return value is zero, indicating that was not present in the list, then this returns the index at which could be inserted to maintain the sorted order of the list. The number of items equal to that appear in the list. Searches a sorted list for an item via binary search. The list must be sorted by the ordering in the passed instance of IComparer<T>. The sorted list to search. The item to search for. The comparer instance used to sort the list. Only the Compare method is used. Returns the first index at which the item can be found. If the return value is zero, indicating that was not present in the list, then this returns the index at which could be inserted to maintain the sorted order of the list. The number of items equal to that appear in the list. Searches a sorted list for an item via binary search. The list must be sorted by the ordering in the passed Comparison<T> delegate. The sorted list to search. The item to search for. The comparison delegate used to sort the list. Returns the first index at which the item can be found. If the return value is zero, indicating that was not present in the list, then this returns the index at which could be inserted to maintain the sorted order of the list. The number of items equal to that appear in the list. Merge several sorted collections into a single sorted collection. Each input collection must be sorted by the natural ordering of the type (it's implementation of IComparable<T>). The merging is stable; equal items maintain their ordering, and equal items in different collections are placed in the order of the collections. The set of collections to merge. In many languages, this parameter can be specified as several individual parameters. An IEnumerable<T> that enumerates all the items in all the collections in sorted order. Merge several sorted collections into a single sorted collection. Each input collection must be sorted by the ordering in the passed instance of IComparer<T>. The merging is stable; equal items maintain their ordering, and equal items in different collections are placed in the order of the collections. The set of collections to merge. In many languages, this parameter can be specified as several individual parameters. The comparer instance used to sort the list. Only the Compare method is used. An IEnumerable<T> that enumerates all the items in all the collections in sorted order. Merge several sorted collections into a single sorted collection. Each input collection must be sorted by the ordering in the passed Comparison<T> delegate. The merging is stable; equal items maintain their ordering, and equal items in different collections are placed in the order of the collections. The set of collections to merge. In many languages, this parameter can be specified as several individual parameters. The comparison delegate used to sort the collections. An IEnumerable<T> that enumerates all the items in all the collections in sorted order. Performs a lexicographical comparison of two sequences of values. A lexicographical comparison compares corresponding pairs of elements from two sequences in order. If the first element of sequence1 is less than the first element of sequence2, then the comparison ends and the first sequence is lexicographically less than the second. If the first elements of each sequence are equal, then the comparison proceeds to the second element of each sequence. If one sequence is shorter than the other, but corresponding elements are all equal, then the shorter sequence is considered less than the longer one. T must implement either IComparable<T> and this implementation is used to compare the items. Types of items to compare. This type must implement IComparable<T> to allow items to be compared. The first sequence to compare. The second sequence to compare. Less than zero if is lexicographically less than . Greater than zero if is lexicographically greater than . Zero if is equal to . T does not implement IComparable<T> or IComparable. Performs a lexicographical comparison of two sequences of values, using a supplied comparison delegate. A lexicographical comparison compares corresponding pairs of elements from two sequences in order. If the first element of sequence1 is less than the first element of sequence2, then the comparison ends and the first sequence is lexicographically less than the second. If the first elements of each sequence are equal, then the comparison proceeds to the second element of each sequence. If one sequence is shorter than the other, but corresponding elements are all equal, then the shorter sequence is considered less than the longer one. Types of items to compare. The first sequence to compare. The second sequence to compare. The IComparison<T> delegate to compare items. Only the Compare member function of this interface is called. Less than zero if is lexicographically less than . Greater than zero if is lexicographically greater than . Zero if is equal to . Performs a lexicographical comparison of two sequences of values, using a supplied comparer interface. A lexicographical comparison compares corresponding pairs of elements from two sequences in order. If the first element of sequence1 is less than the first element of sequence2, then the comparison ends and the first sequence is lexicographically less than the second. If the first elements of each sequence are equal, then the comparison proceeds to the second element of each sequence. If one sequence is shorter than the other, but corresponding elements are all equal, then the shorter sequence is considered less than the longer one. Types of items to compare. The first sequence to compare. The second sequence to compare. The IComparer<T> used to compare items. Only the Compare member function of this interface is called. Less than zero if is lexicographically less than . Greater than zero if is lexicographically greater than . Zero if is equal to . , , or is null. Creates an IComparer instance that can be used for comparing ordered sequences of type T; that is IEnumerable<Tgt;. This comparer can be used for collections or algorithms that use sequences of T as an item type. The Lexicographical ordered of sequences is for comparison. T must implement either IComparable<T> and this implementation is used to compare the items. At IComparer<IEnumerable<T>> that compares sequences of T. Creates an IComparer instance that can be used for comparing ordered sequences of type T; that is IEnumerable<Tgt;. This comparer can be uses for collections or algorithms that use sequences of T as an item type. The Lexicographics ordered of sequences is for comparison. A comparer instance used to compare individual items of type T. At IComparer<IEnumerable<T>> that compares sequences of T. Creates an IComparer instance that can be used for comparing ordered sequences of type T; that is IEnumerable<Tgt;. This comparer can be uses for collections or algorithms that use sequences of T as an item type. The Lexicographics ordered of sequences is for comparison. A comparison delegate used to compare individual items of type T. At IComparer<IEnumerable<T>> that compares sequences of T. Reverses the order of comparison of an IComparer<T>. The resulting comparer can be used, for example, to sort a collection in descending order. Equality and hash codes are unchanged. The type of items thta are being compared. The comparer to reverse. An IComparer<T> that compares items in the reverse order of . is null. Gets an IEqualityComparer<T> instance that can be used to compare objects of type T for object identity only. Two objects compare equal only if they are references to the same object. An IEqualityComparer<T> instance for identity comparison. Reverses the order of comparison of an Comparison<T>. The resulting comparison can be used, for example, to sort a collection in descending order. The type of items that are being compared. The comparison to reverse. A Comparison<T> that compares items in the reverse order of . is null. Given a comparison delegate that compares two items of type T, gets an IComparer<T> instance that performs the same comparison. The comparison delegate to use. An IComparer<T> that performs the same comparing operation as . Given in IComparer<T> instenace that comparers two items from type T, gets a Comparison delegate that performs the same comparison. The IComparer<T> instance to use. A Comparison<T> delegate that performans the same comparing operation as . Gets an IEqualityComparer<IEnumerable<T>> implementation that can be used to compare collections of elements (of type T). Two collections of T's are equal if they have the same number of items, and corresponding items are equal, considered in order. This is the same notion of equality as in Algorithms.EqualCollections, but encapsulated in an IEqualityComparer<IEnumerable<T>> implementation. The following code creates a Dictionary where the keys are a collection of strings. Dictionary<IEnumerable<string>, int> = new Dictionary<IEnumerable<string>, int>(Algorithms.GetCollectionEqualityComparer<string>()); IEqualityComparer<IEnumerable<T>> implementation suitable for comparing collections of T for equality. Gets an IEqualityComparer<IEnumerable<T>> implementation that can be used to compare collections of elements (of type T). Two collections of T's are equal if they have the same number of items, and corresponding items are equal, considered in order. This is the same notion of equality as in Algorithms.EqualCollections, but encapsulated in an IEqualityComparer<IEnumerable<T>> implementation. An IEqualityComparer<T> is used to determine if individual T's are equal The following code creates a Dictionary where the keys are a collection of strings, compared in a case-insensitive way Dictionary<IEnumerable<string>, int> = new Dictionary<IEnumerable<string>, int>(Algorithms.GetCollectionEqualityComparer<string>(StringComparer.CurrentCultureIgnoreCase)); An IEqualityComparer<T> implementation used to compare individual T's. IEqualityComparer<IEnumerable<T>> implementation suitable for comparing collections of T for equality. Gets an IEqualityComparer<IEnumerable<T>> implementation that can be used to compare collections of elements (of type T). Two collections of T's are equal if they have the same number of items, and corresponding items are equal, without regard to order. This is the same notion of equality as in Algorithms.EqualSets, but encapsulated in an IEqualityComparer<IEnumerable<T>> implementation. An IEqualityComparer<T> is used to determine if individual T's are equal The following code creates a Dictionary where the keys are a set of strings, without regard to order Dictionary<IEnumerable<string>, int> = new Dictionary<IEnumerable<string>, int>(Algorithms.GetSetEqualityComparer<string>(StringComparer.CurrentCultureIgnoreCase)); IEqualityComparer<IEnumerable<T>> implementation suitable for comparing collections of T for equality, without regard to order. Gets an IEqualityComparer<IEnumerable<T>> implementation that can be used to compare collections of elements (of type T). Two collections of T's are equal if they have the same number of items, and corresponding items are equal, without regard to order. This is the same notion of equality as in Algorithms.EqualSets, but encapsulated in an IEqualityComparer<IEnumerable<T>> implementation. The following code creates a Dictionary where the keys are a set of strings, without regard to order Dictionary<IEnumerable<string>, int> = new Dictionary<IEnumerable<string>, int>(Algorithms.GetSetEqualityComparer<string>()); An IEqualityComparer<T> implementation used to compare individual T's. IEqualityComparer<IEnumerable<T>> implementation suitable for comparing collections of T for equality, without regard to order. Determines if a collection contains any item that satisfies the condition defined by . The collection to check all the items in. A delegate that defines the condition to check for. True if the collection contains one or more items that satisfy the condition defined by . False if the collection does not contain an item that satisfies . Determines if all of the items in the collection satisfy the condition defined by . The collection to check all the items in. A delegate that defines the condition to check for. True if all of the items in the collection satisfy the condition defined by , or if the collection is empty. False if one or more items in the collection do not satisfy . Counts the number of items in the collection that satisfy the condition defined by . The collection to count items in. A delegate that defines the condition to check for. The number of items in the collection that satisfy . Removes all the items in the collection that satisfy the condition defined by . If the collection if an array or implements IList<T>, an efficient algorithm that compacts items is used. If not, then ICollection<T>.Remove is used to remove items from the collection. If the collection is an array or fixed-size list, the non-removed elements are placed, in order, at the beginning of the list, and the remaining list items are filled with a default value (0 or null). The collection to check all the items in. A delegate that defines the condition to check for. Returns a collection of the items that were removed. This collection contains the items in the same order that they orginally appeared in . Convert a collection of items by applying a delegate to each item in the collection. The resulting collection contains the result of applying to each item in , in order. The type of items in the collection to convert. The type each item is being converted to. The collection of item being converted. A delegate to the method to call, passing each item in . The resulting collection from applying to each item in , in order. or is null. Creates a delegate that converts keys to values by used a dictionary to map values. Keys that a not present in the dictionary are converted to the default value (zero or null). This delegate can be used as a parameter in Convert or ConvertAll methods to convert entire collections. The dictionary used to perform the conversion. A delegate to a method that converts keys to values. Creates a delegate that converts keys to values by used a dictionary to map values. Keys that a not present in the dictionary are converted to a supplied default value. This delegate can be used as a parameter in Convert or ConvertAll methods to convert entire collections. The dictionary used to perform the conversion. The result of the conversion for keys that are not present in the dictionary. A delegate to a method that converts keys to values. is null. Performs the specified action on each item in a collection. The collection to process. An Action delegate which is invoked for each item in . Partition a list or array based on a predicate. After partitioning, all items for which the predicate returned true precede all items for which the predicate returned false. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to partition. A delegate that defines the partitioning condition. The index of the first item in the second half of the partition; i.e., the first item for which returned false. If the predicate was true for all items in the list, list.Count is returned. Partition a list or array based on a predicate. After partitioning, all items for which the predicate returned true precede all items for which the predicate returned false. The partition is stable, which means that if items X and Y have the same result from the predicate, and X precedes Y in the original list, X will precede Y in the partitioned list. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to partition. A delegate that defines the partitioning condition. The index of the first item in the second half of the partition; i.e., the first item for which returned false. If the predicate was true for all items in the list, list.Count is returned. Concatenates all the items from several collections. The collections need not be of the same type, but must have the same item type. The set of collections to concatenate. In many languages, this parameter can be specified as several individual parameters. An IEnumerable that enumerates all the items in each of the collections, in order. Determines if the two collections contain equal items in the same order. The two collections do not need to be of the same type; it is permissible to compare an array and an OrderedBag, for instance. The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The type of items in the collections. The first collection to compare. The second collection to compare. True if the collections have equal items in the same order. If both collections are empty, true is returned. Determines if the two collections contain equal items in the same order. The passed instance of IEqualityComparer<T> is used for determining if two items are equal. The type of items in the collections. The first collection to compare. The second collection to compare. The IEqualityComparer<T> used to compare items for equality. Only the Equals member function of this interface is called. True if the collections have equal items in the same order. If both collections are empty, true is returned. , , or is null. Determines if the two collections contain "equal" items in the same order. The passed BinaryPredicate is used to determine if two items are "equal". Since an arbitrary BinaryPredicate is passed to this function, what is being tested for need not be equality. For example, the following code determines if each integer in list1 is less than or equal to the corresponding integer in list2. List<int> list1, list2; if (EqualCollections(list1, list2, delegate(int x, int y) { return x <= y; }) { // the check is true... } The type of items in the collections. The first collection to compare. The second collection to compare. The BinaryPredicate used to compare items for "equality". This predicate can compute any relation between two items; it need not represent equality or an equivalence relation. True if returns true for each corresponding pair of items in the two collections. If both collections are empty, true is returned. , , or is null. Create an array with the items in a collection. If implements ICollection<T>T, then ICollection<T>.CopyTo() is used to fill the array. Otherwise, the IEnumerable<T>.GetEnumerator() is used to fill the array. Element type of the collection. Collection to create array from. An array with the items from the collection, in enumeration order. is null. Count the number of items in an IEnumerable<T> collection. If a more specific collection type is being used, it is more efficient to use the Count property, if one is provided. If the collection implements ICollection<T>, this method simply returns ICollection<T>.Count. Otherwise, it enumerates all items and counts them. The collection to count items in. The number of items in the collection. is null. Counts the number of items in the collection that are equal to . The default sense of equality for T is used, as defined by T's implementation of IComparable<T>.Equals or object.Equals. The collection to count items in. The item to compare to. The number of items in the collection that are equal to . Counts the number of items in the collection that are equal to . The collection to count items in. The item to compare to. The comparer to use to determine if two items are equal. Only the Equals member function will be called. The number of items in the collection that are equal to . or is null. Creates an IEnumerator that enumerates a given item times. The following creates a list consisting of 1000 copies of the double 1.0. List<double> list = new List<double>(Algorithms.NCopiesOf(1000, 1.0)); The number of times to enumerate the item. The item that should occur in the enumeration. An IEnumerable<T> that yields copies of . The argument is less than zero. Replaces each item in a list with a given value. The list does not change in size. The type of items in the list. The list to modify. The value to fill with. is a read-only list. is null. Replaces each item in a array with a given value. The array to modify. The value to fill with. is null. Replaces each item in a part of a list with a given value. The type of items in the list. The list to modify. The index at which to start filling. The first index in the list has index 0. The number of items to fill. The value to fill with. is a read-only list. or is negative, or + is greater than .Count. is null. Replaces each item in a part of a array with a given value. The array to modify. The index at which to start filling. The first index in the array has index 0. The number of items to fill. The value to fill with. or is negative, or + is greater than .Length. is null. Copies all of the items from the collection to the list , starting at the index . If necessary, the size of the destination list is expanded. The collection that provide the source items. The list to store the items into. The index to begin copying items to. is negative or greater than .Count. or is null. Copies all of the items from the collection to the array , starting at the index . The collection that provide the source items. The array to store the items into. The index to begin copying items to. is negative or greater than .Length. or is null. The collection has more items than will fit into the array. In this case, the array has been filled with as many items as fit before the exception is thrown. Copies at most items from the collection to the list , starting at the index . If necessary, the size of the destination list is expanded. The source collection must not be the destination list or part thereof. The collection that provide the source items. The list to store the items into. The index to begin copying items to. The maximum number of items to copy. is negative or greater than .Count is negative. or is null. Copies at most items from the collection to the array , starting at the index . The source collection must not be the destination array or part thereof. The collection that provide the source items. The array to store the items into. The index to begin copying items to. The maximum number of items to copy. The array must be large enought to fit this number of items. is negative or greater than .Length. is negative or + is greater than .Length. or is null. Copies items from the list , starting at the index , to the list , starting at the index . If necessary, the size of the destination list is expanded. The source and destination lists may be the same. The collection that provide the source items. The index within to begin copying items from. The list to store the items into. The index within to begin copying items to. The maximum number of items to copy. is negative or greater than .Count is negative or greater than .Count is negative or too large. or is null. Copies items from the list or array , starting at the index , to the array , starting at the index . The source may be the same as the destination array. The list or array that provide the source items. The index within to begin copying items from. The array to store the items into. The index within to begin copying items to. The maximum number of items to copy. The destination array must be large enough to hold this many items. is negative or greater than .Count is negative or greater than .Length is negative or too large. or is null. Reverses a list and returns the reversed list, without changing the source list. The list to reverse. A collection that contains the items from in reverse order. is null. Reverses a list or array in place. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to reverse. is null. is read only. Rotates a list and returns the rotated list, without changing the source list. The list to rotate. The number of elements to rotate. This value can be positive or negative. For example, rotating by positive 3 means that source[3] is the first item in the returned collection. Rotating by negative 3 means that source[source.Count - 3] is the first item in the returned collection. A collection that contains the items from in rotated order. is null. Rotates a list or array in place. Although arrays cast to IList<T> are normally read-only, this method will work correctly and modify an array passed as . The list or array to rotate. The number of elements to rotate. This value can be positive or negative. For example, rotating by positive 3 means that list[3] is the first item in the resulting list. Rotating by negative 3 means that list[list.Count - 3] is the first item in the resulting list. is null. The class that is used to implement IList<T> to view a sub-range of a list. The object stores a wrapped list, and a start/count indicating a sub-range of the list. Insertion/deletions through the sub-range view cause the count to change also; insertions and deletions directly on the wrapped list do not. ListBase is an abstract class that can be used as a base class for a read-write collection that needs to implement the generic IList<T> and non-generic IList collections. The derived class needs to override the following methods: Count, Clear, Insert, RemoveAt, and the indexer. The implementation of all the other methods in IList<T> and IList are handled by ListBase. CollectionBase is a base class that can be used to more easily implement the generic ICollection<T> and non-generic ICollection interfaces. To use CollectionBase as a base class, the derived class must override the Count, GetEnumerator, Add, Clear, and Remove methods. ICollection<T>.Contains need not be implemented by the derived class, but it should be strongly considered, because the CollectionBase implementation may not be very efficient. The item type of the collection. Creates a new CollectionBase. Shows the string representation of the collection. The string representation contains a list of the items in the collection. Contained collections (except string) are expanded recursively. The string representation of the collection. Must be overridden to allow adding items to this collection.

This method is not abstract, although derived classes should always override it. It is not abstract because some derived classes may wish to reimplement Add with a different return type (typically bool). In C#, this can be accomplished with code like the following:

public class MyCollection<T>: CollectionBase<T>, ICollection<T> { public new bool Add(T item) { /* Add the item */ } void ICollection<T>.Add(T item) { Add(item); } }
Item to be added to the collection. Always throws this exception to indicated that the method must be overridden or re-implemented in the derived class.
Must be overridden to allow clearing this collection. Must be overridden to allow removing items from this collection. True if existed in the collection and was removed. False if did not exist in the collection. Determines if the collection contains a particular item. This default implementation iterates all of the items in the collection via GetEnumerator, testing each item against using IComparable<T>.Equals or Object.Equals. You should strongly consider overriding this method to provide a more efficient implementation, or if the default equality comparison is inappropriate. The item to check for in the collection. True if the collection contains , false otherwise. Copies all the items in the collection into an array. Implemented by using the enumerator returned from GetEnumerator to get all the items and copy them to the provided array. Array to copy to. Starting index in to copy to. Creates an array of the correct size, and copies all the items in the collection into the array, by calling CopyTo. An array containing all the elements in the collection, in order. Provides a read-only view of this collection. The returned ICollection<T> provides a view of the collection that prevents modifications to the collection. Use the method to provide access to the collection without allowing changes. Since the returned object is just a view, changes to the collection will be reflected in the view. An ICollection<T> that provides read-only access to the collection. Determines if the collection contains any item that satisfies the condition defined by . A delegate that defines the condition to check for. True if the collection contains one or more items that satisfy the condition defined by . False if the collection does not contain an item that satisfies . Determines if all of the items in the collection satisfy the condition defined by . A delegate that defines the condition to check for. True if all of the items in the collection satisfy the condition defined by , or if the collection is empty. False if one or more items in the collection do not satisfy . Counts the number of items in the collection that satisfy the condition defined by . A delegate that defines the condition to check for. The number of items in the collection that satisfy . Enumerates the items in the collection that satisfy the condition defined by . A delegate that defines the condition to check for. An IEnumerable<T> that enumerates the items that satisfy the condition. Removes all the items in the collection that satisfy the condition defined by . A delegate that defines the condition to check for. Returns a collection of the items that were removed, in sorted order. Performs the specified action on each item in this collection. An Action delegate which is invoked for each item in this collection. Convert this collection of items by applying a delegate to each item in the collection. The resulting enumeration contains the result of applying to each item in this collection, in order. The type each item is being converted to. A delegate to the method to call, passing each item in this collection. An IEnumerable<TOutput^gt; that enumerates the resulting collection from applying to each item in this collection in order. is null. Must be overridden to enumerate all the members of the collection. A generic IEnumerator<T> that can be used to enumerate all the items in the collection. Copies all the items in the collection into an array. Implemented by using the enumerator returned from GetEnumerator to get all the items and copy them to the provided array. Array to copy to. Starting index in to copy to. Provides an IEnumerator that can be used to iterate all the members of the collection. This implementation uses the IEnumerator<T> that was overridden by the derived classes to enumerate the members of the collection. An IEnumerator that can be used to iterate the collection. Display the contents of the collection in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). Must be overridden to provide the number of items in the collection. The number of items in the collection. Indicates whether the collection is read-only. Always returns false. Always returns false. Indicates whether the collection is synchronized. Always returns false, indicating that the collection is not synchronized. Indicates the synchronization object for this collection. Always returns this. Creates a new ListBase. This method must be overridden by the derived class to empty the list of all items. This method must be overridden by the derived class to insert a new item at the given index. The index in the list to insert the item at. After the insertion, the inserted item is located at this index. The first item in the list has index 0. The item to insert at the given index. is less than zero or greater than Count. This method must be overridden by the derived class to remove the item at the given index. The index in the list to remove the item at. The first item in the list has index 0. is less than zero or greater than or equal to Count. Enumerates all of the items in the list, in order. The item at index 0 is enumerated first, then the item at index 1, and so on. The enumerator does not check for changes made to the structure of the list. Thus, changes to the list during enumeration may cause incorrect enumeration or out of range exceptions. Consider overriding this method and adding checks for structural changes. An IEnumerator<T> that enumerates all the items in the list. Determines if the list contains any item that compares equal to . The implementation simply checks whether IndexOf(item) returns a non-negative value. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. True if the list contains an item that compares equal to . Adds an item to the end of the list. This method is equivalent to calling: Insert(Count, item) The item to add to the list. Searches the list for the first item that compares equal to . If one is found, it is removed. Otherwise, the list is unchanged. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to remove from the list. True if an item was found and removed that compared equal to . False if no such item was in the list. Copies all the items in the list, in order, to , starting at index 0. The array to copy to. This array must have a size that is greater than or equal to Count. Copies all the items in the list, in order, to , starting at . The array to copy to. This array must have a size that is greater than or equal to Count + arrayIndex. The starting index in to copy to. Copies a range of elements from the list to , starting at . The starting index in the source list of the range to copy. The array to copy to. This array must have a size that is greater than or equal to Count + arrayIndex. The starting index in to copy to. The number of items to copy. Provides a read-only view of this list. The returned IList<T> provides a view of the list that prevents modifications to the list. Use the method to provide access to the list without allowing changes. Since the returned object is just a view, changes to the list will be reflected in the view. An IList<T> that provides read-only access to the list. Finds the first item in the list that satisfies the condition defined by . If no item matches the condition, than the default value for T (null or all-zero) is returned. If the default value for T (null or all-zero) matches the condition defined by , and the list might contain the default value, then it is impossible to distinguish the different between finding the default value and not finding any item. To distinguish these cases, use . A delegate that defined the condition to check for. The first item that satisfies the condition . If no item satisfies that condition, the default value for T is returned. Finds the first item in the list that satisfies the condition defined by . A delegate that defines the condition to check for. If true is returned, this parameter receives the first item in the list that satifies the condition defined by . True if an item that satisfies the condition was found. False if no item in the list satisfies that condition. Finds the last item in the list that satisfies the condition defined by . If no item matches the condition, than the default value for T (null or all-zero) is returned. If the default value for T (null or all-zero) matches the condition defined by , and the list might contain the default value, then it is impossible to distinguish the different between finding the default value and not finding any item. To distinguish these cases, use . A delegate that defined the condition to check for. The last item that satisfies the condition . If no item satisfies that condition, the default value for T is returned. Finds the last item in the list that satisfies the condition defined by . A delegate that defines the condition to check for. If true is returned, this parameter receives the last item in the list that satifies the condition defined by . True if an item that satisfies the condition was found. False if no item in the list satisfies that condition. Finds the index of the first item in the list that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The index of the first item that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item, in the range of items extending from to the end, that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The starting index of the range to check. The index of the first item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item, in the range of items starting from , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The starting index of the range to check. The number of items in range to check. The index of the first item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item in the list that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The index of the last item that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item, in the range of items extending from the beginning of the list to , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The ending index of the range to check. The index of the last item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item, in the range of items ending at , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The ending index of the range to check. The number of items in range to check. The index of the last item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item in the list that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The index of the first item in the list that that is equal to . If no item is equal to , -1 is returned. Finds the index of the first item, in the range of items extending from to the end, that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The starting index of the range to check. The index of the first item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the first item, in the range of items starting from , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The starting index of the range to check. The number of items in range to check. The index of the first item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item in the list that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The index of the last item in the list that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item, in the range of items extending from the beginning of the list to , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The ending index of the range to check. The index of the last item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item, in the range of items ending at , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search for. The ending index of the range to check. The number of items in range to check. The index of the last item in the given range that that is equal to . If no item is equal to , -1 is returned. Returns a view onto a sub-range of this list. Items are not copied; the returned IList<T> is simply a different view onto the same underlying items. Changes to this list are reflected in the view, and vice versa. Insertions and deletions in the view change the size of the view, but insertions and deletions in the underlying list do not. This method can be used to apply an algorithm to a portion of a list. For example: Algorithms.ReverseInPlace(deque.Range(3, 6)) will reverse the 6 items beginning at index 3. The starting index of the view. The number of items in the view. A list that is a view onto the given sub-part of this list. or is negative. + is greater than the size of the list. Convert the given parameter to T. Throw an ArgumentException if it isn't. parameter name parameter value Adds an item to the end of the list. This method is equivalent to calling: Insert(Count, item) The item to add to the list. cannot be converted to T. Removes all the items from the list, resulting in an empty list. Determines if the list contains any item that compares equal to . Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. Find the first occurrence of an item equal to in the list, and returns the index of that item. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. The index of , or -1 if no item in the list compares equal to . Insert a new item at the given index. The index in the list to insert the item at. After the insertion, the inserted item is located at this index. The first item in the list has index 0. The item to insert at the given index. is less than zero or greater than Count. cannot be converted to T. Searches the list for the first item that compares equal to . If one is found, it is removed. Otherwise, the list is unchanged. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to remove from the list. cannot be converted to T. Removes the item at the given index. The index in the list to remove the item at. The first item in the list has index 0. is less than zero or greater than or equal to Count. The property must be overridden by the derived class to return the number of items in the list. The number of items in the list. The indexer must be overridden by the derived class to get and set values of the list at a particular index. The index in the list to get or set an item at. The first item in the list has index 0, and the last has index Count-1. The item at the given index. is less than zero or greater than or equal to Count. Returns whether the list is a fixed size. This implementation always returns false. Alway false, indicating that the list is not fixed size. Returns whether the list is read only. This implementation returns the value from ICollection<T>.IsReadOnly, which is by default, false. By default, false, indicating that the list is not read only. Gets or sets the value at a particular index in the list. The index in the list to get or set an item at. The first item in the list has index 0, and the last has index Count-1. The item at the given index. is less than zero or greater than or equal to Count. cannot be converted to T. Create a sub-range view object on the indicate part of the list. List to wrap. The start index of the view in the wrapped list. The number of items in the view. The class that is used to implement IList<T> to view a sub-range of an array. The object stores a wrapped array, and a start/count indicating a sub-range of the array. Insertion/deletions through the sub-range view cause the count to change up to the size of the underlying array. Elements fall off the end of the underlying array. Create a sub-range view object on the indicate part of the array. Array to wrap. The start index of the view in the wrapped list. The number of items in the view. The read-only ICollection<T> implementation that is used by the ReadOnly method. Methods that modify the collection throw a NotSupportedException, methods that don't modify are fowarded through to the wrapped collection. Create a ReadOnlyCollection wrapped around the given collection. Collection to wrap. Throws an NotSupportedException stating that this collection cannot be modified. The read-only IList<T> implementation that is used by the ReadOnly method. Methods that modify the list throw a NotSupportedException, methods that don't modify are fowarded through to the wrapped list. Create a ReadOnlyList wrapped around the given list. List to wrap. Throws an NotSupportedException stating that this collection cannot be modified. The private class that implements a read-only wrapped for IDictionary <TKey,TValue>. Create a read-only dictionary wrapped around the given dictionary. The IDictionary<TKey,TValue> to wrap. Throws an NotSupportedException stating that this collection cannot be modified. The class that provides a typed IEnumerator<T> view onto an untyped IEnumerator interface. Create a typed IEnumerator<T> view onto an untyped IEnumerator interface IEnumerator to wrap. The class that provides a typed IEnumerable<T> view onto an untyped IEnumerable interface. Create a typed IEnumerable<T> view onto an untyped IEnumerable interface. IEnumerable interface to wrap. The class that provides a typed ICollection<T> view onto an untyped ICollection interface. The ICollection<T> is read-only. Create a typed ICollection<T> view onto an untyped ICollection interface. ICollection interface to wrap. Throws an NotSupportedException stating that this collection cannot be modified. The class used to create a typed IList<T> view onto an untype IList interface. Create a typed IList<T> view onto an untype IList interface. The IList to wrap. The class that is used to provide an untyped ICollection view onto a typed ICollection<T> interface. Create an untyped ICollection view onto a typed ICollection<T> interface. The ICollection<T> to wrap. The class that implements a non-generic IList wrapper around a generic IList<T> interface. Create a non-generic IList wrapper around a generic IList<T> interface. The IList<T> interface to wrap. Convert the given parameter to T. Throw an ArgumentException if it isn't. parameter name parameter value The class that is used to implement IList<T> to view an array in a read-write way. Insertions cause the last item in the array to fall off, deletions replace the last item with the default value. Create a list wrapper object on an array. Array to wrap. Return true, to indicate that the list is fixed size. A private class used by the LexicographicalComparer method to compare sequences (IEnumerable) of T by there Lexicographical ordering. Creates a new instance that comparer sequences of T by their lexicographical ordered. The IComparer used to compare individual items of type T. An IComparer instance that can be used to reverse the sense of a wrapped IComparer instance. The comparer to reverse. A class, implementing IEqualityComparer<T>, that compares objects for object identity only. Only Equals and GetHashCode can be used; this implementation is not appropriate for ordering. A private class used to implement GetCollectionEqualityComparer(). This class implements IEqualityComparer<IEnumerable<T>gt; to compare two enumerables for equality, where order is significant. A private class used to implement GetSetEqualityComparer(). This class implements IEqualityComparer<IEnumerable<T>gt; to compare two enumerables for equality, where order is not significant. Bag<T> is a collection that contains items of type T. Unlike a Set, duplicate items (items that compare equal to each other) are allowed in an Bag.

The items are compared in one of two ways. If T implements IComparable<T> then the Equals method of that interface will be used to compare items, otherwise the Equals method from Object will be used. Alternatively, an instance of IComparer<T> can be passed to the constructor to use to compare items.

Bag is implemented as a hash table. Inserting, deleting, and looking up an an element all are done in approximately constant time, regardless of the number of items in the bag.

When multiple equal items are stored in the bag, they are stored as a representative item and a count. If equal items can be distinguished, this may be noticable. For example, if a case-insensitive comparer is used with a Bag<string>, and both "hello", and "HELLO" are added to the bag, then the bag will appear to contain two copies of "hello" (the representative item).

is similar, but uses comparison instead of hashing, maintain the items in sorted order, and stores distinct copies of items that compare equal.

Helper function to create a new KeyValuePair struct with an item and a count. The item. The number of appearances. A new KeyValuePair. Helper function to create a new KeyValuePair struct with a count of zero. The item. A new KeyValuePair. Creates a new Bag. Items that are null are permitted. Creates a new Bag. The Equals and GetHashCode methods of the passed comparison object will be used to compare items in this bag for equality. An instance of IEqualityComparer<T> that will be used to compare items. Creates a new Bag. The bag is initialized with all the items in the given collection. Items that are null are permitted. A collection with items to be placed into the Bag. Creates a new Bag. The Equals and GetHashCode methods of the passed comparison object will be used to compare items in this bag. The bag is initialized with all the items in the given collection. A collection with items to be placed into the Bag. An instance of IEqualityComparer<T> that will be used to compare items. Creates a new Bag given a comparer and a hash that contains the data. Used internally for Clone. IEqualityComparer for the bag. IEqualityComparer for the key. Data for the bag. Size of the bag. Makes a shallow clone of this bag; i.e., if items of the bag are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the bag takes time O(N), where N is the number of items in the bag. The cloned bag. Makes a shallow clone of this bag; i.e., if items of the bag are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the bag takes time O(N), where N is the number of unquie items in the bag. The cloned bag. Makes a deep clone of this bag. A new bag is created with a clone of each element of this bag, by calling ICloneable.Clone on each element. If T is a value type, then each element is copied as if by simple assignment. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the bag takes time O(N log N), where N is the number of items in the bag. The cloned bag. T is a reference type that does not implement ICloneable. Returns the number of copies of in the bag. NumberOfCopies() takes approximately constant time, no matter how many items are stored in the bag. The item to search for in the bag. The number of items in the bag that compare equal to . Returns the representative item stored in the bag that is equal to the provided item. Also returns the number of copies of the item in the bag. Item to find in the bag. If one or more items equal to are present in the bag, returns the representative item. If no items equal to are stored in the bag, returns . The number of items equal to stored in the bag. Returns an enumerator that enumerates all the items in the bag. If an item is present multiple times in the bag, the representative item is yielded by the enumerator multiple times. The order of enumeration is haphazard and may change.

Typically, this method is not called directly. Instead the "foreach" statement is used to enumerate the items, which uses this method implicitly.

If an item is added to or deleted from the bag while it is being enumerated, then the enumeration will end with an InvalidOperationException.

Enumeration all the items in the bag takes time O(N), where N is the number of items in the bag.

An enumerator for enumerating all the items in the Bag.
Determines if this bag contains an item equal to . The bag is not changed. Searching the bag for an item takes time O(log N), where N is the number of items in the bag. The item to search for. True if the bag contains . False if the bag does not contain . Enumerates all the items in the bag, but enumerates equal items just once, even if they occur multiple times in the bag. If the bag is changed while items are being enumerated, the enumeration will terminate with an InvalidOperationException. An IEnumerable<T> that enumerates the unique items. Adds a new item to the bag. Since bags can contain duplicate items, the item is added even if the bag already contains an item equal to . In this case, the count of items for the representative item is increased by one, but the existing represetative item is unchanged. Adding an item takes approximately constant time, regardless of the number of items in the bag. The item to add to the bag. Adds a new item to the bag. Since bags can contain duplicate items, the item is added even if the bag already contains an item equal to . In this case (unlike Add), the new item becomes the representative item. Adding an item takes approximately constant time, regardless of the number of items in the bag. The item to add to the bag. Changes the number of copies of an existing item in the bag, or adds the indicated number of copies of the item to the bag. Changing the number of copies takes approximately constant time, regardless of the number of items in the bag. The item to change the number of copies of. This may or may not already be present in the bag. The new number of copies of the item. Adds all the items in to the bag. Adding the collection takes time O(M log N), where N is the number of items in the bag, and M is the number of items in . A collection of items to add to the bag. Searches the bag for one item equal to , and if found, removes it from the bag. If not found, the bag is unchanged. Equality between items is determined by the comparison instance or delegate used to create the bag. Removing an item from the bag takes approximated constant time, regardless of the number of items in the bag. The item to remove. True if was found and removed. False if was not in the bag. Searches the bag for all items equal to , and removes all of them from the bag. If not found, the bag is unchanged. Equality between items is determined by the comparer instance used to create the bag. RemoveAllCopies() takes time O(M log N), where N is the total number of items in the bag, and M is the number of items equal to . The item to remove. The number of copies of that were found and removed. Removes all the items in from the bag. Items that are not present in the bag are ignored. Equality between items is determined by the comparer instance used to create the bag. Removing the collection takes time O(M), where M is the number of items in . A collection of items to remove from the bag. The number of items removed from the bag. is null. Removes all items from the bag. Clearing the bag takes a constant amount of time, regardless of the number of items in it. Check that this bag and another bag were created with the same comparison mechanism. Throws exception if not compatible. Other bag to check comparision mechanism. If otherBag and this bag don't use the same method for comparing items. Determines if this bag is equal to another bag. This bag is equal to if they contain the same number of of copies of equal elements. IsSupersetOf is computed in time O(N), where N is the number of unique items in this bag. Bag to compare to True if this bag is equal to , false otherwise. This bag and don't use the same method for comparing items. Determines if this bag is a superset of another bag. Neither bag is modified. This bag is a superset of if every element in is also in this bag, at least the same number of times. IsSupersetOf is computed in time O(M), where M is the number of unique items in . Bag to compare to. True if this is a superset of . This bag and don't use the same method for comparing items. Determines if this bag is a proper superset of another bag. Neither bag is modified. This bag is a proper superset of if every element in is also in this bag, at least the same number of times. Additional, this bag must have strictly more items than . IsProperSupersetOf is computed in time O(M), where M is the number of unique items in . Set to compare to. True if this is a proper superset of . This bag and don't use the same method for comparing items. Determines if this bag is a subset of another ba11 items in this bag. Bag to compare to. True if this is a subset of . This bag and don't use the same method for comparing items. Determines if this bag is a proper subset of another bag. Neither bag is modified. This bag is a subset of if every element in this bag is also in , at least the same number of times. Additional, this bag must have strictly fewer items than . IsProperSubsetOf is computed in time O(N), where N is the number of unique items in this bag. Bag to compare to. True if this is a proper subset of . This bag and don't use the same method for comparing items. Determines if this bag is disjoint from another bag. Two bags are disjoint if no item from one set is equal to any item in the other bag. The answer is computed in time O(N), where N is the size of the smaller set. Bag to check disjointness with. True if the two bags are disjoint, false otherwise. This bag and don't use the same method for comparing items. Computes the union of this bag with another bag. The union of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the union contains the item Maximum(X,Y) times. This bag receives the union of the two bags, the other bag is unchanged. The union of two bags is computed in time O(M+N), where M and N are the size of the two bags. Bag to union with. This bag and don't use the same method for comparing items. Computes the union of this bag with another bag. The union of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the union contains the item Maximum(X,Y) times. A new bag is created with the union of the bags and is returned. This bag and the other bag are unchanged. The union of two bags is computed in time O(M+N), where M and N are the size of the two bags. Bag to union with. The union of the two bags. This bag and don't use the same method for comparing items. Computes the sum of this bag with another bag. The sum of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item (X+Y) times. This bag receives the sum of the two bags, the other bag is unchanged. The sum of two bags is computed in time O(M), where M is the size of the other bag.. Bag to sum with. This bag and don't use the same method for comparing items. Computes the sum of this bag with another bag. he sum of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item (X+Y) times. A new bag is created with the sum of the bags and is returned. This bag and the other bag are unchanged. The sum of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to sum with. The sum of the two bags. This bag and don't use the same method for comparing items. Computes the intersection of this bag with another bag. The intersection of two bags is all items that appear in both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item Minimum(X,Y) times. This bag receives the intersection of the two bags, the other bag is unchanged. When equal items appear in both bags, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two bags is computed in time O(N), where N is the size of the smaller bag. Bag to intersection with. This bag and don't use the same method for comparing items. Computes the intersection of this bag with another bag. The intersection of two bags is all items that appear in both of the bags. If an item appears X times in one bag, and Y times in the other bag, the intersection contains the item Minimum(X,Y) times. A new bag is created with the intersection of the bags and is returned. This bag and the other bag are unchanged. When equal items appear in both bags, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two bags is computed in time O(N), where N is the size of the smaller bag. Bag to intersection with. The intersection of the two bags. This bag and don't use the same method for comparing items. Computes the difference of this bag with another bag. The difference of these two bags is all items that appear in this bag, but not in . If an item appears X times in this bag, and Y times in the other bag, the difference contains the item X - Y times (zero times if Y >= X). This bag receives the difference of the two bags; the other bag is unchanged. The difference of two bags is computed in time O(M), where M is the size of the other bag. Bag to difference with. This bag and don't use the same method for comparing items. Computes the difference of this bag with another bag. The difference of these two bags is all items that appear in this bag, but not in . If an item appears X times in this bag, and Y times in the other bag, the difference contains the item X - Y times (zero times if Y >= X). A new bag is created with the difference of the bags and is returned. This bag and the other bag are unchanged. The difference of two bags is computed in time O(M + N), where M and N are the size of the two bags. Bag to difference with. The difference of the two bags. This bag and don't use the same method for comparing items. Computes the symmetric difference of this bag with another bag. The symmetric difference of two bags is all items that appear in either of the bags, but not both. If an item appears X times in one bag, and Y times in the other bag, the symmetric difference contains the item AbsoluteValue(X - Y) times. This bag receives the symmetric difference of the two bags; the other bag is unchanged. The symmetric difference of two bags is computed in time O(M + N), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to symmetric difference with. This bag and don't use the same method for comparing items. Computes the symmetric difference of this bag with another bag. The symmetric difference of two bags is all items that appear in either of the bags, but not both. If an item appears X times in one bag, and Y times in the other bag, the symmetric difference contains the item AbsoluteValue(X - Y) times. A new bag is created with the symmetric difference of the bags and is returned. This bag and the other bag are unchanged. The symmetric difference of two bags is computed in time O(M + N), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to symmetric difference with. The symmetric difference of the two bags. This bag and don't use the same method for comparing items. Returns the IEqualityComparer<T> used to compare items in this bag. If the bag was created using a comparer, that comparer is returned. Otherwise the default comparer for T (EqualityComparer<T>.Default) is returned. Returns the number of items in the bag. The size of the bag is returned in constant time. The number of items in the bag. The Deque class implements a type of list known as a Double Ended Queue. A Deque is quite similar to a List, in that items have indices (starting at 0), and the item at any index can be efficiently retrieved. The difference between a List and a Deque lies in the efficiency of inserting elements at the beginning. In a List, items can be efficiently added to the end, but inserting an item at the beginning of the List is slow, taking time proportional to the size of the List. In a Deque, items can be added to the beginning or end equally efficiently, regardless of the number of items in the Deque. As a trade-off for this increased flexibility, Deque is somewhat slower than List (but still constant time) when being indexed to get or retrieve elements. The Deque class can also be used as a more flexible alternative to the Queue and Stack classes. Deque is as efficient as Queue and Stack for adding or removing items, but is more flexible: it allows access to all items in the queue, and allows adding or removing from either end. Deque is implemented as a ring buffer, which is grown as necessary. The size of the buffer is doubled whenever the existing capacity is too small to hold all the elements. The type of items stored in the Deque. Must be called whenever there is a structural change in the tree. Causes changeStamp to be changed, which causes any in-progress enumerations to throw exceptions. Checks the given stamp against the current change stamp. If different, the collection has changed during enumeration and an InvalidOperationException must be thrown changeStamp at the start of the enumeration. Create a new Deque that is initially empty. Create a new Deque initialized with the items from the passed collection, in order. A collection of items to initialize the Deque with. Copies all the items in the Deque into an array. Array to copy to. Starting index in to copy to. Trims the amount of memory used by the Deque by changing the Capacity to be equal to Count. If no more items will be added to the Deque, calling TrimToSize will reduce the amount of memory used by the Deque. Removes all items from the Deque. Clearing the Deque takes a small constant amount of time, regardless of how many items are currently in the Deque. Enumerates all of the items in the list, in order. The item at index 0 is enumerated first, then the item at index 1, and so on. If the items are added to or removed from the Deque during enumeration, the enumeration ends with an InvalidOperationException. An IEnumerator<T> that enumerates all the items in the list. The Deque has an item added or deleted during the enumeration. Creates the initial buffer and initialized the Deque to contain one initial item. First and only item for the Deque. Inserts a new item at the given index in the Deque. All items at indexes equal to or greater than move up one index in the Deque. The amount of time to insert an item in the Deque is proportional to the distance of index from the closest end of the Deque: O(Min(, Count - )). Thus, inserting an item at the front or end of the Deque is always fast; the middle of of the Deque is the slowest place to insert. The index in the Deque to insert the item at. After the insertion, the inserted item is located at this index. The front item in the Deque has index 0. The item to insert at the given index. is less than zero or greater than Count. Inserts a collection of items at the given index in the Deque. All items at indexes equal to or greater than increase their indices in the Deque by the number of items inserted. The amount of time to insert a collection in the Deque is proportional to the distance of index from the closest end of the Deque, plus the number of items inserted (M): O(M + Min(, Count - )). The index in the Deque to insert the collection at. After the insertion, the first item of the inserted collection is located at this index. The front item in the Deque has index 0. The collection of items to insert at the given index. is less than zero or greater than Count. Removes the item at the given index in the Deque. All items at indexes greater than move down one index in the Deque. The amount of time to delete an item in the Deque is proportional to the distance of index from the closest end of the Deque: O(Min(, Count - 1 - )). Thus, deleting an item at the front or end of the Deque is always fast; the middle of of the Deque is the slowest place to delete. The index in the list to remove the item at. The first item in the list has index 0. is less than zero or greater than or equal to Count. Removes a range of items at the given index in the Deque. All items at indexes greater than move down indices in the Deque. The amount of time to delete items in the Deque is proportional to the distance to the closest end of the Deque: O(Min(, Count - - )). The index in the list to remove the range at. The first item in the list has index 0. The number of items to remove. is less than zero or greater than or equal to Count, or is less than zero or too large. Increase the amount of buffer space. When calling this method, the Deque must not be empty. If start and end are equal, that indicates a completely full Deque. Adds an item to the front of the Deque. The indices of all existing items in the Deque are increased by 1. This method is equivalent to Insert(0, item) but is a little more efficient. Adding an item to the front of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item to add. Adds a collection of items to the front of the Deque. The indices of all existing items in the Deque are increased by the number of items inserted. The first item in the added collection becomes the first item in the Deque. This method takes time O(M), where M is the number of items in the . The collection of items to add. Adds an item to the back of the Deque. The indices of all existing items in the Deque are unchanged. This method is equivalent to Insert(Count, item) but is a little more efficient. Adding an item to the back of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item to add. Adds an item to the back of the Deque. The indices of all existing items in the Deque are unchanged. This method is equivalent to AddToBack(item). Adding an item to the back of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item to add. Adds a collection of items to the back of the Deque. The indices of all existing items in the Deque are unchanged. The last item in the added collection becomes the last item in the Deque. This method takes time O(M), where M is the number of items in the . The collection of item to add. Removes an item from the front of the Deque. The indices of all existing items in the Deque are decreased by 1. This method is equivalent to RemoveAt(0) but is a little more efficient. Removing an item from the front of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item that was removed. The Deque is empty. Removes an item from the back of the Deque. The indices of all existing items in the Deque are unchanged. This method is equivalent to RemoveAt(Count-1) but is a little more efficient. Removing an item from the back of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The Deque is empty. Retreives the item currently at the front of the Deque. The Deque is unchanged. This method is equivalent to deque[0] (except that a different exception is thrown). Retreiving the item at the front of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item at the front of the Deque. The Deque is empty. Retreives the item currently at the back of the Deque. The Deque is unchanged. This method is equivalent to deque[deque.Count - 1] (except that a different exception is thrown). Retreiving the item at the back of the Deque takes a small constant amount of time, regardless of how many items are in the Deque. The item at the back of the Deque. The Deque is empty. Creates a new Deque that is a copy of this one. Copying a Deque takes O(N) time, where N is the number of items in this Deque.. A copy of the current deque. Creates a new Deque that is a copy of this one. Copying a Deque takes O(N) time, where N is the number of items in this Deque.. A copy of the current deque. Makes a deep clone of this Deque. A new Deque is created with a clone of each element of this set, by calling ICloneable.Clone on each element. If T is a value type, then each element is copied as if by simple assignment. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the Deque takes time O(N), where N is the number of items in the Deque. The cloned Deque. T is a reference type that does not implement ICloneable. Gets the number of items currently stored in the Deque. The last item in the Deque has index Count-1. Getting the count of items in the Deque takes a small constant amount of time. The number of items stored in this Deque. Gets or sets the capacity of the Deque. The Capacity is the number of items that this Deque can hold without expanding its internal buffer. Since Deque will automatically expand its buffer when necessary, in almost all cases it is unnecessary to worry about the capacity. However, if it is known that a Deque will contain exactly 1000 items eventually, it can slightly improve efficiency to set the capacity to 1000 up front, so that the Deque does not have to expand automatically. The number of items that this Deque can hold without expanding its internal buffer. The capacity is being set to less than Count, or to too large a value. Gets or sets an item at a particular index in the Deque. Getting or setting the item at a particular index takes a small constant amount of time, no matter what index is used. The index of the item to retrieve or change. The front item has index 0, and the back item has index Count-1. The value at the indicated index. The index is less than zero or greater than or equal to Count. DictionaryBase is a base class that can be used to more easily implement the generic IDictionary<T> and non-generic IDictionary interfaces. To use DictionaryBase as a base class, the derived class must override Count, GetEnumerator, TryGetValue, Clear, Remove, and the indexer set accessor. The key type of the dictionary. The value type of the dictionary. Creates a new DictionaryBase. Clears the dictionary. This method must be overridden in the derived class. Removes a key from the dictionary. This method must be overridden in the derived class. Key to remove from the dictionary. True if the key was found, false otherwise. Determines if this dictionary contains a key equal to . If so, the value associated with that key is returned through the value parameter. This method must be overridden by the derived class. The key to search for. Returns the value associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Adds a new key-value pair to the dictionary. The default implementation of this method checks to see if the key already exists using ContainsKey, then calls the indexer setter if the key doesn't already exist. Key to add. Value to associated with the key. key is already present in the dictionary Determines whether a given key is found in the dictionary. The default implementation simply calls TryGetValue and returns what it returns. Key to look for in the dictionary. True if the key is present in the dictionary. Shows the string representation of the dictionary. The string representation contains a list of the mappings in the dictionary. The string representation of the dictionary. Provides a read-only view of this dictionary. The returned IDictionary<TKey,TValue> provides a view of the dictionary that prevents modifications to the dictionary. Use the method to provide access to the dictionary without allowing changes. Since the returned object is just a view, changes to the dictionary will be reflected in the view. An IIDictionary<TKey,TValue> that provides read-only access to the dictionary. Adds a key-value pair to the collection. This implementation calls the Add method with the Key and Value from the item. A KeyValuePair contains the Key and Value to add. Determines if a dictionary contains a given KeyValuePair. This implementation checks to see if the dictionary contains the given key, and if the value associated with the key is equal to (via object.Equals) the value. A KeyValuePair containing the Key and Value to check for. Determines if a dictionary contains a given KeyValuePair, and if so, removes it. This implementation checks to see if the dictionary contains the given key, and if the value associated with the key is equal to (via object.Equals) the value. If so, the key-value pair is removed. A KeyValuePair containing the Key and Value to check for. True if the item was found and removed. False otherwise. Check that the given parameter is of the expected generic type. Throw an ArgumentException if it isn't. Expected type of the parameter parameter name parameter value Adds a key-value pair to the collection. If key or value are not of the expected types, an ArgumentException is thrown. If both key and value are of the expected types, the (overridden) Add method is called with the key and value to add. Key to add to the dictionary. Value to add to the dictionary. key or value are not of the expected type for this dictionary. Clears this dictionary. Calls the (overridden) Clear method. Determines if this dictionary contains a key equal to . The dictionary is not changed. Calls the (overridden) ContainsKey method. If key is not of the correct TKey for the dictionary, false is returned. The key to search for. True if the dictionary contains key. False if the dictionary does not contain key. Removes the key (and associated value) from the collection that is equal to the passed in key. If no key in the dictionary is equal to the passed key, the dictionary is unchanged. Calls the (overridden) Remove method. If key is not of the correct TKey for the dictionary, the dictionary is unchanged. The key to remove. key could not be converted to TKey. Returns an enumerator that enumerates all the entries in the dictionary. Each entry is returned as a DictionaryEntry. The entries are enumerated in the same orders as the (overridden) GetEnumerator method. An enumerator for enumerating all the elements in the OrderedDictionary. Returns an enumerator that enumerates all the entries in the dictionary. Each entry is returned as a DictionaryEntry. The entries are enumerated in the same orders as the (overridden) GetEnumerator method. An enumerator for enumerating all the elements in the OrderedDictionary. Display the contents of the dictionary in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). The indexer of the dictionary. This is used to store keys and values and retrieve values from the dictionary. The setter accessor must be overridden in the derived class. Key to find in the dictionary. The value associated with the key. Thrown from the get accessor if the key was not found in the dictionary. Returns a collection of the keys in this dictionary. A read-only collection of the keys in this dictionary. Returns a collection of the values in this dictionary. The ordering of values in this collection is the same as that in the Keys collection. A read-only collection of the values in this dictionary. Returns whether this dictionary is fixed size. This implemented always returns false. Always returns false. Returns if this dictionary is read-only. This implementation always returns false. Always returns false. Returns a collection of all the keys in the dictionary. The values in this collection will be enumerated in the same order as the (overridden) GetEnumerator method. The collection of keys. Returns a collection of all the values in the dictionary. The values in this collection will be enumerated in the same order as the (overridden) GetEnumerator method. The collection of values. Gets or sets the value associated with a given key. When getting a value, if this key is not found in the collection, then null is returned. When setting a value, the value replaces any existing value in the dictionary. If either the key or value are not of the correct type for this dictionary, an ArgumentException is thrown. The value associated with the key, or null if the key was not present. key could not be converted to TKey, or value could not be converted to TValue. A private class that implements ICollection<TKey> and ICollection for the Keys collection. The collection is read-only. ReadOnlyCollectionBase is a base class that can be used to more easily implement the generic ICollection<T> and non-generic ICollection interfaces for a read-only collection: a collection that does not allow adding or removing elements. To use ReadOnlyCollectionBase as a base class, the derived class must override the Count and GetEnumerator methods. ICollection<T>.Contains need not be implemented by the derived class, but it should be strongly considered, because the ReadOnlyCollectionBase implementation may not be very efficient. The item type of the collection. Creates a new ReadOnlyCollectionBase. Throws an NotSupportedException stating that this collection cannot be modified. Shows the string representation of the collection. The string representation contains a list of the items in the collection. The string representation of the collection. Determines if the collection contains any item that satisfies the condition defined by . A delegate that defines the condition to check for. True if the collection contains one or more items that satisfy the condition defined by . False if the collection does not contain an item that satisfies . Determines if all of the items in the collection satisfy the condition defined by . A delegate that defines the condition to check for. True if all of the items in the collection satisfy the condition defined by , or if the collection is empty. False if one or more items in the collection do not satisfy . Counts the number of items in the collection that satisfy the condition defined by . A delegate that defines the condition to check for. The number of items in the collection that satisfy . Enumerates the items in the collection that satisfy the condition defined by . A delegate that defines the condition to check for. An IEnumerable<T> that enumerates the items that satisfy the condition. Performs the specified action on each item in this collection. An Action delegate which is invoked for each item in this collection. Convert this collection of items by applying a delegate to each item in the collection. The resulting enumeration contains the result of applying to each item in this collection, in order. The type each item is being converted to. A delegate to the method to call, passing each item in this collection. An IEnumerable<TOutput^gt; that enumerates the resulting collection from applying to each item in this collection in order. is null. This method throws an NotSupportedException stating the collection is read-only. Item to be added to the collection. Always thrown. This method throws an NotSupportedException stating the collection is read-only. Always thrown. This method throws an NotSupportedException stating the collection is read-only. Item to be removed from the collection. Always thrown. Determines if the collection contains a particular item. This default implementation iterates all of the items in the collection via GetEnumerator, testing each item against using IComparable<T>.Equals or Object.Equals. You should strongly consider overriding this method to provide a more efficient implementation. The item to check for in the collection. True if the collection contains , false otherwise. Copies all the items in the collection into an array. Implemented by using the enumerator returned from GetEnumerator to get all the items and copy them to the provided array. Array to copy to. Starting index in to copy to. Creates an array of the correct size, and copies all the items in the collection into the array, by calling CopyTo. An array containing all the elements in the collection, in order. Must be overridden to enumerate all the members of the collection. A generic IEnumerator<T> that can be used to enumerate all the items in the collection. Copies all the items in the collection into an array. Implemented by using the enumerator returned from GetEnumerator to get all the items and copy them to the provided array. Array to copy to. Starting index in to copy to. Provides an IEnumerator that can be used to iterate all the members of the collection. This implementation uses the IEnumerator<T> that was overridden by the derived classes to enumerate the members of the collection. An IEnumerator that can be used to iterate the collection. Display the contents of the collection in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). Must be overridden to provide the number of items in the collection. The number of items in the collection. Indicates whether the collection is read-only. Returns the value of readOnly that was provided to the constructor. Always true. Indicates whether the collection is synchronized. Always returns false, indicating that the collection is not synchronized. Indicates the synchronization object for this collection. Always returns this. Constructor. The dictionary this is associated with. A private class that implements ICollection<TValue> and ICollection for the Values collection. The collection is read-only. A class that wraps a IDictionaryEnumerator around an IEnumerator that enumerates KeyValuePairs. This is useful in implementing IDictionary, because IEnumerator can be implemented with an iterator, but IDictionaryEnumerator cannot. Constructor. The enumerator of KeyValuePairs that is being wrapped. The base implementation for various collections classes that use hash tables as part of their implementation. This class should not (and can not) be used directly by end users; it's only for internal use by the collections package. The Hash does not handle duplicate values. The Hash manages items of type T, and uses a IComparer<ItemTYpe> that hashes compares items to hash items into the table. Constructor. Create a new hash table. The comparer to use to compare items. Gets the current enumeration stamp. Call CheckEnumerationStamp later with this value to throw an exception if the hash table is changed. The current enumeration stamp. Must be called whenever there is a structural change in the tree. Causes changeStamp to be changed, which causes any in-progress enumerations to throw exceptions. Checks the given stamp against the current change stamp. If different, the collection has changed during enumeration and an InvalidOperationException must be thrown changeStamp at the start of the enumeration. Gets the full hash code for an item. Item to get hash code for. The full hash code. It is never zero. Get the initial bucket number and skip amount from the full hash value. The full hash value. Returns the initial bucket. Always in the range 0..(totalSlots - 1). Returns the skip values. Always odd in the range 0..(totalSlots - 1). Gets the full hash value, initial bucket number, and skip amount for an item. Item to get hash value of. Returns the initial bucket. Always in the range 0..(totalSlots - 1). Returns the skip values. Always odd in the range 0..(totalSlots - 1). The full hash value. This is never zero. Make sure there are enough slots in the hash table that items can be inserted into the table. Number of additional items we are inserting. Check if the number of items in the table is small enough that we should shrink the table again. Given the size of a hash table, compute the "secondary shift" value -- the shift that is used to determine the skip amount for collision resolution. The new size of the table. The secondary skip amount. Resize the hash table to the given new size, moving all items into the new hash table. The new size of the hash table. Must be a power of two. Insert a new item into the hash table. If a duplicate item exists, can replace or do nothing. The item to insert. If true, duplicate items are replaced. If false, nothing is done if a duplicate already exists. If a duplicate was found, returns it (whether replaced or not). True if no duplicate existed, false if a duplicate was found. Deletes an item from the hash table. Item to search for and delete. If true returned, the actual item stored in the hash table (must be equal to , but may not be identical. True if item was found and deleted, false if item wasn't found. Find an item in the hash table. If found, optionally replace it with the finding item. Item to find. If true, replaces the equal item in the hash table with . Returns the equal item found in the table, if true was returned. True if the item was found, false otherwise. Enumerate all of the items in the hash table. The items are enumerated in a haphazard, unpredictable order. An IEnumerator<T> that enumerates the items in the hash table. Enumerate all of the items in the hash table. The items are enumerated in a haphazard, unpredictable order. An IEnumerator that enumerates the items in the hash table. Creates a clone of this hash table. If non-null, this function is applied to each item when cloning. It must be the case that this function does not modify the hash code or equality function. A shallow clone that contains the same items. Serialize the hash table. Called from the serialization infrastructure. Called on deserialization. We cannot deserialize now, because hash codes might not be correct now. We do real deserialization in the OnDeserialization call. Deserialize the hash table. Called from the serialization infrastructure when the object graph has finished deserializing. Get the number of items in the hash table. The number of items stored in the hash table. Get the number of slots in the hash table. Exposed internally for testing purposes. The number of slots in the hash table. Get or change the load factor. Changing the load factor may cause the size of the table to grow or shrink accordingly. The structure that has each slot in the hash table. Each slot has three parts: 1. The collision bit. Indicates whether some item visited this slot but had to keep looking because the slot was full. 2. 31-bit full hash value of the item. If zero, the slot is empty. 3. The item itself. Clear this slot, leaving the collision bit alone. The full hash value associated with the value in this slot, or zero if the slot is empty. Is this slot empty? The "Collision" bit indicates that some value hit this slot and collided, so had to try another slot. The MultiDictionary class that associates values with a key. Unlike an Dictionary, each key can have multiple values associated with it. When indexing an MultiDictionary, instead of a single value associated with a key, you retrieve an enumeration of values. When constructed, you can chose to allow the same value to be associated with a key multiple times, or only one time. The type of the keys. The of values associated with the keys. MultiDictionaryBase is a base class that can be used to more easily implement a class that associates multiple values to a single key. The class implements the generic IDictionary<TKey, ICollection<TValue>> interface. To use MultiDictionaryBase as a base class, the derived class must override Count, Clear, Add, Remove(TKey), Remove(TKey,TValue), Contains(TKey,TValue), EnumerateKeys, and TryEnumerateValuesForKey. It may wish consider overriding CountValues, CountAllValues, ContainsKey, and EqualValues, but these are not required. The key type of the dictionary. The value type of the dictionary. Creates a new MultiDictionaryBase. Clears the dictionary. This method must be overridden in the derived class. Enumerate all the keys in the dictionary. This method must be overridden by a derived class. An IEnumerator<TKey> that enumerates all of the keys in the collection that have at least one value associated with them. Enumerate all of the values associated with a given key. This method must be overridden by the derived class. If the key exists and has values associated with it, an enumerator for those values is returned throught . If the key does not exist, false is returned. The key to get values for. If true is returned, this parameter receives an enumerators that enumerates the values associated with that key. True if the key exists and has values associated with it. False otherwise. Adds a key-value pair to the collection. The value part of the pair must be a collection of values to associate with the key. If values are already associated with the given key, the new values are added to the ones associated with that key. A KeyValuePair contains the Key and Value collection to add. Implements IDictionary<TKey, IEnumerable<TValue>>.Add. If the key is already present, and ArgumentException is thrown. Otherwise, a new key is added, and new values are associated with that key. Key to add. Values to associate with that key. The key is already present in the dictionary. Adds new values to be associated with a key. If duplicate values are permitted, this method always adds new key-value pairs to the dictionary. If duplicate values are not permitted, and already has a value equal to one of associated with it, then that value is replaced, and the number of values associate with is unchanged. The key to associate with. A collection of values to associate with . Adds a new key-value pair to the dictionary. This method must be overridden in the derived class. Key to add. Value to associated with the key. key is already present in the dictionary Removes a key from the dictionary. This method must be overridden in the derived class. Key to remove from the dictionary. True if the key was found, false otherwise. Removes a key-value pair from the dictionary. This method must be overridden in the derived class. Key to remove from the dictionary. Associated value to remove from the dictionary. True if the key-value pair was found, false otherwise. Removes a set of values from a given key. If all values associated with a key are removed, then the key is removed also. A KeyValuePair contains a key and a set of values to remove from that key. True if at least one values was found and removed. Removes a collection of values from the values associated with a key. If the last value is removed from a key, the key is removed also. A key to remove values from. A collection of values to remove. The number of values that were present and removed. Remove all of the keys (and any associated values) in a collection of keys. If a key is not present in the dictionary, nothing happens. A collection of key values to remove. The number of keys from the collection that were present and removed. Determines if this dictionary contains a key equal to . If so, all the values associated with that key are returned through the values parameter. This method must be overridden by the derived class. The key to search for. Returns all values associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Determines whether a given key is found in the dictionary. The default implementation simply calls TryEnumerateValuesForKey. It may be appropriate to override this method to provide a more efficient implementation. Key to look for in the dictionary. True if the key is present in the dictionary. Determines if this dictionary contains a key-value pair equal to and . The dictionary is not changed. This method must be overridden in the derived class. The key to search for. The value to search for. True if the dictionary has associated with . Determines if this dictionary contains the given key and all of the values associated with that key.. A key and collection of values to search for. True if the dictionary has associated all of the values in .Value with .Key. If the derived class does not use the default comparison for values, this methods should be overridden to compare two values for equality. This is used for the correct implementation of ICollection.Contains on the Values and KeyValuePairs collections. First value to compare. Second value to compare. True if the values are equal. Gets a count of the number of values associated with a key. The default implementation is slow; it enumerators all of the values (using TryEnumerateValuesForKey) to count them. A derived class may be able to supply a more efficient implementation. The key to count values for. The number of values associated with . Gets a total count of values in the collection. This default implementation is slow; it enumerates all of the keys in the dictionary and calls CountValues on each. A derived class may be able to supply a more efficient implementation. The total number of values associated with all keys in the dictionary. Replaces all values associated with with the single value . This implementation simply calls Remove, followed by Add. The key to associate with. The new values to be associated with . Returns true if some values were removed. Returns false if was not present in the dictionary before Replace was called. Replaces all values associated with with a new collection of values. If the collection does not permit duplicate values, and has duplicate items, then only the last of duplicates is added. The key to associate with. The new values to be associated with . Returns true if some values were removed. Returns false if was not present in the dictionary before Replace was called. Shows the string representation of the dictionary. The string representation contains a list of the mappings in the dictionary. The string representation of the dictionary. Display the contents of the dictionary in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). Enumerate all the keys in the dictionary, and for each key, the collection of values for that key. An enumerator to enumerate all the key, ICollection<value> pairs in the dictionary. Gets the number of keys in the dictionary. This property must be overridden in the derived class. Gets a read-only collection all the keys in this dictionary. An readonly ICollection<TKey> of all the keys in this dictionary. Gets a read-only collection of all the values in the dictionary. A read-only ICollection<TValue> of all the values in the dictionary. Gets a read-only collection of all the value collections in the dictionary. A read-only ICollection<IEnumerable<TValue>> of all the values in the dictionary. Gets a read-only collection of all key-value pairs in the dictionary. If a key has multiple values associated with it, then a key-value pair is present for each value associated with the key. Returns a collection of all of the values in the dictionary associated with , or changes the set of values associated with . If the key is not present in the dictionary, an ICollection enumerating no values is returned. The returned collection of values is read-write, and can be used to modify the collection of values associated with the key. The key to get the values associated with. An ICollection<TValue> with all the values associated with . Gets a collection of all the values in the dictionary associated with , or changes the set of values associated with . If the key is not present in the dictionary, a KeyNotFound exception is thrown. The key to get the values associated with. An IEnumerable<TValue> that enumerates all the values associated with . The given key is not present in the dictionary. A private class that provides the ICollection<TValue> for a particular key. This is the collection that is returned from the indexer. The collections is read-write, live, and can be used to add, remove, etc. values from the multi-dictionary. Constructor. Initializes this collection. Dictionary we're using. The key we're looking at. Remove the key and all values associated with it. Add a new values to this key. New values to add. Remove a value currently associated with key. Value to remove. True if item was assocaited with key, false otherwise. A simple function that returns an IEnumerator<TValue> that doesn't yield any values. A helper. An IEnumerator<TValue> that yields no values. Enumerate all the values associated with key. An IEnumerator<TValue> that enumerates all the values associated with key. Determines if the given values is associated with key. Value to check for. True if value is associated with key, false otherwise. Get the number of values associated with the key. A private class that implements ICollection<TKey> and ICollection for the Keys collection. The collection is read-only. Constructor. The dictionary this is associated with. A private class that implements ICollection<TValue> and ICollection for the Values collection. The collection is read-only. A private class that implements ICollection<ICollection<TValue>> and ICollection for the Values collection on IDictionary. The collection is read-only. A private class that implements ICollection<KeyValuePair<TKey,TValue>> and ICollection for the KeyValuePairs collection. The collection is read-only. Create a new MultiDictionary. The default ordering of keys and values are used. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. The default ordering of keys and values will be used, as defined by TKey and TValue's implementation of IComparable<T> (or IComparable if IComparable<T> is not implemented). If a different ordering should be used, other constructors allow a custom Comparer or IComparer to be passed to changed the ordering. Can the same value be associated with a key multiple times? TKey or TValue does not implement either IComparable<T> or IComparable. Create a new MultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? An IEqualityComparer<TKey> instance that will be used to compare keys. TValue does not implement either IComparable<TValue> or IComparable. Create a new MultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? An IEqualityComparer<TKey> instance that will be used to compare keys. An IEqualityComparer<TValue> instance that will be used to compare values. Create a new MultiDictionary. Private constructor, for use by Clone(). Adds a new value to be associated with a key. If duplicate values are permitted, this method always adds a new key-value pair to the dictionary. If duplicate values are not permitted, and already has a value equal to associated with it, then that value is replaced with , and the number of values associate with is unchanged. The key to associate with. The value to associated with . Removes a given value from the values associated with a key. If the last value is removed from a key, the key is removed also. A key to remove a value from. The value to remove. True if was associated with (and was therefore removed). False if was not associated with . Removes a key and all associated values from the dictionary. If the key is not present in the dictionary, it is unchanged and false is returned. The key to remove. True if the key was present and was removed. Returns false if the key was not present. Removes all keys and values from the dictionary. Determine if two values are equal. First value to compare. Second value to compare. True if the values are equal. Checks to see if is associated with in the dictionary. The key to check. The value to check. True if is associated with . Checks to see if the key is present in the dictionary and has at least one value associated with it. The key to check. True if is present and has at least one value associated with it. Returns false otherwise. Enumerate all the keys in the dictionary. An IEnumerator<TKey> that enumerates all of the keys in the dictionary that have at least one value associated with them. Enumerate the values in the a KeyAndValues structure. Can't return the array directly because: a) The array might be larger than the count. b) We can't allow clients to down-cast to the array and modify it. c) We have to abort enumeration if the hash changes. Item with the values to enumerate.. An enumerable that enumerates the items in the KeyAndValues structure. Determines if this dictionary contains a key equal to . If so, all the values associated with that key are returned through the values parameter. The key to search for. Returns all values associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Gets the number of values associated with a given key. The key to count values of. The number of values associated with . If is not present in the dictionary, zero is returned. Makes a shallow clone of this dictionary; i.e., if keys or values of the dictionary are reference types, then they are not cloned. If TKey or TValue is a value type, then each element is copied as if by simple assignment. Cloning the dictionary takes time O(N), where N is the number of key-value pairs in the dictionary. The cloned dictionary. Implements ICloneable.Clone. Makes a shallow clone of this dictionary; i.e., if keys or values are reference types, then they are not cloned. The cloned dictionary. Throw an InvalidOperationException indicating that this type is not cloneable. Type to test. Makes a deep clone of this dictionary. A new dictionary is created with a clone of each entry of this dictionary, by calling ICloneable.Clone on each element. If TKey or TValue is a value type, then each element is copied as if by simple assignment. If TKey or TValue is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the dictionary takes time O(N log N), where N is the number of key-value pairs in the dictionary. The cloned dictionary. TKey or TValue is a reference type that does not implement ICloneable. Returns the IEqualityComparer<T> used to compare keys in this dictionary. If the dictionary was created using a comparer, that comparer is returned. Otherwise the default comparer for TKey (EqualityComparer<TKey>.Default) is returned. Returns the IEqualityComparer<T> used to compare values in this dictionary. If the dictionary was created using a comparer, that comparer is returned. Otherwise the default comparer for TValue (EqualityComparer<TValue>.Default) is returned. Gets the number of key-value pairs in the dictionary. Each value associated with a given key is counted. If duplicate values are permitted, each duplicate value is included in the count. The number of key-value pairs in the dictionary. A structure to hold the key and the values associated with the key. The number of values must always be 1 or greater in a version that is stored, but can be zero in a dummy version used only for lookups. The key. The number of values. Always at least 1 except in a dummy version for lookups. An array of values. Create a dummy KeyAndValues with just the key, for lookups. The key to use. Make a copy of a KeyAndValues, copying the array. KeyAndValues to copy. A copied version. This class implements IEqualityComparer for KeysAndValues, allowing them to be compared by their keys. An IEqualityComparer on keys is required. OrderedBag<T> is a collection that contains items of type T. The item are maintained in a sorted order. Unlike a OrderedSet, duplicate items (items that compare equal to each other) are allows in an OrderedBag.

The items are compared in one of three ways. If T implements IComparable<TKey> or IComparable, then the CompareTo method of that interface will be used to compare items. Alternatively, a comparison function can be passed in either as a delegate, or as an instance of IComparer<TKey>.

OrderedBag is implemented as a balanced binary tree. Inserting, deleting, and looking up an an element all are done in log(N) + M time, where N is the number of keys in the tree, and M is the current number of copies of the element being handled.

is similar, but uses hashing instead of comparison, and does not maintain the keys in sorted order.

Creates a new OrderedBag. The T must implement IComparable<T> or IComparable. The CompareTo method of this interface will be used to compare items in this bag. Items that are null are permitted, and will be sorted before all other items. T does not implement IComparable<TKey>. Creates a new OrderedBag. The passed delegate will be used to compare items in this bag. A delegate to a method that will be used to compare items. Creates a new OrderedBag. The Compare method of the passed comparison object will be used to compare items in this bag. The GetHashCode and Equals methods of the provided IComparer<T> will never be called, and need not be implemented. An instance of IComparer<T> that will be used to compare items. Creates a new OrderedBag. The T must implement IComparable<T> or IComparable. The CompareTo method of this interface will be used to compare items in this bag. The bag is initialized with all the items in the given collection. Items that are null are permitted, and will be sorted before all other items. A collection with items to be placed into the OrderedBag. T does not implement IComparable<TKey>. Creates a new OrderedBag. The passed delegate will be used to compare items in this bag. The bag is initialized with all the items in the given collection. A collection with items to be placed into the OrderedBag. A delegate to a method that will be used to compare items. Creates a new OrderedBag. The Compare method of the passed comparison object will be used to compare items in this bag. The bag is initialized with all the items in the given collection. The GetHashCode and Equals methods of the provided IComparer<T> will never be called, and need not be implemented. A collection with items to be placed into the OrderedBag. An instance of IComparer<T> that will be used to compare items. Creates a new OrderedBag given a comparer and a tree that contains the data. Used internally for Clone. Comparer for the bag. Data for the bag. Makes a shallow clone of this bag; i.e., if items of the bag are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the bag takes time O(N), where N is the number of items in the bag. The cloned bag. Makes a shallow clone of this bag; i.e., if items of the bag are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the bag takes time O(N), where N is the number of items in the bag. The cloned bag. Makes a deep clone of this bag. A new bag is created with a clone of each element of this bag, by calling ICloneable.Clone on each element. If T is a value type, then each element is copied as if by simple assignment. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the bag takes time O(N log N), where N is the number of items in the bag. The cloned bag. T is a reference type that does not implement ICloneable. Returns the number of copies of in the bag. More precisely, returns the number of items in the bag that compare equal to . NumberOfCopies() takes time O(log N + M), where N is the total number of items in the bag, and M is the number of copies of in the bag. The item to search for in the bag. The number of items in the bag that compare equal to . Returns an enumerator that enumerates all the items in the bag. The items are enumerated in sorted order.

Typically, this method is not called directly. Instead the "foreach" statement is used to enumerate the items, which uses this method implicitly.

If an item is added to or deleted from the bag while it is being enumerated, then the enumeration will end with an InvalidOperationException.

Enumeration all the items in the bag takes time O(N), where N is the number of items in the bag.

An enumerator for enumerating all the items in the OrderedBag.
Determines if this bag contains an item equal to . The bag is not changed. Searching the bag for an item takes time O(log N), where N is the number of items in the bag. The item to search for. True if the bag contains . False if the bag does not contain . Enumerates all of the items in this bag that are equal to , according to the comparison mechanism that was used when the bag was created. The bag is not changed. If the bag does contain an item equal to , then the enumeration contains no items. Enumeration the items in the bag equal to takes time O(log N + M), where N is the total number of items in the bag, and M is the number of items equal to . The item to search for. An IEnumerable<T> that enumerates all the items in the bag equal to . Enumerates all the items in the bag, but enumerates equal items just once, even if they occur multiple times in the bag. If the bag is changed while items are being enumerated, the enumeration will terminate with an InvalidOperationException. An IEnumerable<T> that enumerates the unique items. Get the index of the given item in the sorted order. The smallest item has index 0, the next smallest item has index 1, and the largest item has index Count-1. If multiple equal items exist, the largest index of the equal items is returned. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the last item in the sorted bag equal to , or -1 if the item is not present in the set. Get the index of the given item in the sorted order. The smallest item has index 0, the next smallest item has index 1, and the largest item has index Count-1. If multiple equal items exist, the smallest index of the equal items is returned. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the first item in the sorted bag equal to , or -1 if the item is not present in the set. Adds a new item to the bag. Since bags can contain duplicate items, the item is added even if the bag already contains an item equal to . In this case, the new item is placed after all equal items already present in the bag. Adding an item takes time O(log N), where N is the number of items in the bag. The item to add to the bag. Adds all the items in to the bag. Adding the collection takes time O(M log N), where N is the number of items in the bag, and M is the number of items in . A collection of items to add to the bag. is null. Searches the bag for one item equal to , and if found, removes it from the bag. If not found, the bag is unchanged. If more than one item equal to , the item that was last inserted is removed. Equality between items is determined by the comparison instance or delegate used to create the bag. Removing an item from the bag takes time O(log N), where N is the number of items in the bag. The item to remove. True if was found and removed. False if was not in the bag. Searches the bag for all items equal to , and removes all of them from the bag. If not found, the bag is unchanged. Equality between items is determined by the comparison instance or delegate used to create the bag. RemoveAllCopies() takes time O(M log N), where N is the total number of items in the bag, and M is the number of items equal to . The item to remove. The number of copies of that were found and removed. Removes all the items in from the bag. Items not present in the bag are ignored. Equality between items is determined by the comparison instance or delegate used to create the bag. Removing the collection takes time O(M log N), where N is the number of items in the bag, and M is the number of items in . A collection of items to remove from the bag. The number of items removed from the bag. is null. Removes all items from the bag. Clearing the bag takes a constant amount of time, regardless of the number of items in it. If the collection is empty, throw an invalid operation exception. The bag is empty. Returns the first item in the bag: the item that would appear first if the bag was enumerated. This is also the smallest item in the bag. GetFirst() takes time O(log N), where N is the number of items in the bag. The first item in the bag. If more than one item is smallest, the first one added is returned. The bag is empty. Returns the last item in the bag: the item that would appear last if the bag was enumerated. This is also the largest item in the bag. GetLast() takes time O(log N), where N is the number of items in the bag. The last item in the bag. If more than one item is largest, the last one added is returned. The bag is empty. Removes the first item in the bag. This is also the smallest item in the bag. RemoveFirst() takes time O(log N), where N is the number of items in the bag. The item that was removed, which was the smallest item in the bag. The bag is empty. Removes the last item in the bag. This is also the largest item in the bag. RemoveLast() takes time O(log N), where N is the number of items in the bag. The item that was removed, which was the largest item in the bag. The bag is empty. Check that this bag and another bag were created with the same comparison mechanism. Throws exception if not compatible. Other bag to check comparision mechanism. If otherBag and this bag don't use the same method for comparing items. is null. Determines if this bag is a superset of another bag. Neither bag is modified. This bag is a superset of if every element in is also in this bag, at least the same number of times. IsSupersetOf is computed in time O(M log N), where M is the size of the , and N is the size of the this set. OrderedBag to compare to. True if this is a superset of . This bag and don't use the same method for comparing items. is null. Determines if this bag is a proper superset of another bag. Neither bag is modified. This bag is a proper superset of if every element in is also in this bag, at least the same number of times. Additional, this bag must have strictly more items than . IsProperSupersetOf is computed in time O(M log N), where M is the number of unique items in . OrderedBag to compare to. True if this is a proper superset of . This bag and don't use the same method for comparing items. is null. Determines if this bag is a subset of another bag. Neither bag is modified. This bag is a subset of if every element in this bag is also in , at least the same number of times. IsSubsetOf is computed in time O(N log M), where M is the size of the , and N is the size of the this bag. OrderedBag to compare to. True if this is a subset of . This bag and don't use the same method for comparing items. is null. Determines if this bag is a proper subset of another bag. Neither bag is modified. This bag is a subset of if every element in this bag is also in , at least the same number of times. Additional, this bag must have strictly fewer items than . IsSubsetOf is computed in time O(N log M), where M is the size of the , and N is the size of the this bag. OrderedBag to compare to. True if this is a proper subset of . This bag and don't use the same method for comparing items. is null. Determines if this bag is disjoint from another bag. Two bags are disjoint if no item from one set is equal to any item in the other bag. The answer is computed in time O(N), where N is the size of the smaller set. Bag to check disjointness with. True if the two bags are disjoint, false otherwise. This bag and don't use the same method for comparing items. Determines if this bag is equal to another bag. This bag is equal to if they contain the same items, each the same number of times. IsEqualTo is computed in time O(N), where N is the number of items in this bag. OrderedBag to compare to True if this bag is equal to , false otherwise. This bag and don't use the same method for comparing items. Computes the union of this bag with another bag. The union of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the union contains the item Maximum(X,Y) times. This bag receives the union of the two bags, the other bag is unchanged. The union of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to union with. This bag and don't use the same method for comparing items. is null. Computes the union of this bag with another bag. The union of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the union contains the item Maximum(X,Y) times. A new bag is created with the union of the bags and is returned. This bag and the other bag are unchanged. The union of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to union with. The union of the two bags. This bag and don't use the same method for comparing items. is null. Computes the sum of this bag with another bag. The sum of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item (X+Y) times. This bag receives the sum of the two bags, the other bag is unchanged. The sum of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to sum with. This bag and don't use the same method for comparing items. is null. Computes the sum of this bag with another bag. he sum of two bags is all items from both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item (X+Y) times. A new bag is created with the sum of the bags and is returned. This bag and the other bag are unchanged. The sum of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to sum with. The sum of the two bags. This bag and don't use the same method for comparing items. is null. Computes the intersection of this bag with another bag. The intersection of two bags is all items that appear in both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item Minimum(X,Y) times. This bag receives the intersection of the two bags, the other bag is unchanged. When equal items appear in both bags, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two bags is computed in time O(N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to intersection with. This bag and don't use the same method for comparing items. is null. Computes the intersection of this bag with another bag. The intersection of two bags is all items that appear in both of the bags. If an item appears X times in one bag, and Y times in the other bag, the sum contains the item Minimum(X,Y) times. A new bag is created with the intersection of the bags and is returned. This bag and the other bag are unchanged. When equal items appear in both bags, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two bags is computed in time O(N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to intersection with. The intersection of the two bags. This bag and don't use the same method for comparing items. is null. Computes the difference of this bag with another bag. The difference of these two bags is all items that appear in this bag, but not in . If an item appears X times in this bag, and Y times in the other bag, the difference contains the item X - Y times (zero times if Y >= X). This bag receives the difference of the two bags; the other bag is unchanged. The difference of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to difference with. This bag and don't use the same method for comparing items. is null. Computes the difference of this bag with another bag. The difference of these two bags is all items that appear in this bag, but not in . If an item appears X times in this bag, and Y times in the other bag, the difference contains the item X - Y times (zero times if Y >= X). A new bag is created with the difference of the bags and is returned. This bag and the other bag are unchanged. The difference of two bags is computed in time O(M + N log M), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to difference with. The difference of the two bags. This bag and don't use the same method for comparing items. is null. Computes the symmetric difference of this bag with another bag. The symmetric difference of two bags is all items that appear in either of the bags, but not both. If an item appears X times in one bag, and Y times in the other bag, the symmetric difference contains the item AbsoluteValue(X - Y times). This bag receives the symmetric difference of the two bags; the other bag is unchanged. The symmetric difference of two bags is computed in time O(M + N), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to symmetric difference with. This bag and don't use the same method for comparing items. is null. Computes the symmetric difference of this bag with another bag. The symmetric difference of two bags is all items that appear in either of the bags, but not both. If an item appears X times in one bag, and Y times in the other bag, the symmetric difference contains the item AbsoluteValue(X - Y times). A new bag is created with the symmetric difference of the bags and is returned. This bag and the other bag are unchanged. The symmetric difference of two bags is computed in time O(M + N), where M is the size of the larger bag, and N is the size of the smaller bag. Bag to symmetric difference with. The symmetric difference of the two bags. This bag and don't use the same method for comparing items. is null. Get a read-only list view of the items in this ordered bag. The items in the list are in sorted order, with the smallest item at index 0. This view does not copy any data, and reflects any changes to the underlying OrderedBag. A read-only IList<T> view onto this OrderedBag. Returns a View collection that can be used for enumerating the items in the bag in reversed order.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in bag.Reversed()) { // process item }

If an item is added to or deleted from the bag while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Reverse does not copy the data in the tree, and the operation takes constant time.

An OrderedBag.View of items in reverse order.
Returns a View collection that can be used for enumerating a range of the items in the bag. Only items that are greater than and less than are included. The items are enumerated in sorted order. Items equal to the end points of the range can be included or excluded depending on the and parameters.

If is greater than or equal to , the returned collection is empty.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in bag.Range(from, true, to, false)) { // process item }

If an item is added to or deleted from the bag while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Range does not copy the data in the tree, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--items equal to the lower bound will be included in the range. If false, the lower bound is exclusive--items equal to the lower bound will not be included in the range. The upper bound of the range. If true, the upper bound is inclusive--items equal to the upper bound will be included in the range. If false, the upper bound is exclusive--items equal to the upper bound will not be included in the range. An OrderedBag.View of items in the given range.
Returns a View collection that can be used for enumerating a range of the items in the bag. Only items that are greater than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in bag.RangeFrom(from, true)) { // process item }

If an item is added to or deleted from the bag while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling RangeFrom does not copy the data in the tree, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--items equal to the lower bound will be included in the range. If false, the lower bound is exclusive--items equal to the lower bound will not be included in the range. An OrderedBag.View of items in the given range.
Returns a View collection that can be used for enumerating a range of the items in the bag. Only items that are less than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in bag.RangeTo(to, false)) { // process item }

If an item is added to or deleted from the bag while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling RangeTo does not copy the data in the tree, and the operation takes constant time.

The upper bound of the range. If true, the upper bound is inclusive--items equal to the upper bound will be included in the range. If false, the upper bound is exclusive--items equal to the upper bound will not be included in the range. An OrderedBag.View of items in the given range.
Returns the IComparer<T> used to compare items in this bag. If the bag was created using a comparer, that comparer is returned. If the bag was created using a comparison delegate, then a comparer equivalent to that delegate is returned. Otherwise the default comparer for T (Comparer<T>.Default) is returned. Returns the number of items in the bag. The size of the bag is returned in constant time. The number of items in the bag. Get the item by its index in the sorted order. The smallest item has index 0, the next smallest item has index 1, and the largest item has index Count-1. The indexer takes time O(log N), which N is the number of items in the set. The index to get the item by. The item at the given index. is less than zero or greater than or equal to Count. The nested class that provides a read-only list view of all or part of the collection. ReadOnlyListBase is an abstract class that can be used as a base class for a read-only collection that needs to implement the generic IList<T> and non-generic IList collections. The derived class needs to override the Count property and the get part of the indexer. The implementation of all the other methods in IList<T> and IList are handled by ListBase. Creates a new ReadOnlyListBase. Throws an NotSupportedException stating that this collection cannot be modified. Enumerates all of the items in the list, in order. The item at index 0 is enumerated first, then the item at index 1, and so on. An IEnumerator<T> that enumerates all the items in the list. Determines if the list contains any item that compares equal to . The implementation simply checks whether IndexOf(item) returns a non-negative value. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. True if the list contains an item that compares equal to . Copies all the items in the list, in order, to , starting at index 0. The array to copy to. This array must have a size that is greater than or equal to Count. Copies all the items in the list, in order, to , starting at . The array to copy to. This array must have a size that is greater than or equal to Count + arrayIndex. The starting index in to copy to. Copies a range of elements from the list to , starting at . The starting index in the source list of the range to copy. The array to copy to. This array must have a size that is greater than or equal to Count + arrayIndex. The starting index in to copy to. The number of items to copy. Finds the first item in the list that satisfies the condition defined by . If no item matches the condition, than the default value for T (null or all-zero) is returned. If the default value for T (null or all-zero) matches the condition defined by , and the list might contain the default value, then it is impossible to distinguish the different between finding the default value and not finding any item. To distinguish these cases, use . A delegate that defined the condition to check for. The first item that satisfies the condition . If no item satisfies that condition, the default value for T is returned. Finds the first item in the list that satisfies the condition defined by . A delegate that defines the condition to check for. If true is returned, this parameter receives the first item in the list that satifies the condition defined by . True if an item that satisfies the condition was found. False if no item in the list satisfies that condition. Finds the last item in the list that satisfies the condition defined by . If no item matches the condition, than the default value for T (null or all-zero) is returned. If the default value for T (null or all-zero) matches the condition defined by , and the list might contain the default value, then it is impossible to distinguish the different between finding the default value and not finding any item. To distinguish these cases, use . A delegate that defined the condition to check for. The last item that satisfies the condition . If no item satisfies that condition, the default value for T is returned. Finds the last item in the list that satisfies the condition defined by . A delegate that defines the condition to check for. If true is returned, this parameter receives the last item in the list that satifies the condition defined by . True if an item that satisfies the condition was found. False if no item in the list satisfies that condition. Finds the index of the first item in the list that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The index of the first item that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item, in the range of items extending from to the end, that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The starting index of the range to check. The index of the first item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item, in the range of items starting from , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The starting index of the range to check. The number of items in range to check. The index of the first item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item in the list that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The index of the last item that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item, in the range of items extending from the beginning of the list to , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The ending index of the range to check. The index of the last item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the last item, in the range of items ending at , that satisfies the condition defined by . If no item matches the condition, -1 is returned. A delegate that defined the condition to check for. The ending index of the range to check. The number of items in range to check. The index of the last item in the given range that satisfies the condition . If no item satisfies that condition, -1 is returned. Finds the index of the first item in the list that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The index of the first item in the list that that is equal to . If no item is equal to , -1 is returned. Finds the index of the first item, in the range of items extending from to the end, that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The starting index of the range to check. The index of the first item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the first item, in the range of items starting from , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The starting index of the range to check. The number of items in range to check. The index of the first item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item in the list that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The index of the last item in the list that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item, in the range of items extending from the beginning of the list to , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search fror. The ending index of the range to check. The index of the last item in the given range that that is equal to . If no item is equal to , -1 is returned. Finds the index of the last item, in the range of items ending at , that is equal to . The default implementation of equality for type T is used in the search. This is the equality defined by IComparable<T> or object.Equals. The item to search for. The ending index of the range to check. The number of items in range to check. The index of the last item in the given range that that is equal to . If no item is equal to , -1 is returned. Returns a view onto a sub-range of this list. Items are not copied; the returned IList<T> is simply a different view onto the same underlying items. This method can be used to apply an algorithm to a portion of a list. For example: Algorithms.Reverse(deque.Range(3, 6)) will return the reverse opf the 6 items beginning at index 3. The starting index of the view. The number of items in the view. A list that is a view onto the given sub-part of this list. or is negative. + is greater than the size of the list. Inserts a new item at the given index. This implementation throws a NotSupportedException indicating that the list is read-only. The index in the list to insert the item at. After the insertion, the inserted item is located at this index. The first item in the list has index 0. The item to insert at the given index. Always thrown. Removes the item at the given index. This implementation throws a NotSupportedException indicating that the list is read-only. The index in the list to remove the item at. The first item in the list has index 0. Always thrown. Adds an item to the end of the list. This implementation throws a NotSupportedException indicating that the list is read-only. The item to add to the list. Always thrown. Removes all the items from the list, resulting in an empty list. This implementation throws a NotSupportedException indicating that the list is read-only. Always thrown. Determines if the list contains any item that compares equal to . Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. Find the first occurrence of an item equal to in the list, and returns the index of that item. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to search for. The index of , or -1 if no item in the list compares equal to . Insert a new item at the given index. This implementation throws a NotSupportedException indicating that the list is read-only. The index in the list to insert the item at. After the insertion, the inserted item is located at this index. The first item in the list has index 0. The item to insert at the given index. Always thrown. Searches the list for the first item that compares equal to . If one is found, it is removed. Otherwise, the list is unchanged. This implementation throws a NotSupportedException indicating that the list is read-only. Equality in the list is determined by the default sense of equality for T. If T implements IComparable<T>, the Equals method of that interface is used to determine equality. Otherwise, Object.Equals is used to determine equality. The item to remove from the list. Always thrown. Removes the item at the given index. This implementation throws a NotSupportedException indicating that the list is read-only. The index in the list to remove the item at. The first item in the list has index 0. Always thrown. The property must be overridden by the derived class to return the number of items in the list. The number of items in the list. The get part of the indexer must be overridden by the derived class to get values of the list at a particular index. The index in the list to get or set an item at. The first item in the list has index 0, and the last has index Count-1. The item at the given index. is less than zero or greater than or equal to Count. Returns whether the list is a fixed size. This implementation always returns true. Alway true, indicating that the list is fixed size. Returns whether the list is read only. This implementation always returns true. Alway true, indicating that the list is read-only. Gets or sets the value at a particular index in the list. The index in the list to get or set an item at. The first item in the list has index 0, and the last has index Count-1. The item at the given index. is less than zero or greater than or equal to Count. cannot be converted to T. Always thrown from the setter, indicating that the list is read-only. Create a new list view wrapped the given set. The ordered bag to wrap. Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Used to optimize some operations. Is the view enuemerated in reverse order? The OrderedBag<T>.View class is used to look at a subset of the items inside an ordered bag. It is returned from the Range, RangeTo, RangeFrom, and Reversed methods.

Views are dynamic. If the underlying bag changes, the view changes in sync. If a change is made to the view, the underlying bag changes accordingly.

Typically, this class is used in conjunction with a foreach statement to enumerate the items in a subset of the OrderedBag. For example:

foreach(T item in bag.Range(from, to)) { // process item }
Initialize the view. OrderedBag being viewed Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Is the view enuemerated in reverse order? Determine if the given item lies within the bounds of this view. Item to test. True if the item is within the bounds of this view. Enumerate all the items in this view. An IEnumerator<T> with the items in this view. Removes all the items within this view from the underlying bag. The following removes all the items that start with "A" from an OrderedBag. bag.Range("A", "B").Clear(); Adds a new item to the bag underlying this View. If the bag already contains an item equal to , that item is replaces with . If is outside the range of this view, an InvalidOperationException is thrown. Equality between items is determined by the comparison instance or delegate used to create the bag. Adding an item takes time O(log N), where N is the number of items in the bag. The item to add. True if the bag already contained an item equal to (which was replaced), false otherwise. Searches the underlying bag for an item equal to , and if found, removes it from the bag. If not found, the bag is unchanged. If the item is outside the range of this view, the bag is unchanged. Equality between items is determined by the comparison instance or delegate used to create the bag. Removing an item from the bag takes time O(log N), where N is the number of items in the bag. The item to remove. True if was found and removed. False if was not in the bag, or was outside the range of this view. Determines if this view of the bag contains an item equal to . The bag is not changed. If Searching the bag for an item takes time O(log N), where N is the number of items in the bag. The item to search for. True if the bag contains , and is within the range of this view. False otherwise. Get the first index of the given item in the view. The smallest item in the view has index 0, the next smallest item has index 1, and the largest item has index Count-1. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the first item in the view equal to , or -1 if the item is not present in the view. Get the last index of the given item in the view. The smallest item in the view has index 0, the next smallest item has index 1, and the largest item has index Count-1. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the last item in the view equal to , or -1 if the item is not present in the view. Get a read-only list view of the items in this view. The items in the list are in sorted order, with the smallest item at index 0. This view does not copy any data, and reflects any changes to the underlying OrderedSet. A read-only IList<T> view onto this view. Creates a new View that has the same items as this view, in the reversed order. A new View that has the reversed order of this view, with the same upper and lower bounds. Returns the first item in this view: the item that would appear first if the view was enumerated. GetFirst() takes time O(log N), where N is the number of items in the bag. The first item in the view. The view has no items in it. Returns the last item in the view: the item that would appear last if the view was enumerated. GetLast() takes time O(log N), where N is the number of items in the bag. The last item in the view. The view has no items in it. Number of items in this view. Number of items that lie within the bounds the view. Get the item by its index in the sorted order. The smallest item in the view has index 0, the next smallest item has index 1, and the largest item has index Count-1. The indexer takes time O(log N), which N is the number of items in the set. The index to get the item by. The item at the given index. is less than zero or greater than or equal to Count. The OrderedMultiDictionary class that associates values with a key. Unlike an OrderedDictionary, each key can have multiple values associated with it. When indexing an OrderedMultidictionary, instead of a single value associated with a key, you retrieve an enumeration of values. All of the key are stored in sorted order. Also, the values associated with a given key are kept in sorted order as well. When constructed, you can chose to allow the same value to be associated with a key multiple times, or only one time. The type of the keys. The of values associated with the keys. Helper function to create a new KeyValuePair struct. The key. The value. A new KeyValuePair. Helper function to create a new KeyValuePair struct with a default value. The key. A new KeyValuePair. Get a RangeTester that maps to the range of all items with the given key. Key in the given range. A RangeTester delegate that selects the range of items with that range. Gets a range tester that defines a range by first and last items. The lower bound. True if the lower bound is inclusive, false if exclusive. The upper bound. True if the upper bound is inclusive, false if exclusive. A RangeTester delegate that tests for a key in the given range. Gets a range tester that defines a range by a lower bound. The lower bound. True if the lower bound is inclusive, false if exclusive. A RangeTester delegate that tests for a key in the given range. Gets a range tester that defines a range by upper bound. The upper bound. True if the upper bound is inclusive, false if exclusive. A RangeTester delegate that tests for a key in the given range. Create a new OrderedMultiDictionary. The default ordering of keys and values are used. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. The default ordering of keys and values will be used, as defined by TKey and TValue's implementation of IComparable<T> (or IComparable if IComparable<T> is not implemented). If a different ordering should be used, other constructors allow a custom Comparer or IComparer to be passed to changed the ordering. Can the same value be associated with a key multiple times? TKey or TValue does not implement either IComparable<T> or IComparable. Create a new OrderedMultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? A delegate to a method that will be used to compare keys. TValue does not implement either IComparable<TValue> or IComparable. Create a new OrderedMultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? A delegate to a method that will be used to compare keys. A delegate to a method that will be used to compare values. Create a new OrderedMultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? An IComparer<TKey> instance that will be used to compare keys. TValue does not implement either IComparable<TValue> or IComparable. Create a new OrderedMultiDictionary. If duplicate values are allowed, multiple copies of the same value can be associated with the same key. For example, the key "foo" could have "a", "a", and "b" associated with it. If duplicate values are not allowed, only one copies of a given value can be associated with the same key, although different keys can have the same value. For example, the key "foo" could have "a" and "b" associated with it, which key "bar" has values "b" and "c" associated with it. Can the same value be associated with a key multiple times? An IComparer<TKey> instance that will be used to compare keys. An IComparer<TValue> instance that will be used to compare values. Create a new OrderedMultiDictionary. Used internally for cloning. Can the same value be associated with a key multiple times? Number of keys. An IComparer<TKey> instance that will be used to compare keys. An IComparer<TValue> instance that will be used to compare values. Comparer of key-value pairs. The red-black tree used to store the data. Adds a new value to be associated with a key. If duplicate values are permitted, this method always adds a new key-value pair to the dictionary. If duplicate values are not permitted, and already has a value equal to associated with it, then that value is replaced with , and the number of values associate with is unchanged. The key to associate with. The value to associated with . Removes a given value from the values associated with a key. If the last value is removed from a key, the key is removed also. A key to remove a value from. The value to remove. True if was associated with (and was therefore removed). False if was not associated with . Removes a key and all associated values from the dictionary. If the key is not present in the dictionary, it is unchanged and false is returned. The key to remove. True if the key was present and was removed. Returns false if the key was not present. Removes all keys and values from the dictionary. Determine if two values are equal. First value to compare. Second value to compare. True if the values are equal. Checks to see if is associated with in the dictionary. The key to check. The value to check. True if is associated with . Checks to see if the key is present in the dictionary and has at least one value associated with it. The key to check. True if is present and has at least one value associated with it. Returns false otherwise. A private helper method that returns an enumerable that enumerates all the keys in a range. Defines the range to enumerate. Should the keys be enumerated in reverse order? An IEnumerable<TKey> that enumerates the keys in the given range. in the dictionary. A private helper method for the indexer to return an enumerable that enumerates all the values for a key. This is separate method because indexers can't use the yield return construct. An IEnumerable<TValue> that can be used to enumerate all the values associated with . If is not present, an enumerable that enumerates no items is returned. Determines if this dictionary contains a key equal to . If so, all the values associated with that key are returned through the values parameter. The key to search for. Returns all values associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Enumerate all of the keys in the dictionary. An IEnumerator<TKey> of all of the keys in the dictionary. Gets the number of values associated with a given key. The key to count values of. The number of values associated with . If is not present in the dictionary, zero is returned. Gets a total count of values in the collection. The total number of values associated with all keys in the dictionary. Makes a shallow clone of this dictionary; i.e., if keys or values of the dictionary are reference types, then they are not cloned. If TKey or TValue is a value type, then each element is copied as if by simple assignment. Cloning the dictionary takes time O(N), where N is the number of key-value pairs in the dictionary. The cloned dictionary. Implements ICloneable.Clone. Makes a shallow clone of this dictionary; i.e., if keys or values are reference types, then they are not cloned. The cloned dictionary. Throw an InvalidOperationException indicating that this type is not cloneable. Type to test. Makes a deep clone of this dictionary. A new dictionary is created with a clone of each entry of this dictionary, by calling ICloneable.Clone on each element. If TKey or TValue is a value type, then each element is copied as if by simple assignment. If TKey or TValue is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the dictionary takes time O(N log N), where N is the number of key-value pairs in the dictionary. The cloned dictionary. TKey or TValue is a reference type that does not implement ICloneable. Returns a View collection that can be used for enumerating the keys and values in the collection in reversed order.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(KeyValuePair<TKey, TValue> pair in dictionary.Reversed()) { // process pair }

If an entry is added to or deleted from the dictionary while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Reverse does not copy the data in the dictionary, and the operation takes constant time.

An OrderedDictionary.View of key-value pairs in reverse order.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only keys that are greater than and less than are included. The keys are enumerated in sorted order. Keys equal to the end points of the range can be included or excluded depending on the and parameters.

If is greater than or equal to , the returned collection is empty.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.Range(from, true, to, false)) { // process pair }

Calling Range does not copy the data in the dictionary, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--keys equal to the lower bound will be included in the range. If false, the lower bound is exclusive--keys equal to the lower bound will not be included in the range. The upper bound of the range. If true, the upper bound is inclusive--keys equal to the upper bound will be included in the range. If false, the upper bound is exclusive--keys equal to the upper bound will not be included in the range. An OrderedMultiDictionary.View of key-value pairs in the given range.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only keys that are greater than (and optionally, equal to) are included. The keys are enumerated in sorted order. Keys equal to can be included or excluded depending on the parameter.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.RangeFrom(from, true)) { // process pair }

Calling RangeFrom does not copy of the data in the dictionary, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--keys equal to the lower bound will be included in the range. If false, the lower bound is exclusive--keys equal to the lower bound will not be included in the range. An OrderedMultiDictionary.View of key-value pairs in the given range.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only items that are less than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.RangeFrom(from, false)) { // process pair }

Calling RangeTo does not copy the data in the dictionary, and the operation takes constant time.

The upper bound of the range. If true, the upper bound is inclusive--keys equal to the upper bound will be included in the range. If false, the upper bound is exclusive--keys equal to the upper bound will not be included in the range. An OrderedMultiDictionary.View of key-value pairs in the given range.
Returns the IComparer<T> used to compare keys in this dictionary. If the dictionary was created using a comparer, that comparer is returned. If the dictionary was created using a comparison delegate, then a comparer equivalent to that delegate is returned. Otherwise the default comparer for TKey (Comparer<TKey>.Default) is returned. Returns the IComparer<T> used to compare values in this dictionary. If the dictionary was created using a comparer, that comparer is returned. If the dictionary was created using a comparison delegate, then a comparer equivalent to that delegate is returned. Otherwise the default comparer for TValue (Comparer<TValue>.Default) is returned. Gets the number of key-value pairs in the dictionary. Each value associated with a given key is counted. If duplicate values are permitted, each duplicate value is included in the count. The number of key-value pairs in the dictionary. Gets a read-only collection of all key-value pairs in the dictionary. If a key has multiple values associated with it, then a key-value pair is present for each value associated with the key. A private class that implements ICollection<KeyValuePair<TKey,TValue>> and ICollection for the KeyValuePairs collection. The collection is read-only. The OrderedMultiDictionary<TKey,TValue>.View class is used to look at a subset of the keys and values inside an ordered multi-dictionary. It is returned from the Range, RangeTo, RangeFrom, and Reversed methods.

Views are dynamic. If the underlying dictionary changes, the view changes in sync. If a change is made to the view, the underlying dictionary changes accordingly.

Typically, this class is used in conjunction with a foreach statement to enumerate the keys and values in a subset of the OrderedMultiDictionary. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.Range(from, to)) { // process pair }
Initialize the View. Associated OrderedMultiDictionary to be viewed. Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Is the view enuemerated in reverse order? Determine if the given key lies within the bounds of this view. Key to test. True if the key is within the bounds of this view. Enumerate all the keys in the dictionary. An IEnumerator<TKey> that enumerates all of the keys in the collection that have at least one value associated with them. Enumerate all of the values associated with a given key. If the key exists and has values associated with it, an enumerator for those values is returned throught . If the key does not exist, false is returned. The key to get values for. If true is returned, this parameter receives an enumerators that enumerates the values associated with that key. True if the key exists and has values associated with it. False otherwise. Tests if the key is present in the part of the dictionary being viewed. Key to check True if the key is within this view. Tests if the key-value pair is present in the part of the dictionary being viewed. Key to check for. Value to check for. True if the key-value pair is within this view. Gets the number of values associated with a given key. The key to count values of. The number of values associated with . If is not present in this view, zero is returned. Adds the given key-value pair to the underlying dictionary of this view. If is not within the range of this view, an ArgumentException is thrown. is not within the range of this view. Removes the key (and associated value) from the underlying dictionary of this view. If no key in the view is equal to the passed key, the dictionary and view are unchanged. The key to remove. True if the key was found and removed. False if the key was not found. Removes the key and value from the underlying dictionary of this view. that is equal to the passed in key. If no key in the view is equal to the passed key, or has the given value associated with it, the dictionary and view are unchanged. The key to remove. The value to remove. True if the key-value pair was found and removed. False if the key-value pair was not found. Removes all the keys and values within this view from the underlying OrderedMultiDictionary. The following removes all the keys that start with "A" from an OrderedMultiDictionary. dictionary.Range("A", "B").Clear(); Creates a new View that has the same keys and values as this, in the reversed order. A new View that has the reversed order of this view. Number of keys in this view. Number of keys that lie within the bounds the view. OrderedSet<T> is a collection that contains items of type T. The item are maintained in a sorted order, and duplicate items are not allowed. Each item has an index in the set: the smallest item has index 0, the next smallest item has index 1, and so forth.

The items are compared in one of three ways. If T implements IComparable<TKey> or IComparable, then the CompareTo method of that interface will be used to compare items. Alternatively, a comparison function can be passed in either as a delegate, or as an instance of IComparer<TKey>.

OrderedSet is implemented as a balanced binary tree. Inserting, deleting, and looking up an an element all are done in log(N) type, where N is the number of keys in the tree.

is similar, but uses hashing instead of comparison, and does not maintain the items in sorted order.

Creates a new OrderedSet. The T must implement IComparable<T> or IComparable. The CompareTo method of this interface will be used to compare items in this set. Items that are null are permitted, and will be sorted before all other items. T does not implement IComparable<TKey>. Creates a new OrderedSet. The passed delegate will be used to compare items in this set. A delegate to a method that will be used to compare items. Creates a new OrderedSet. The Compare method of the passed comparison object will be used to compare items in this set. The GetHashCode and Equals methods of the provided IComparer<T> will never be called, and need not be implemented. An instance of IComparer<T> that will be used to compare items. Creates a new OrderedSet. The T must implement IComparable<T> or IComparable. The CompareTo method of this interface will be used to compare items in this set. The set is initialized with all the items in the given collection. Items that are null are permitted, and will be sorted before all other items. A collection with items to be placed into the OrderedSet. T does not implement IComparable<TKey>. Creates a new OrderedSet. The passed delegate will be used to compare items in this set. The set is initialized with all the items in the given collection. A collection with items to be placed into the OrderedSet. A delegate to a method that will be used to compare items. Creates a new OrderedSet. The Compare method of the passed comparison object will be used to compare items in this set. The set is initialized with all the items in the given collection. The GetHashCode and Equals methods of the provided IComparer<T> will never be called, and need not be implemented. A collection with items to be placed into the OrderedSet. An instance of IComparer<T> that will be used to compare items. Creates a new OrderedSet given a comparer and a tree that contains the data. Used internally for Clone. Comparer for the set. Data for the set. Makes a shallow clone of this set; i.e., if items of the set are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the set takes time O(N), where N is the number of items in the set. The cloned set. Makes a shallow clone of this set; i.e., if items of the set are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the set takes time O(N), where N is the number of items in the set. The cloned set. Makes a deep clone of this set. A new set is created with a clone of each element of this set, by calling ICloneable.Clone on each element. If T is a value type, then each element is copied as if by simple assignment. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the set takes time O(N log N), where N is the number of items in the set. The cloned set. T is a reference type that does not implement ICloneable. Returns an enumerator that enumerates all the items in the set. The items are enumerated in sorted order.

Typically, this method is not called directly. Instead the "foreach" statement is used to enumerate the items, which uses this method implicitly.

If an item is added to or deleted from the set while it is being enumerated, then the enumeration will end with an InvalidOperationException.

Enumeration all the items in the set takes time O(N log N), where N is the number of items in the set.

An enumerator for enumerating all the items in the OrderedSet.
Determines if this set contains an item equal to . The set is not changed. Searching the set for an item takes time O(log N), where N is the number of items in the set. The item to search for. True if the set contains . False if the set does not contain . Determines if this set contains an item equal to , according to the comparison mechanism that was used when the set was created. The set is not changed. If the set does contain an item equal to , then the item from the set is returned. Searching the set for an item takes time O(log N), where N is the number of items in the set. In the following example, the set contains strings which are compared in a case-insensitive manner. OrderedSet<string> set = new OrderedSet<string>(StringComparer.CurrentCultureIgnoreCase); set.Add("HELLO"); string s; bool b = set.TryGetItem("Hello", out s); // b receives true, s receives "HELLO". The item to search for. Returns the item from the set that was equal to . True if the set contains . False if the set does not contain . Get the index of the given item in the sorted order. The smallest item has index 0, the next smallest item has index 1, and the largest item has index Count-1. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the item in the sorted set, or -1 if the item is not present in the set. Adds a new item to the set. If the set already contains an item equal to , that item is replaced with . Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes time O(log N), where N is the number of items in the set. The item to add to the set. True if the set already contained an item equal to (which was replaced), false otherwise. Adds a new item to the set. If the set already contains an item equal to , that item is replaces with . Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes time O(log N), where N is the number of items in the set. The item to add to the set. Adds all the items in to the set. If the set already contains an item equal to one of the items in , that item will be replaced. Equality between items is determined by the comparison instance or delegate used to create the set. Adding the collection takes time O(M log N), where N is the number of items in the set, and M is the number of items in . A collection of items to add to the set. Searches the set for an item equal to , and if found, removes it from the set. If not found, the set is unchanged. Equality between items is determined by the comparison instance or delegate used to create the set. Removing an item from the set takes time O(log N), where N is the number of items in the set. The item to remove. True if was found and removed. False if was not in the set. Removes all the items in from the set. Items not present in the set are ignored. Equality between items is determined by the comparison instance or delegate used to create the set. Removing the collection takes time O(M log N), where N is the number of items in the set, and M is the number of items in . A collection of items to remove from the set. The number of items removed from the set. is null. Removes all items from the set. Clearing the sets takes a constant amount of time, regardless of the number of items in it. If the collection is empty, throw an invalid operation exception. The set is empty. Returns the first item in the set: the item that would appear first if the set was enumerated. This is also the smallest item in the set. GetFirst() takes time O(log N), where N is the number of items in the set. The first item in the set. The set is empty. Returns the lastl item in the set: the item that would appear last if the set was enumerated. This is also the largest item in the set. GetLast() takes time O(log N), where N is the number of items in the set. The lastl item in the set. The set is empty. Removes the first item in the set. This is also the smallest item in the set. RemoveFirst() takes time O(log N), where N is the number of items in the set. The item that was removed, which was the smallest item in the set. The set is empty. Removes the last item in the set. This is also the largest item in the set. RemoveLast() takes time O(log N), where N is the number of items in the set. The item that was removed, which was the largest item in the set. The set is empty. Check that this set and another set were created with the same comparison mechanism. Throws exception if not compatible. Other set to check comparision mechanism. If otherSet and this set don't use the same method for comparing items. Determines if this set is a superset of another set. Neither set is modified. This set is a superset of if every element in is also in this set. IsSupersetOf is computed in time O(M log N), where M is the size of the , and N is the size of the this set. OrderedSet to compare to. True if this is a superset of . This set and don't use the same method for comparing items. Determines if this set is a proper superset of another set. Neither set is modified. This set is a proper superset of if every element in is also in this set. Additionally, this set must have strictly more items than . IsProperSupersetOf is computed in time O(M log N), where M is the number of unique items in . OrderedSet to compare to. True if this is a proper superset of . This set and don't use the same method for comparing items. Determines if this set is a subset of another set. Neither set is modified. This set is a subset of if every element in this set is also in . IsSubsetOf is computed in time O(N log M), where M is the size of the , and N is the size of the this set. Set to compare to. True if this is a subset of . This set and don't use the same method for comparing items. Determines if this set is a proper subset of another set. Neither set is modified. This set is a subset of if every element in this set is also in . Additionally, this set must have strictly fewer items than . IsSubsetOf is computed in time O(N log M), where M is the size of the , and N is the size of the this set. Set to compare to. True if this is a proper subset of . This set and don't use the same method for comparing items. Determines if this set is equal to another set. This set is equal to if they contain the same items. IsEqualTo is computed in time O(N), where N is the number of items in this set. Set to compare to True if this set is equal to , false otherwise. This set and don't use the same method for comparing items. Computes the union of this set with another set. The union of two sets is all items that appear in either or both of the sets. This set receives the union of the two sets, the other set is unchanged. If equal items appear in both sets, the union will include an arbitrary choice of one of the two equal items. The union of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to union with. This set and don't use the same method for comparing items. Determines if this set is disjoint from another set. Two sets are disjoint if no item from one set is equal to any item in the other set. The answer is computed in time O(N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to check disjointness with. True if the two sets are disjoint, false otherwise. This set and don't use the same method for comparing items. Computes the union of this set with another set. The union of two sets is all items that appear in either or both of the sets. A new set is created with the union of the sets and is returned. This set and the other set are unchanged. If equal items appear in both sets, the union will include an arbitrary choice of one of the two equal items. The union of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to union with. The union of the two sets. This set and don't use the same method for comparing items. Computes the intersection of this set with another set. The intersection of two sets is all items that appear in both of the sets. This set receives the intersection of the two sets, the other set is unchanged. When equal items appear in both sets, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two sets is computed in time O(N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to intersection with. This set and don't use the same method for comparing items. Computes the intersection of this set with another set. The intersection of two sets is all items that appear in both of the sets. A new set is created with the intersection of the sets and is returned. This set and the other set are unchanged. When equal items appear in both sets, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two sets is computed in time O(N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to intersection with. The intersection of the two sets. This set and don't use the same method for comparing items. Computes the difference of this set with another set. The difference of these two sets is all items that appear in this set, but not in . This set receives the difference of the two sets; the other set is unchanged. The difference of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to difference with. This set and don't use the same method for comparing items. Computes the difference of this set with another set. The difference of these two sets is all items that appear in this set, but not in . A new set is created with the difference of the sets and is returned. This set and the other set are unchanged. The difference of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to difference with. The difference of the two sets. This set and don't use the same method for comparing items. Computes the symmetric difference of this set with another set. The symmetric difference of two sets is all items that appear in either of the sets, but not both. This set receives the symmetric difference of the two sets; the other set is unchanged. The symmetric difference of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to symmetric difference with. This set and don't use the same method for comparing items. Computes the symmetric difference of this set with another set. The symmetric difference of two sets is all items that appear in either of the sets, but not both. A new set is created with the symmetric difference of the sets and is returned. This set and the other set are unchanged. The symmetric difference of two sets is computed in time O(M + N log M), where M is the size of the larger set, and N is the size of the smaller set. Set to symmetric difference with. The symmetric difference of the two sets. This set and don't use the same method for comparing items. Get a read-only list view of the items in this ordered set. The items in the list are in sorted order, with the smallest item at index 0. This view does not copy any data, and reflects any changes to the underlying OrderedSet. A read-only IList<T> view onto this OrderedSet. Returns a View collection that can be used for enumerating the items in the set in reversed order.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in set.Reversed()) { // process item }

If an item is added to or deleted from the set while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Reverse does not copy the data in the tree, and the operation takes constant time.

An OrderedSet.View of items in reverse order.
Returns a View collection that can be used for enumerating a range of the items in the set.. Only items that are greater than and less than are included. The items are enumerated in sorted order. Items equal to the end points of the range can be included or excluded depending on the and parameters.

If is greater than , the returned collection is empty.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in set.Range(from, true, to, false)) { // process item }

If an item is added to or deleted from the set while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Range does not copy the data in the tree, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--items equal to the lower bound will be included in the range. If false, the lower bound is exclusive--items equal to the lower bound will not be included in the range. The upper bound of the range. If true, the upper bound is inclusive--items equal to the upper bound will be included in the range. If false, the upper bound is exclusive--items equal to the upper bound will not be included in the range. An OrderedSet.View of items in the given range.
Returns a View collection that can be used for enumerating a range of the items in the set.. Only items that are greater than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in set.RangeFrom(from, true)) { // process item }

If an item is added to or deleted from the set while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling RangeFrom does not copy the data in the tree, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--items equal to the lower bound will be included in the range. If false, the lower bound is exclusive--items equal to the lower bound will not be included in the range. An OrderedSet.View of items in the given range.
Returns a View collection that can be used for enumerating a range of the items in the set.. Only items that are less than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(T item in set.RangeTo(to, false)) { // process item }

If an item is added to or deleted from the set while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling RangeTo does not copy the data in the tree, and the operation takes constant time.

The upper bound of the range. If true, the upper bound is inclusive--items equal to the upper bound will be included in the range. If false, the upper bound is exclusive--items equal to the upper bound will not be included in the range. An OrderedSet.View of items in the given range.
Returns the IComparer<T> used to compare items in this set. If the set was created using a comparer, that comparer is returned. If the set was created using a comparison delegate, then a comparer equivalent to that delegate is returned. Otherwise the default comparer for T (Comparer<T>.Default) is returned. Returns the number of items in the set. The size of the set is returned in constant time. The number of items in the set. Get the item by its index in the sorted order. The smallest item has index 0, the next smallest item has index 1, and the largest item has index Count-1. The indexer takes time O(log N), which N is the number of items in the set. The index to get the item by. The item at the given index. is less than zero or greater than or equal to Count. The nested class that provides a read-only list view of all or part of the collection. Create a new list view wrapped the given set. Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Used to optimize some operations. Is the view enuemerated in reverse order? The OrderedSet<T>.View class is used to look at a subset of the Items inside an ordered set. It is returned from the Range, RangeTo, RangeFrom, and Reversed methods.

Views are dynamic. If the underlying set changes, the view changes in sync. If a change is made to the view, the underlying set changes accordingly.

Typically, this class is used in conjunction with a foreach statement to enumerate the items in a subset of the OrderedSet. For example:

foreach(T item in set.Range(from, to)) { // process item }
Initialize the view. OrderedSet being viewed Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Used to optimize some operations. Is the view enuemerated in reverse order? Determine if the given item lies within the bounds of this view. Item to test. True if the item is within the bounds of this view. Enumerate all the items in this view. An IEnumerator<T> with the items in this view. Removes all the items within this view from the underlying set. The following removes all the items that start with "A" from an OrderedSet. set.Range("A", "B").Clear(); Adds a new item to the set underlying this View. If the set already contains an item equal to , that item is replaces with . If is outside the range of this view, an InvalidOperationException is thrown. Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes time O(log N), where N is the number of items in the set. The item to add. True if the set already contained an item equal to (which was replaced), false otherwise. Adds a new item to the set underlying this View. If the set already contains an item equal to , that item is replaces with . If is outside the range of this view, an InvalidOperationException is thrown. Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes time O(log N), where N is the number of items in the set. The item to add. Searches the underlying set for an item equal to , and if found, removes it from the set. If not found, the set is unchanged. If the item is outside the range of this view, the set is unchanged. Equality between items is determined by the comparison instance or delegate used to create the set. Removing an item from the set takes time O(log N), where N is the number of items in the set. The item to remove. True if was found and removed. False if was not in the set, or was outside the range of this view. Determines if this view of the set contains an item equal to . The set is not changed. If Searching the set for an item takes time O(log N), where N is the number of items in the set. The item to search for. True if the set contains , and is within the range of this view. False otherwise. Get the index of the given item in the view. The smallest item in the view has index 0, the next smallest item has index 1, and the largest item has index Count-1. Finding the index takes time O(log N), which N is the number of items in the set. The item to get the index of. The index of the item in the view, or -1 if the item is not present in the view. Get a read-only list view of the items in this view. The items in the list are in sorted order, with the smallest item at index 0. This view does not copy any data, and reflects any changes to the underlying OrderedSet. A read-only IList<T> view onto this view. Creates a new View that has the same items as this view, in the reversed order. A new View that has the reversed order of this view, with the same upper and lower bounds. Returns the first item in this view: the item that would appear first if the view was enumerated. GetFirst() takes time O(log N), where N is the number of items in the set. The first item in the view. The view has no items in it. Returns the last item in the view: the item that would appear last if the view was enumerated. GetLast() takes time O(log N), where N is the number of items in the set. The last item in the view. The view has no items in it. Number of items in this view. Number of items that lie within the bounds the view. Get the item by its index in the sorted order. The smallest item in the view has index 0, the next smallest item has index 1, and the largest item has index Count-1. The indexer takes time O(log N), which N is the number of items in the set. The index to get the item by. The item at the given index. is less than zero or greater than or equal to Count. Stores a pair of objects within a single struct. This struct is useful to use as the T of a collection, or as the TKey or TValue of a dictionary. Comparers for the first and second type that are used to compare values. The first element of the pair. The second element of the pair. Creates a new pair with given first and second elements. The first element of the pair. The second element of the pair. Creates a new pair using elements from a KeyValuePair structure. The First element gets the Key, and the Second elements gets the Value. The KeyValuePair to initialize the Pair with . Determines if this pair is equal to another object. The pair is equal to another object if that object is a Pair, both element types are the same, and the first and second elements both compare equal using object.Equals. Object to compare for equality. True if the objects are equal. False if the objects are not equal. Determines if this pair is equal to another pair. The pair is equal if the first and second elements both compare equal using IComparable<T>.Equals or object.Equals. Pair to compare with for equality. True if the pairs are equal. False if the pairs are not equal. Returns a hash code for the pair, suitable for use in a hash-table or other hashed collection. Two pairs that compare equal (using Equals) will have the same hash code. The hash code for the pair is derived by combining the hash codes for each of the two elements of the pair. The hash code. Compares this pair to another pair of the some type. The pairs are compared by using the IComparable<T> or IComparable interface on TFirst and TSecond. The pairs are compared by their first elements first, if their first elements are equal, then they are compared by their second elements. If either TFirst or TSecond does not implement IComparable<T> or IComparable, then an NotSupportedException is thrown, because the pairs cannot be compared. The pair to compare to. An integer indicating how this pair compares to . Less than zero indicates this pair is less than . Zero indicate this pair is equals to . Greater than zero indicates this pair is greater than . Either FirstSecond or TSecond is not comparable via the IComparable<T> or IComparable interfaces. Compares this pair to another pair of the some type. The pairs are compared by using the IComparable<T> or IComparable interface on TFirst and TSecond. The pairs are compared by their first elements first, if their first elements are equal, then they are compared by their second elements. If either TFirst or TSecond does not implement IComparable<T> or IComparable, then an NotSupportedException is thrown, because the pairs cannot be compared. The pair to compare to. An integer indicating how this pair compares to . Less than zero indicates this pair is less than . Zero indicate this pair is equals to . Greater than zero indicates this pair is greater than . is not of the correct type. Either FirstSecond or TSecond is not comparable via the IComparable<T> or IComparable interfaces. Returns a string representation of the pair. The string representation of the pair is of the form: First: {0}, Second: {1} where {0} is the result of First.ToString(), and {1} is the result of Second.ToString() (or "null" if they are null.) The string representation of the pair. Determines if two pairs are equal. Two pairs are equal if the first and second elements both compare equal using IComparable<T>.Equals or object.Equals. First pair to compare. Second pair to compare. True if the pairs are equal. False if the pairs are not equal. Determines if two pairs are not equal. Two pairs are equal if the first and second elements both compare equal using IComparable<T>.Equals or object.Equals. First pair to compare. Second pair to compare. True if the pairs are not equal. False if the pairs are equal. Converts a Pair to a KeyValuePair. The Key part of the KeyValuePair gets the First element, and the Value part of the KeyValuePair gets the Second elements. Pair to convert. The KeyValuePair created from . Converts this Pair to a KeyValuePair. The Key part of the KeyValuePair gets the First element, and the Value part of the KeyValuePair gets the Second elements. The KeyValuePair created from this Pair. Converts a KeyValuePair structure into a Pair. The First element gets the Key, and the Second element gets the Value. The KeyValuePair to convert. The Pair created by converted the KeyValuePair into a Pair. ReadOnlyDictionaryBase is a base class that can be used to more easily implement the generic IDictionary<T> and non-generic IDictionary interfaces. To use ReadOnlyDictionaryBase as a base class, the derived class must override Count, TryGetValue, GetEnumerator. The key type of the dictionary. The value type of the dictionary. Creates a new DictionaryBase. This must be called from the constructor of the derived class to specify whether the dictionary is read-only and the name of the collection. Throws an NotSupportedException stating that this collection cannot be modified. Adds a new key-value pair to the dictionary. Always throws an exception indicating that this method is not supported in a read-only dictionary. Key to add. Value to associated with the key. Always thrown. Removes a key from the dictionary. Always throws an exception indicating that this method is not supported in a read-only dictionary. Key to remove from the dictionary. True if the key was found, false otherwise. Always thrown. Determines whether a given key is found in the dictionary. The default implementation simply calls TryGetValue and returns what it returns. Key to look for in the dictionary. True if the key is present in the dictionary. Determines if this dictionary contains a key equal to . If so, the value associated with that key is returned through the value parameter. This method must be overridden in the derived class. The key to search for. Returns the value associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Shows the string representation of the dictionary. The string representation contains a list of the mappings in the dictionary. The string representation of the dictionary. Determines if a dictionary contains a given KeyValuePair. This implementation checks to see if the dictionary contains the given key, and if the value associated with the key is equal to (via object.Equals) the value. A KeyValuePair containing the Key and Value to check for. Adds a key-value pair to the collection. Always throws an exception indicating that this method is not supported in a read-only dictionary. Key to add to the dictionary. Value to add to the dictionary. Always thrown. Clears this dictionary. Always throws an exception indicating that this method is not supported in a read-only dictionary. Always thrown. Determines if this dictionary contains a key equal to . The dictionary is not changed. Calls the (overridden) ContainsKey method. If key is not of the correct TKey for the dictionary, false is returned. The key to search for. True if the dictionary contains key. False if the dictionary does not contain key. Removes the key (and associated value) from the collection that is equal to the passed in key. Always throws an exception indicating that this method is not supported in a read-only dictionary. The key to remove. Always thrown. Returns an enumerator that enumerates all the entries in the dictionary. Each entry is returned as a DictionaryEntry. The entries are enumerated in the same orders as the (overridden) GetEnumerator method. An enumerator for enumerating all the elements in the OrderedDictionary. Returns an enumerator that enumerates all the entries in the dictionary. Each entry is returned as a DictionaryEntry. The entries are enumerated in the same orders as the (overridden) GetEnumerator method. An enumerator for enumerating all the elements in the OrderedDictionary. Display the contents of the dictionary in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). The indexer of the dictionary. The set accessor throws an NotSupportedException stating the dictionary is read-only. The get accessor is implemented by calling TryGetValue. Key to find in the dictionary. The value associated with the key. Always thrown from the set accessor, indicating that the dictionary is read only. Thrown from the get accessor if the key was not found. Returns a collection of the keys in this dictionary. A read-only collection of the keys in this dictionary. Returns a collection of the values in this dictionary. The ordering of values in this collection is the same as that in the Keys collection. A read-only collection of the values in this dictionary. Returns whether this dictionary is fixed size. Always returns true. Returns if this dictionary is read-only. Always returns true. Returns a collection of all the keys in the dictionary. The values in this collection will be enumerated in the same order as the (overridden) GetEnumerator method. The collection of keys. Returns a collection of all the values in the dictionary. The values in this collection will be enumerated in the same order as the (overridden) GetEnumerator method. The collection of values. Gets the value associated with a given key. When getting a value, if this key is not found in the collection, then null is returned. If the key is not of the correct type for this dictionary, null is returned. The value associated with the key, or null if the key was not present. Always thrown from the set accessor, indicating that the dictionary is read only. A private class that implements ICollection<TKey> and ICollection for the Keys collection. The collection is read-only. Constructor. The dictionary this is associated with. A private class that implements ICollection<TKey> and ICollection for the Values collection. The collection is read-only. A class that wraps a IDictionaryEnumerator around an IEnumerator that enumerates KeyValuePairs. This is useful in implementing IDictionary, because IEnumerator can be implemented with an iterator, but IDictionaryEnumerator cannot. Constructor. The enumerator of KeyValuePairs that is being wrapped. BigList<T> provides a list of items, in order, with indices of the items ranging from 0 to one less than the count of items in the collection. BigList<T> is optimized for efficient operations on large (>100 items) lists, especially for insertions, deletions, copies, and concatinations. BigList<T> class is similar in functionality to the standard List<T> class. Both classes provide a collection that stores an set of items in order, with indices of the items ranging from 0 to one less than the count of items in the collection. Both classes provide the ability to add and remove items from any index, and the get or set the item at any index. BigList<T> differs significantly from List<T> in the performance of various operations, especially when the lists become large (several hundred items or more). With List<T>, inserting or removing elements from anywhere in a large list except the end is very inefficient -- every item after the point of inserting or deletion has to be moved in the list. The BigList<T> class, however, allows for fast insertions and deletions anywhere in the list. Furthermore, BigList<T> allows copies of a list, sub-parts of a list, and concatinations of two lists to be very fast. When a copy is made of part or all of a BigList, two lists shared storage for the parts of the lists that are the same. Only when one of the lists is changed is additional memory allocated to store the distinct parts of the lists. Of course, there is a small price to pay for this extra flexibility. Although still quite efficient, using an index to get or change one element of a BigList, while still reasonably efficient, is significantly slower than using a plain List. Because of this, if you want to process every element of a BigList, using a foreach loop is a lot more efficient than using a for loop and indexing the list. In general, use a List when the only operations you are using are Add (to the end), foreach, or indexing, or you are very sure the list will always remain small (less than 100 items). For large (>100 items) lists that do insertions, removals, copies, concatinations, or sub-ranges, BigList will be more efficient than List. In almost all cases, BigList is more efficient and easier to use than LinkedList. The type of items to store in the BigList. Must be called whenever there is a structural change in the tree. Causes changeStamp to be changed, which causes any in-progress enumerations to throw exceptions. Checks the given stamp against the current change stamp. If different, the collection has changed during enumeration and an InvalidOperationException must be thrown changeStamp at the start of the enumeration. Creates a new BigList. The BigList is initially empty. Creating a empty BigList takes constant time and consumes a very small amount of memory. Creates a new BigList initialized with the items from , in order. Initializing the tree list with the elements of collection takes time O(N), where N is the number of items in . The collection used to initialize the BigList. is null. Creates a new BigList initialized with a given number of copies of the items from , in order. Initializing the tree list with the elements of collection takes time O(N + log K), where N is the number of items in , and K is the number of copies. Number of copies of the collection to use. The collection used to initialize the BigList. is negative. is null. Creates a new BigList that is a copy of . Copying a BigList takes constant time, and little additional memory, since the storage for the items of the two lists is shared. However, changing either list will take additional time and memory. Portions of the list are copied when they are changed. The BigList to copy. is null. Creates a new BigList that is several copies of . Creating K copies of a BigList takes time O(log K), and O(log K) additional memory, since the storage for the items of the two lists is shared. However, changing either list will take additional time and memory. Portions of the list are copied when they are changed. Number of copies of the collection to use. The BigList to copy. is null. Creates a new BigList from the indicated Node. Node that becomes the new root. If null, the new BigList is empty. Removes all of the items from the BigList. Clearing a BigList takes constant time. Inserts a new item at the given index in the BigList. All items at indexes equal to or greater than move up one index. The amount of time to insert an item is O(log N), no matter where in the list the insertion occurs. Inserting an item at the beginning or end of the list is O(N). The index to insert the item at. After the insertion, the inserted item is located at this index. The first item has index 0. The item to insert at the given index. is less than zero or greater than Count. Inserts a collection of items at the given index in the BigList. All items at indexes equal to or greater than increase their indices by the number of items inserted. The amount of time to insert an arbitrary collection in the BigList is O(M + log N), where M is the number of items inserted, and N is the number of items in the list. The index to insert the collection at. After the insertion, the first item of the inserted collection is located at this index. The first item has index 0. The collection of items to insert at the given index. is less than zero or greater than Count. is null. Inserts a BigList of items at the given index in the BigList. All items at indexes equal to or greater than increase their indices by the number of items inserted. The amount of time to insert another BigList is O(log N), where N is the number of items in the list, regardless of the number of items in the inserted list. Storage is shared between the two lists until one of them is changed. The index to insert the collection at. After the insertion, the first item of the inserted collection is located at this index. The first item has index 0. The BigList of items to insert at the given index. is less than zero or greater than Count. is null. Removes the item at the given index in the BigList. All items at indexes greater than move down one index. The amount of time to delete an item in the BigList is O(log N), where N is the number of items in the list. The index in the list to remove the item at. The first item in the list has index 0. is less than zero or greater than or equal to Count. Removes a range of items at the given index in the Deque. All items at indexes greater than move down indices in the Deque. The amount of time to delete items in the Deque is proportional to the distance of index from the closest end of the Deque, plus : O(count + Min(, Count - 1 - )). The index in the list to remove the range at. The first item in the list has index 0. The number of items to remove. is less than zero or greater than or equal to Count, or is less than zero or too large. Adds an item to the end of the BigList. The indices of all existing items in the Deque are unchanged. Adding an item takes, on average, constant time. The item to add. Adds an item to the beginning of the BigList. The indices of all existing items in the Deque are increased by one, and the new item has index zero. Adding an item takes, on average, constant time. The item to add. Adds a collection of items to the end of BigList. The indices of all existing items are unchanged. The last item in the added collection becomes the last item in the BigList. This method takes time O(M + log N), where M is the number of items in the , and N is the size of the BigList. The collection of items to add. is null. Adds a collection of items to the front of BigList. The indices of all existing items in the are increased by the number of items in . The first item in the added collection becomes the first item in the BigList. This method takes time O(M + log N), where M is the number of items in the , and N is the size of the BigList. The collection of items to add. is null. Creates a new BigList that is a copy of this list. Copying a BigList takes constant time, and little additional memory, since the storage for the items of the two lists is shared. However, changing either list will take additional time and memory. Portions of the list are copied when they are changed. A copy of the current list Creates a new BigList that is a copy of this list. Copying a BigList takes constant time, and little additional memory, since the storage for the items of the two lists is shared. However, changing either list will take additional time and memory. Portions of the list are copied when they are changed. A copy of the current list Makes a deep clone of this BigList. A new BigList is created with a clone of each element of this set, by calling ICloneable.Clone on each element. If T is a value type, then this method is the same as Clone. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. If T is a reference type, cloning the list takes time approximate O(N), where N is the number of items in the list. The cloned set. T is a reference type that does not implement ICloneable. Adds a BigList of items to the end of BigList. The indices of all existing items are unchanged. The last item in becomes the last item in this list. The added list is unchanged. This method takes, on average, constant time, regardless of the size of either list. Although conceptually all of the items in are copied, storage is shared between the two lists until changes are made to the shared sections. The list of items to add. is null. Adds a BigList of items to the front of BigList. The indices of all existing items are increased by the number of items in . The first item in becomes the first item in this list. The added list is unchanged. This method takes, on average, constant time, regardless of the size of either list. Although conceptually all of the items in are copied, storage is shared between the two lists until changes are made to the shared sections. The list of items to add. is null. Concatenates two lists together to create a new list. Both lists being concatenated are unchanged. The resulting list contains all the items in , followed by all the items in . This method takes, on average, constant time, regardless of the size of either list. Although conceptually all of the items in both lists are copied, storage is shared until changes are made to the shared sections. The first list to concatenate. The second list to concatenate. or is null. Creates a new list that contains a subrange of elements from this list. The current list is unchanged. This method takes take O(log N), where N is the size of the current list. Although the sub-range is conceptually copied, storage is shared between the two lists until a change is made to the shared items. If a view of a sub-range is desired, instead of a copy, use the more efficient method, which provides a view onto a sub-range of items. The starting index of the sub-range. The number of items in the sub-range. If this is zero, the returned list is empty. A new list with the items that start at . Returns a view onto a sub-range of this list. Items are not copied; the returned IList<T> is simply a different view onto the same underlying items. Changes to this list are reflected in the view, and vice versa. Insertions and deletions in the view change the size of the view, but insertions and deletions in the underlying list do not. If a copy of the sub-range is desired, use the method instead. This method can be used to apply an algorithm to a portion of a list. For example: Algorithms.ReverseInPlace(list.Range(3, 6)) will reverse the 6 items beginning at index 3. The starting index of the view. The number of items in the view. A list that is a view onto the given sub-list. or is negative. + is greater than the size of this list. Enumerates a range of the items in the list, in order. The item at is enumerated first, then the next item at index 1, and so on. At most items are enumerated. Enumerating all of the items in the list take time O(N), where N is the number of items being enumerated. Using GetEnumerator() or foreach is much more efficient than accessing all items by index. Index to start enumerating at. Max number of items to enumerate. An IEnumerator<T> that enumerates all the items in the given range. Enumerates all of the items in the list, in order. The item at index 0 is enumerated first, then the item at index 1, and so on. Usually, the foreach statement is used to call this method implicitly. Enumerating all of the items in the list take time O(N), where N is the number of items in the list. Using GetEnumerator() or foreach is much more efficient than accessing all items by index. An IEnumerator<T> that enumerates all the items in the list. Given an IEnumerable<T>, create a new Node with all of the items in the enumerable. Returns null if the enumerable has no items. The collection to copy. Returns a Node, not shared or with any shared children, with the items from the collection. If the collection was empty, null is returned. Consumes up to MAXLEAF items from an Enumerator and places them in a leaf node. If the enumerator is at the end, null is returned. The enumerator to take items from. A LeafNode with items taken from the enumerator. Create a node that has N copies of the given node. Number of copies. Must be non-negative. Node to make copies of. null if node is null or copies is 0. Otherwise, a node consisting of copies of node. copies is negative. Check the balance of the current tree and rebalance it if it is more than BALANCEFACTOR levels away from fully balanced. Note that rebalancing a tree may leave it two levels away from fully balanced. Rebalance the current tree. Once rebalanced, the depth of the current tree is no more than two levels from fully balanced, where fully balanced is defined as having Fibonacci(N+2) or more items in a tree of depth N. The rebalancing algorithm is from "Ropes: an Alternative to Strings", by Boehm, Atkinson, and Plass, in SOFTWARE--PRACTICE AND EXPERIENCE, VOL. 25(12), 1315–1330 (DECEMBER 1995). Part of the rebalancing algorithm. Adds a node to the rebalance array. If it is already balanced, add it directly, otherwise add its children. Rebalance array to insert into. Node to add. If true, mark the node as shared before adding, because one of its parents was shared. Part of the rebalancing algorithm. Adds a balanced node to the rebalance array. Rebalance array to insert into. Node to add. Convert the list to a new list by applying a delegate to each item in the collection. The resulting list contains the result of applying to each item in the list, in order. The current list is unchanged. The type each item is being converted to. A delegate to the method to call, passing each item in . The resulting BigList from applying to each item in this list. is null. Reverses the current list in place. Reverses the items in the range of items starting from , in place. The starting index of the range to reverse. The number of items in range to reverse. Sorts the list in place. The Quicksort algorithm is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. Values are compared by using the IComparable or IComparable<T> interface implementation on the type T. The type T does not implement either the IComparable or IComparable<T> interfaces. Sorts the list in place. A supplied IComparer<T> is used to compare the items in the list. The Quicksort algorithms is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. The comparer instance used to compare items in the collection. Only the Compare method is used. Sorts the list in place. A supplied Comparison<T> delegate is used to compare the items in the list. The Quicksort algorithms is used to sort the items. In virtually all cases, this takes time O(N log N), where N is the number of items in the list. The comparison delegate used to compare items in the collection. Searches a sorted list for an item via binary search. The list must be sorted in the order defined by the default ordering of the item type; otherwise, incorrect results will be returned. The item to search for. Returns the index of the first occurence of in the list. If the item does not occur in the list, the bitwise complement of the first item larger than in the list is returned. If no item is larger than , the bitwise complement of Count is returned. The type T does not implement either the IComparable or IComparable<T> interfaces. Searches a sorted list for an item via binary search. The list must be sorted by the ordering defined by the passed IComparer<T> interface; otherwise, incorrect results will be returned. The item to search for. The IComparer<T> interface used to sort the list. Returns the index of the first occurence of in the list. If the item does not occur in the list, the bitwise complement of the first item larger than in the list is returned. If no item is larger than , the bitwise complement of Count is returned. Searches a sorted list for an item via binary search. The list must be sorted by the ordering defined by the passed Comparison<T> delegate; otherwise, incorrect results will be returned. The item to search for. The comparison delegate used to sort the list. Returns the index of the first occurence of in the list. If the item does not occur in the list, the bitwise complement of the first item larger than in the list is returned. If no item is larger than , the bitwise complement of Count is returned. Gets the number of items stored in the BigList. The indices of the items range from 0 to Count-1. Getting the number of items in the BigList takes constant time. The number of items in the BigList. Gets or sets an item in the list, by index. Gettingor setting an item takes time O(log N), where N is the number of items in the list. To process each of the items in the list, using GetEnumerator() or a foreach loop is more efficient that accessing each of the elements by index. The index of the item to get or set. The first item in the list has index 0, the last item has index Count-1. The value of the item at the given index. is less than zero or greater than or equal to Count. The base class for the two kinds of nodes in the tree: Concat nodes and Leaf nodes. Marks this node as shared by setting the shared variable. Returns the items at the given index in this node. 0-based index, relative to this node. Item at that index. Returns a node that has a sub-range of items from this node. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive first element, relative to this node. Inclusize last element, relative to this node. Node with the given sub-range. Changes the item at the given index. Never changes this node, but always returns a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A new node with the given item changed. Changes the item at the given index. May change this node, or return a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A node with the give item changed. If it can be done in place then "this" is returned. Append a node after this node. Never changes this node, but returns a new node with the given appending done. Node to append. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A new node with the give node appended to this node. Append a node after this node. May change this node, or return a new node. Node to append. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the give node appended to this node. May be a new node or the current node. Append a item after this node. May change this node, or return a new node. Equivalent to AppendInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to append. A node with the given item appended to this node. May be a new node or the current node. Remove a range of items from this node. Never changes this node, but returns a new node with the removing done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A new node with the sub-range removed. Remove a range of items from this node. May change this node, or returns a new node with the given appending done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A node with the sub-range removed. If done in-place, returns "this". Inserts a node inside this node. Never changes this node, but returns a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A new node with the give node inserted. Inserts an item inside this node. May change this node, or return a new node with the given appending done. Equivalent to InsertInPlace(new LeafNode(item), true), but may be more efficient. Index, relative to this node, to insert at. Must be in bounds. Item to insert. A node with the give item inserted. If done in-place, returns "this". Inserts a node inside this node. May change this node, or return a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the given item inserted. If done in-place, returns "this". Prefpend a node before this node. Never changes this node, but returns a new node with the given prepending done. Node to prepend. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A new node with the give node prepended to this node. Prepend a node before this node. May change this node, or return a new node. Node to prepend. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the give node prepended to this node. May be a new node or the current node. Prepend a item before this node. May change this node, or return a new node. Equivalent to PrependInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to prepend. A node with the given item prepended to this node. May be a new node or the current node. Determine if this node is balanced. A node is balanced if the number of items is greater than Fibonacci(Depth+2). Balanced nodes are never rebalanced unless they go out of balance again. True if the node is balanced by this definition. Determine if this node is almost balanced. A node is almost balanced if t its depth is at most one greater than a fully balanced node with the same count. True if the node is almost balanced by this definition. The number of items stored in the node (or below it). The number of items in the node or below. Is this node shared by more that one list (or within a single) lists. If true, indicates that this node, and any nodes below it, may never be modified. Never becomes false after being set to true. Gets the depth of this node. A leaf node has depth 0, a concat node with two leaf children has depth 1, etc. The depth of this node. The LeafNode class is the type of node that lives at the leaf of a tree and holds the actual items stored in the list. Each leaf holds at least 1, and at most MAXLEAF items in the items array. The number of items stored is found in "count", which may be less than "items.Length". Array that stores the items in the nodes. Always has a least "count" elements, but may have more as padding. Creates a LeafNode that holds a single item. Item to place into the leaf node. Creates a new leaf node with the indicates count of item and the Number of items. Can't be zero. The array of items. The LeafNode takes possession of this array. Returns the items at the given index in this node. 0-based index, relative to this node. Item at that index. Changes the item at the given index. May change this node, or return a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A node with the give item changed. If it can be done in place then "this" is returned. Changes the item at the given index. Never changes this node, but always returns a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A new node with the given item changed. If other is a leaf node, and the resulting size would be less than MAXLEAF, merge the other leaf node into this one (after this one) and return true. Other node to possible merge. If could be merged into this node, returns true. Otherwise returns false and the current node is unchanged. If other is a leaf node, and the resulting size would be less than MAXLEAF, merge the other leaf node with this one (after this one) and return a new node with the merged items. Does not modify this. If no merging, return null. Other node to possible merge. If the nodes could be merged, returns the new node. Otherwise returns null. Prepend a item before this node. May change this node, or return a new node. Equivalent to PrependInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to prepend. A node with the given item prepended to this node. May be a new node or the current node. Append a item after this node. May change this node, or return a new node. Equivalent to AppendInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to append. A node with the given item appended to this node. May be a new node or the current node. Append a node after this node. May change this node, or return a new node. Node to append. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the give node appended to this node. May be a new node or the current node. Inserts an item inside this node. May change this node, or return a new node with the given appending done. Equivalent to InsertInPlace(new LeafNode(item), true), but may be more efficient. Index, relative to this node, to insert at. Must be in bounds. Item to insert. A node with the give item inserted. If done in-place, returns "this". Inserts a node inside this node. May change this node, or return a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the given item inserted. If done in-place, returns "this". Inserts a node inside this node. Never changes this node, but returns a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A new node with the give node inserted. Remove a range of items from this node. May change this node, or returns a new node with the given appending done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A node with the sub-range removed. If done in-place, returns "this". Remove a range of items from this node. Never changes this node, but returns a new node with the removing done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A new node with the sub-range removed. Returns a node that has a sub-range of items from this node. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive first element, relative to this node. Inclusize last element, relative to this node. Node with the given sub-range. A ConcatNode is an interior (non-leaf) node that represents the concatination of the left and right child nodes. Both children must always be non-null. The left and right child nodes. They are never null. The left and right child nodes. They are never null. The depth of this node -- the maximum length path to a leaf. If this node has two children that are leaves, the depth in 1. Create a new ConcatNode with the given children. The left child. May not be null. The right child. May not be null. Create a new node with the given children. Mark unchanged children as shared. There are four possible cases: 1. If one of the new children is null, the other new child is returned. 2. If neither child has changed, then this is marked as shared as returned. 3. If one child has changed, the other child is marked shared an a new node is returned. 4. If both children have changed, a new node is returned. New left child. New right child. New node with the given children. Returns null if and only if both new children are null. Updates a node with the given new children. If one of the new children is null, the other is returned. If both are null, null is returned. New left child. New right child. Node with the given children. Usually, but not always, this. Returns null if and only if both new children are null. Returns the items at the given index in this node. 0-based index, relative to this node. Item at that index. Changes the item at the given index. May change this node, or return a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A node with the give item changed. If it can be done in place then "this" is returned. Changes the item at the given index. Never changes this node, but always returns a new node with the given item changed. Index, relative to this node, to change. New item to place at the given index. A new node with the given item changed. Prepend a item before this node. May change this node, or return a new node. Equivalent to PrependInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to prepend. A node with the given item prepended to this node. May be a new node or the current node. Append a item after this node. May change this node, or return a new node. Equivalent to AppendInPlace(new LeafNode(item), true), but may be more efficient because a new LeafNode might not be allocated. Item to append. A node with the given item appended to this node. May be a new node or the current node. Append a node after this node. May change this node, or return a new node. Node to append. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the give node appended to this node. May be a new node or the current node. Inserts an item inside this node. May change this node, or return a new node with the given appending done. Equivalent to InsertInPlace(new LeafNode(item), true), but may be more efficient. Index, relative to this node, to insert at. Must be in bounds. Item to insert. A node with the give item inserted. If done in-place, returns "this". Inserts a node inside this node. May change this node, or return a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A node with the given item inserted. If done in-place, returns "this". Inserts a node inside this node. Never changes this node, but returns a new node with the given appending done. Index, relative to this node, to insert at. Must be in bounds. Node to insert. If true, the given node is not used in any current list, so it may be change, overwritten, or destroyed if convenient. If false, the given node is in use. It should be marked as shared if is is used within the return value. A new node with the give node inserted. Remove a range of items from this node. May change this node, or returns a new node with the given appending done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A node with the sub-range removed. If done in-place, returns "this". Remove a range of items from this node. Never changes this node, but returns a new node with the removing done. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive index of first item in sub-range, relative to this node. Inclusize index of last item in sub-range, relative to this node. A new node with the sub-range removed. Returns a node that has a sub-range of items from this node. The sub-range may not be empty, but may extend outside the node. In other words, first might be less than zero or last might be greater than count. But, last can't be less than zero and first can't be greater than count. Also, last must be greater than or equal to last. Inclusive first element, relative to this node. Inclusize last element, relative to this node. Node with the given sub-range. The depth of this node -- the maximum length path to a leaf. If this node has two children that are leaves, the depth in 1. The depth of this node. The class that is used to implement IList<T> to view a sub-range of a BigList. The object stores a wrapped list, and a start/count indicating a sub-range of the list. Insertion/deletions through the sub-range view cause the count to change also; insertions and deletions directly on the wrapped list do not. This is different from Algorithms.Range in a very few respects: it is specialized to only wrap BigList, and it is a lot more efficient in enumeration. Create a sub-range view object on the indicate part of the list. List to wrap. The start index of the view in the wrapped list. The number of items in the view. MultiDictionaryBase is a base class that can be used to more easily implement a class that associates multiple values to a single key. The class implements the generic IDictionary<TKey, ICollection<TValue>> interface. The resulting collection is read-only -- items cannot be added or removed. To use ReadOnlyMultiDictionaryBase as a base class, the derived class must override Count, Contains(TKey,TValue), EnumerateKeys, and TryEnumerateValuesForKey . The key type of the dictionary. The value type of the dictionary. Creates a new ReadOnlyMultiDictionaryBase. Throws an NotSupportedException stating that this collection cannot be modified. Enumerate all the keys in the dictionary. This method must be overridden by a derived class. An IEnumerator<TKey> that enumerates all of the keys in the collection that have at least one value associated with them. Enumerate all of the values associated with a given key. This method must be overridden by the derived class. If the key exists and has values associated with it, an enumerator for those values is returned throught . If the key does not exist, false is returned. The key to get values for. If true is returned, this parameter receives an enumerators that enumerates the values associated with that key. True if the key exists and has values associated with it. False otherwise. Implements IDictionary<TKey, IEnumerable<TValue>>.Add. If the key is already present, and ArgumentException is thrown. Otherwise, a new key is added, and new values are associated with that key. Key to add. Values to associate with that key. The key is already present in the dictionary. Removes a key from the dictionary. This method must be overridden in the derived class. Key to remove from the dictionary. True if the key was found, false otherwise. Determines if this dictionary contains a key equal to . If so, all the values associated with that key are returned through the values parameter. This method must be overridden by the derived class. The key to search for. Returns all values associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Determines whether a given key is found in the dictionary. The default implementation simply calls TryGetValue. It may be appropriate to override this method to provide a more efficient implementation. Key to look for in the dictionary. True if the key is present in the dictionary. Determines if this dictionary contains a key-value pair equal to and . The dictionary is not changed. This method must be overridden in the derived class. The key to search for. The value to search for. True if the dictionary has associated with . Determines if this dictionary contains the given key and all of the values associated with that key.. A key and collection of values to search for. True if the dictionary has associated all of the values in .Value with .Key. If the derived class does not use the default comparison for values, this methods should be overridden to compare two values for equality. This is used for the correct implementation of ICollection.Contains on the Values and KeyValuePairs collections. First value to compare. Second value to compare. True if the values are equal. Gets a count of the number of values associated with a key. The default implementation is slow; it enumerators all of the values (using TryEnumerateValuesForKey) to count them. A derived class may be able to supply a more efficient implementation. The key to count values for. The number of values associated with . Gets a total count of values in the collection. This default implementation is slow; it enumerates all of the keys in the dictionary and calls CountValues on each. A derived class may be able to supply a more efficient implementation. The total number of values associated with all keys in the dictionary. Shows the string representation of the dictionary. The string representation contains a list of the mappings in the dictionary. The string representation of the dictionary. Display the contents of the dictionary in the debugger. This is intentionally private, it is called only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger. The string representation of the items in the collection, similar in format to ToString(). Enumerate all the keys in the dictionary, and for each key, the collection of values for that key. An enumerator to enumerate all the key, ICollection<value> pairs in the dictionary. Gets the number of keys in the dictionary. This property must be overridden in the derived class. Gets a read-only collection all the keys in this dictionary. An readonly ICollection<TKey> of all the keys in this dictionary. Gets a read-only collection of all the values in the dictionary. A read-only ICollection<TValue> of all the values in the dictionary. Gets a read-only collection of all the value collections in the dictionary. A read-only ICollection<IEnumerable<TValue>> of all the values in the dictionary. Gets a read-only collection of all key-value pairs in the dictionary. If a key has multiple values associated with it, then a key-value pair is present for each value associated with the key. Returns a collection of all of the values in the dictionary associated with . If the key is not present in the dictionary, an ICollection with no values is returned. The returned ICollection is read-only. The key to get the values associated with. An ICollection<TValue> with all the values associated with . Gets a collection of all the values in the dictionary associated with . If the key is not present in the dictionary, a KeyNotFound exception is thrown. The key to get the values associated with. An IEnumerable<TValue> that enumerates all the values associated with . The given key is not present in the dictionary. The set accessor is called. A private class that provides the ICollection<TValue> for a particular key. This is the collection that is returned from the indexer. The collections is read-write, live, and can be used to add, remove, etc. values from the multi-dictionary. Constructor. Initializes this collection. Dictionary we're using. The key we're looking at. A simple function that returns an IEnumerator<TValue> that doesn't yield any values. A helper. An IEnumerator<TValue> that yields no values. Enumerate all the values associated with key. An IEnumerator<TValue> that enumerates all the values associated with key. Determines if the given values is associated with key. Value to check for. True if value is associated with key, false otherwise. Get the number of values associated with the key. A private class that implements ICollection<TKey> and ICollection for the Keys collection. The collection is read-only. Constructor. The dictionary this is associated with. A private class that implements ICollection<TValue> and ICollection for the Values collection. The collection is read-only. A private class that implements ICollection<IEnumerable<TValue>> and ICollection for the Values collection on IDictionary. The collection is read-only. A private class that implements ICollection<KeyValuePair<TKey,TValue>> and ICollection for the KeyValuePairs collection. The collection is read-only. Set<T> is a collection that contains items of type T. The item are maintained in a haphazard, unpredictable order, and duplicate items are not allowed.

The items are compared in one of two ways. If T implements IComparable<T> then the Equals method of that interface will be used to compare items, otherwise the Equals method from Object will be used. Alternatively, an instance of IComparer<T> can be passed to the constructor to use to compare items.

Set is implemented as a hash table. Inserting, deleting, and looking up an an element all are done in approximately constant time, regardless of the number of items in the Set.

is similar, but uses comparison instead of hashing, and does maintains the items in sorted order.

Creates a new Set. The Equals method and GetHashCode method on T will be used to compare items for equality. Items that are null are permitted, and will be sorted before all other items. Creates a new Set. The Equals and GetHashCode method of the passed comparer object will be used to compare items in this set. An instance of IEqualityComparer<T> that will be used to compare items. Creates a new Set. The Equals method and GetHashCode method on T will be used to compare items for equality. Items that are null are permitted. A collection with items to be placed into the Set. Creates a new Set. The Equals and GetHashCode method of the passed comparer object will be used to compare items in this set. The set is initialized with all the items in the given collection. A collection with items to be placed into the Set. An instance of IEqualityComparer<T> that will be used to compare items. Creates a new Set given a comparer and a tree that contains the data. Used internally for Clone. EqualityComparer for the set. Data for the set. Makes a shallow clone of this set; i.e., if items of the set are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the set takes time O(N), where N is the number of items in the set. The cloned set. Makes a shallow clone of this set; i.e., if items of the set are reference types, then they are not cloned. If T is a value type, then each element is copied as if by simple assignment. Cloning the set takes time O(N), where N is the number of items in the set. The cloned set. Makes a deep clone of this set. A new set is created with a clone of each element of this set, by calling ICloneable.Clone on each element. If T is a value type, then each element is copied as if by simple assignment. If T is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the set takes time O(N), where N is the number of items in the set. The cloned set. T is a reference type that does not implement ICloneable. Returns an enumerator that enumerates all the items in the set. The items are enumerated in sorted order.

Typically, this method is not called directly. Instead the "foreach" statement is used to enumerate the items, which uses this method implicitly.

If an item is added to or deleted from the set while it is being enumerated, then the enumeration will end with an InvalidOperationException.

Enumerating all the items in the set takes time O(N), where N is the number of items in the set.

An enumerator for enumerating all the items in the Set.
Determines if this set contains an item equal to . The set is not changed. Searching the set for an item takes approximately constant time, regardless of the number of items in the set. The item to search for. True if the set contains . False if the set does not contain . Determines if this set contains an item equal to , according to the comparison mechanism that was used when the set was created. The set is not changed. If the set does contain an item equal to , then the item from the set is returned. Searching the set for an item takes approximately constant time, regardless of the number of items in the set. In the following example, the set contains strings which are compared in a case-insensitive manner. Set<string> set = new Set<string>(StringComparer.CurrentCultureIgnoreCase); set.Add("HELLO"); string s; bool b = set.TryGetItem("Hello", out s); // b receives true, s receives "HELLO". The item to search for. Returns the item from the set that was equal to . True if the set contains . False if the set does not contain . Adds a new item to the set. If the set already contains an item equal to , that item is replaced with . Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes approximately constant time, regardless of the number of items in the set. The item to add to the set. True if the set already contained an item equal to (which was replaced), false otherwise. Adds a new item to the set. If the set already contains an item equal to , that item is replaced with . Equality between items is determined by the comparison instance or delegate used to create the set. Adding an item takes approximately constant time, regardless of the number of items in the set. The item to add to the set. True if the set already contained an item equal to (which was replaced), false otherwise. Adds all the items in to the set. If the set already contains an item equal to one of the items in , that item will be replaced. Equality between items is determined by the comparison instance or delegate used to create the set. Adding the collection takes time O(M), where M is the number of items in . A collection of items to add to the set. Searches the set for an item equal to , and if found, removes it from the set. If not found, the set is unchanged. Equality between items is determined by the comparison instance or delegate used to create the set. Removing an item from the set takes approximately constant time, regardless of the size of the set. The item to remove. True if was found and removed. False if was not in the set. Removes all the items in from the set. Equality between items is determined by the comparison instance or delegate used to create the set. Removing the collection takes time O(M), where M is the number of items in . A collection of items to remove from the set. The number of items removed from the set. is null. Removes all items from the set. Clearing the set takes a constant amount of time, regardless of the number of items in it. Check that this set and another set were created with the same comparison mechanism. Throws exception if not compatible. Other set to check comparision mechanism. If otherSet and this set don't use the same method for comparing items. Determines if this set is a superset of another set. Neither set is modified. This set is a superset of if every element in is also in this set. IsSupersetOf is computed in time O(M), where M is the size of the . Set to compare to. True if this is a superset of . This set and don't use the same method for comparing items. Determines if this set is a proper superset of another set. Neither set is modified. This set is a proper superset of if every element in is also in this set. Additionally, this set must have strictly more items than . IsProperSubsetOf is computed in time O(M), where M is the size of . Set to compare to. True if this is a proper superset of . This set and don't use the same method for comparing items. Determines if this set is a subset of another set. Neither set is modified. This set is a subset of if every element in this set is also in . IsSubsetOf is computed in time O(N), where N is the size of the this set. Set to compare to. True if this is a subset of . This set and don't use the same method for comparing items. Determines if this set is a proper subset of another set. Neither set is modified. This set is a subset of if every element in this set is also in . Additionally, this set must have strictly fewer items than . IsProperSubsetOf is computed in time O(N), where N is the size of the this set. Set to compare to. True if this is a proper subset of . This set and don't use the same method for comparing items. Determines if this set is equal to another set. This set is equal to if they contain the same items. IsEqualTo is computed in time O(N), where N is the number of items in this set. Set to compare to True if this set is equal to , false otherwise. This set and don't use the same method for comparing items. Determines if this set is disjoint from another set. Two sets are disjoint if no item from one set is equal to any item in the other set. The answer is computed in time O(N), where N is the size of the smaller set. Set to check disjointness with. True if the two sets are disjoint, false otherwise. This set and don't use the same method for comparing items. Computes the union of this set with another set. The union of two sets is all items that appear in either or both of the sets. This set receives the union of the two sets, the other set is unchanged. If equal items appear in both sets, the union will include an arbitrary choice of one of the two equal items. The union of two sets is computed in time O(M + N), where M is the size of the larger set, and N is the size of the smaller set. Set to union with. This set and don't use the same method for comparing items. Computes the union of this set with another set. The union of two sets is all items that appear in either or both of the sets. A new set is created with the union of the sets and is returned. This set and the other set are unchanged. If equal items appear in both sets, the union will include an arbitrary choice of one of the two equal items. The union of two sets is computed in time O(M + N), where M is the size of the one set, and N is the size of the other set. Set to union with. The union of the two sets. This set and don't use the same method for comparing items. Computes the intersection of this set with another set. The intersection of two sets is all items that appear in both of the sets. This set receives the intersection of the two sets, the other set is unchanged. When equal items appear in both sets, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two sets is computed in time O(N), where N is the size of the smaller set. Set to intersection with. This set and don't use the same method for comparing items. Computes the intersection of this set with another set. The intersection of two sets is all items that appear in both of the sets. A new set is created with the intersection of the sets and is returned. This set and the other set are unchanged. When equal items appear in both sets, the intersection will include an arbitrary choice of one of the two equal items. The intersection of two sets is computed in time O(N), where N is the size of the smaller set. Set to intersection with. The intersection of the two sets. This set and don't use the same method for comparing items. Computes the difference of this set with another set. The difference of these two sets is all items that appear in this set, but not in . This set receives the difference of the two sets; the other set is unchanged. The difference of two sets is computed in time O(N), where N is the size of the smaller set. Set to difference with. This set and don't use the same method for comparing items. Computes the difference of this set with another set. The difference of these two sets is all items that appear in this set, but not in . A new set is created with the difference of the sets and is returned. This set and the other set are unchanged. The difference of two sets is computed in time O(N), where N is the size of the smaller set. Set to difference with. The difference of the two sets. This set and don't use the same method for comparing items. Computes the symmetric difference of this set with another set. The symmetric difference of two sets is all items that appear in either of the sets, but not both. This set receives the symmetric difference of the two sets; the other set is unchanged. The symmetric difference of two sets is computed in time O(N), where N is the size of the smaller set. Set to symmetric difference with. This set and don't use the same method for comparing items. Computes the symmetric difference of this set with another set. The symmetric difference of two sets is all items that appear in either of the sets, but not both. A new set is created with the symmetric difference of the sets and is returned. This set and the other set are unchanged. The symmetric difference of two sets is computed in time O(N), where N is the size of the smaller set. Set to symmetric difference with. The symmetric difference of the two sets. This set and don't use the same method for comparing items. Returns the IEqualityComparer<T> used to compare items in this set. If the set was created using a comparer, that comparer is returned. Otherwise the default comparer for T (EqualityComparer<T>.Default) is returned. Returns the number of items in the set. The size of the set is returned in constant time. The number of items in the set. A collection of methods to create IComparer and IEqualityComparer instances in various ways. Given an Comparison on a type, returns an IComparer on that type. T to compare. Comparison delegate on T IComparer that uses the comparison. Given an IComparer on TKey, returns an IComparer on key-value Pairs. TKey of the pairs TValue of the apris IComparer on TKey IComparer for comparing key-value pairs. Given an IEqualityComparer on TKey, returns an IEqualityComparer on key-value Pairs. TKey of the pairs TValue of the apris IComparer on TKey IEqualityComparer for comparing key-value pairs. Given an IComparer on TKey and TValue, returns an IComparer on key-value Pairs of TKey and TValue, comparing first keys, then values. TKey of the pairs TValue of the apris IComparer on TKey IComparer on TValue IComparer for comparing key-value pairs. Given an Comparison on TKey, returns an IComparer on key-value Pairs. TKey of the pairs TValue of the apris Comparison delegate on TKey IComparer for comparing key-value pairs. Given an element type, check that it implements IComparable<T> or IComparable, then returns a IComparer that can be used to compare elements of that type. The IComparer<T> instance. T does not implement IComparable<T>. Given an key and value type, check that TKey implements IComparable<T> or IComparable, then returns a IComparer that can be used to compare KeyValuePairs of those types. The IComparer<KeyValuePair<TKey, TValue>> instance. TKey does not implement IComparable<T>. Class to change an IEqualityComparer<TKey> to an IEqualityComparer<KeyValuePair<TKey, TValue>> Only the keys are compared. Class to change an IComparer<TKey> to an IComparer<KeyValuePair<TKey, TValue>> Only the keys are compared. Class to change an IComparer<TKey> and IComparer<TValue> to an IComparer<KeyValuePair<TKey, TValue>> Keys are compared, followed by values. Class to change an Comparison<T> to an IComparer<T>. Class to change an Comparison<TKey> to an IComparer<KeyValuePair<TKey, TValue>>. GetHashCode cannot be used on this class. Describes what to do if a key is already in the tree when doing an insertion. The base implementation for various collections classes that use Red-Black trees as part of their implementation. This class should not (and can not) be used directly by end users; it's only for internal use by the collections package. The Red-Black tree manages items of type T, and uses a IComparer<T> that compares items to sort the tree. Multiple items can compare equal and be stored in the tree. Insert, Delete, and Find operations are provided in their full generality; all operations allow dealing with either the first or last of items that compare equal. Create an array of Nodes big enough for any path from top to bottom. This is cached, and reused from call-to-call, so only one can be around at a time per tree. The node stack. Must be called whenever there is a structural change in the tree. Causes changeStamp to be changed, which causes any in-progress enumerations to throw exceptions. Checks the given stamp against the current change stamp. If different, the collection has changed during enumeration and an InvalidOperationException must be thrown changeStamp at the start of the enumeration. Initialize a red-black tree, using the given interface instance to compare elements. Only Compare is used on the IComparer interface. The IComparer<T> used to sort keys. Clone the tree, returning a new tree containing the same items. Should take O(N) take. Clone version of this tree. Finds the key in the tree. If multiple items in the tree have compare equal to the key, finds the first or last one. Optionally replaces the item with the one searched for. Key to search for. If true, find the first of duplicates, else finds the last of duplicates. If true, replaces the item with key (if function returns true) Returns the found item, before replacing (if function returns true). True if the key was found. Finds the index of the key in the tree. If multiple items in the tree have compare equal to the key, finds the first or last one. Key to search for. If true, find the first of duplicates, else finds the last of duplicates. Index of the item found if the key was found, -1 if not found. Find the item at a particular index in the tree. The zero-based index of the item. Must be >= 0 and < Count. The item at the particular index. Insert a new node into the tree, maintaining the red-black invariants. Algorithm from Sedgewick, "Algorithms". The new item to insert What to do if equal item is already present. If false, returned, the previous item. false if duplicate exists, otherwise true. Split a node with two red children (a 4-node in the 2-3-4 tree formalism), as part of an insert operation. great grand-parent of "node", can be null near root grand-parent of "node", can be null near root parent of "node", can be null near root Node to split, can't be null Indicates that rotation(s) occurred in the tree. Node to continue searching from. Performs a rotation involving the node, it's child and grandchild. The counts of childs and grand-child are set the correct values from their children; this is important if they have been adjusted on the way down the try as part of an insert/delete. Top node of the rotation. Can be null if child==root. One child of "node". Not null. One child of "child". Not null. Deletes a key from the tree. If multiple elements are equal to key, deletes the first or last. If no element is equal to the key, returns false. Top-down algorithm from Weiss. Basic plan is to move down in the tree, rotating and recoloring along the way to always keep the current node red, which ensures that the node we delete is red. The details are quite complex, however! Key to delete. Which item to delete if multiple are equal to key. True to delete the first, false to delete last. Returns the item that was deleted, if true returned. True if an element was deleted, false if no element had specified key. Enumerate all the items in-order An enumerator for all the items, in order. The tree has an item added or deleted during the enumeration. Enumerate all the items in-order An enumerator for all the items, in order. The tree has an item added or deleted during the enumeration. Gets a range tester that defines a range by first and last items. If true, bound the range on the bottom by first. If useFirst is true, the inclusive lower bound. If true, bound the range on the top by last. If useLast is true, the exclusive upper bound. A RangeTester delegate that tests for an item in the given range. Gets a range tester that defines a range by first and last items. The lower bound. True if the lower bound is inclusive, false if exclusive. The upper bound. True if the upper bound is inclusive, false if exclusive. A RangeTester delegate that tests for an item in the given range. Gets a range tester that defines a range by a lower bound. The lower bound. True if the lower bound is inclusive, false if exclusive. A RangeTester delegate that tests for an item in the given range. Gets a range tester that defines a range by upper bound. The upper bound. True if the upper bound is inclusive, false if exclusive. A RangeTester delegate that tests for an item in the given range. Gets a range tester that defines a range by all items equal to an item. The item that is contained in the range. A RangeTester delegate that tests for an item equal to . A range tester that defines a range that is the entire tree. Item to test. Always returns 0. Enumerate the items in a custom range in the tree. The range is determined by a RangeTest delegate. Tests an item against the custom range. An IEnumerable<T> that enumerates the custom range in order. The tree has an item added or deleted during the enumeration. Enumerate all the items in a custom range, under and including node, in-order. Tests an item against the custom range. Node to begin enumeration. May be null. An enumerable of the items. The tree has an item added or deleted during the enumeration. Enumerate the items in a custom range in the tree, in reversed order. The range is determined by a RangeTest delegate. Tests an item against the custom range. An IEnumerable<T> that enumerates the custom range in reversed order. The tree has an item added or deleted during the enumeration. Enumerate all the items in a custom range, under and including node, in reversed order. Tests an item against the custom range. Node to begin enumeration. May be null. An enumerable of the items, in reversed oreder. The tree has an item added or deleted during the enumeration. Deletes either the first or last item from a range, as identified by a RangeTester delegate. If the range is empty, returns false. Top-down algorithm from Weiss. Basic plan is to move down in the tree, rotating and recoloring along the way to always keep the current node red, which ensures that the node we delete is red. The details are quite complex, however! Range to delete from. If true, delete the first item from the range, else the last. Returns the item that was deleted, if true returned. True if an element was deleted, false if the range is empty. Delete all the items in a range, identified by a RangeTester delegate. The delegate that defines the range to delete. The number of items deleted. Count the items in a custom range in the tree. The range is determined by a RangeTester delegate. The delegate that defines the range. The number of items in the range. Count all the items in a custom range, under and including node. The delegate that defines the range. Node to begin enumeration. May be null. This node and all under it are either in the range or below it. This node and all under it are either in the range or above it. The number of items in the range, under and include node. Find the first item in a custom range in the tree, and it's index. The range is determined by a RangeTester delegate. The delegate that defines the range. Returns the item found, if true was returned. Index of first item in range if range is non-empty, -1 otherwise. Find the last item in a custom range in the tree, and it's index. The range is determined by a RangeTester delegate. The delegate that defines the range. Returns the item found, if true was returned. Index of the item if range is non-empty, -1 otherwise. Returns the number of elements in the tree. The class that is each node in the red-black tree. Add one to the Count. Subtract one from the Count. The current Count must be non-zero. Clones a node and all its descendants. The cloned node. Is this a red node? Get or set the Count field -- a 31-bit field that holds the number of nodes at or below this level. A delegate that tests if an item is within a custom range. The range must be a contiguous range of items with the ordering of this tree. The range test function must test if an item is before, withing, or after the range. Item to test against the range. Returns negative if item is before the range, zero if item is withing the range, and positive if item is after the range. OrderedDictionary<TKey, TValue> is a collection that maps keys of type TKey to values of type TValue. The keys are maintained in a sorted order, and at most one value is permitted for each key.

The keys are compared in one of three ways. If TKey implements IComparable<TKey> or IComparable, then the CompareTo method of that interface will be used to compare elements. Alternatively, a comparison function can be passed in either as a delegate, or as an instance of IComparer<TKey>.

OrderedDictionary is implemented as a balanced binary tree. Inserting, deleting, and looking up an an element all are done in log(N) type, where N is the number of keys in the tree.

is similar, but uses hashing instead of comparison, and does not maintain the keys in sorted order.

Helper function to create a new KeyValuePair struct. The key. The value. A new KeyValuePair. Helper function to create a new KeyValuePair struct with a default value. The key. A new KeyValuePair. Creates a new OrderedDictionary. The TKey must implemented IComparable<TKey> or IComparable. The CompareTo method of this interface will be used to compare keys in this dictionary. TKey does not implement IComparable<TKey>. Creates a new OrderedDictionary. The Compare method of the passed comparison object will be used to compare keys in this dictionary. The GetHashCode and Equals methods of the provided IComparer<TKey> will never be called, and need not be implemented. An instance of IComparer<TKey> that will be used to compare keys. Creates a new OrderedDictionary. The passed delegate will be used to compare keys in this dictionary. A delegate to a method that will be used to compare keys. Creates a new OrderedDictionary. The TKey must implemented IComparable<TKey> or IComparable. The CompareTo method of this interface will be used to compare keys in this dictionary. A collection and keys and values (typically another dictionary) is used to initialized the contents of the dictionary. A collection of keys and values whose contents are used to initialized the dictionary. TKey does not implement IComparable<TKey>. Creates a new OrderedDictionary. The Compare method of the passed comparison object will be used to compare keys in this dictionary. A collection and keys and values (typically another dictionary) is used to initialized the contents of the dictionary. The GetHashCode and Equals methods of the provided IComparer<TKey> will never be called, and need not be implemented. A collection of keys and values whose contents are used to initialized the dictionary. An instance of IComparer<TKey> that will be used to compare keys. Creates a new OrderedDictionary. The passed delegate will be used to compare keys in this dictionary. A collection and keys and values (typically another dictionary) is used to initialized the contents of the dictionary. A collection of keys and values whose contents are used to initialized the dictionary. A delegate to a method that will be used to compare keys. Creates a new OrderedDictionary. The passed comparer will be used to compare key-value pairs in this dictionary. Used internally from other constructors. A collection of keys and values whose contents are used to initialized the dictionary. An IComparer that will be used to compare keys. An IComparer that will be used to compare key-value pairs. Creates a new OrderedDictionary. The passed comparison delegate will be used to compare keys in this dictionary, and the given tree is used. Used internally for Clone(). An IComparer that will be used to compare keys. A delegate to a method that will be used to compare key-value pairs. RedBlackTree that contains the data for the dictionary. Makes a shallow clone of this dictionary; i.e., if keys or values of the dictionary are reference types, then they are not cloned. If TKey or TValue is a value type, then each element is copied as if by simple assignment. Cloning the dictionary takes time O(N), where N is the number of keys in the dictionary. The cloned dictionary. Throw an InvalidOperationException indicating that this type is not cloneable. Type to test. Makes a deep clone of this dictionary. A new dictionary is created with a clone of each entry of this dictionary, by calling ICloneable.Clone on each element. If TKey or TValue is a value type, then each element is copied as if by simple assignment. If TKey or TValue is a reference type, it must implement ICloneable. Otherwise, an InvalidOperationException is thrown. Cloning the dictionary takes time O(N log N), where N is the number of keys in the dictionary. The cloned dictionary. TKey or TValue is a reference type that does not implement ICloneable. Returns a View collection that can be used for enumerating the keys and values in the collection in reversed order.

Typically, this method is used in conjunction with a foreach statement. For example: foreach(KeyValuePair<TKey, TValue> pair in dictionary.Reversed()) { // process pair }

If an entry is added to or deleted from the dictionary while the View is being enumerated, then the enumeration will end with an InvalidOperationException.

Calling Reverse does not copy the data in the dictionary, and the operation takes constant time.

An OrderedDictionary.View of key-value pairs in reverse order.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only keys that are greater than and less than are included. The keys are enumerated in sorted order. Keys equal to the end points of the range can be included or excluded depending on the and parameters.

If is greater than or equal to , the returned collection is empty.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.Range(from, true, to, false)) { // process pair }

Calling Range does not copy the data in the dictionary, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--keys equal to the lower bound will be included in the range. If false, the lower bound is exclusive--keys equal to the lower bound will not be included in the range. The upper bound of the range. If true, the upper bound is inclusive--keys equal to the upper bound will be included in the range. If false, the upper bound is exclusive--keys equal to the upper bound will not be included in the range. An OrderedDictionary.View of key-value pairs in the given range.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only keys that are greater than (and optionally, equal to) are included. The keys are enumerated in sorted order. Keys equal to can be included or excluded depending on the parameter.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.RangeFrom(from, true)) { // process pair }

Calling RangeFrom does not copy of the data in the dictionary, and the operation takes constant time.

The lower bound of the range. If true, the lower bound is inclusive--keys equal to the lower bound will be included in the range. If false, the lower bound is exclusive--keys equal to the lower bound will not be included in the range. An OrderedDictionary.View of key-value pairs in the given range.
Returns a collection that can be used for enumerating some of the keys and values in the collection. Only items that are less than (and optionally, equal to) are included. The items are enumerated in sorted order. Items equal to can be included or excluded depending on the parameter.

The sorted order of the keys is determined by the comparison instance or delegate used to create the dictionary.

Typically, this property is used in conjunction with a foreach statement. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.RangeFrom(from, false)) { // process pair }

Calling RangeTo does not copy the data in the dictionary, and the operation takes constant time.

The upper bound of the range. If true, the upper bound is inclusive--keys equal to the upper bound will be included in the range. If false, the upper bound is exclusive--keys equal to the upper bound will not be included in the range. An OrderedDictionary.View of key-value pairs in the given range.
Removes the key (and associated value) from the collection that is equal to the passed in key. If no key in the dictionary is equal to the passed key, false is returned and the dictionary is unchanged. Equality between keys is determined by the comparison instance or delegate used to create the dictionary. The key to remove. True if the key was found and removed. False if the key was not found. Removes all keys and values from the dictionary. Clearing the dictionary takes a constant amount of time, regardless of the number of keys in it. Finds a key in the dictionary. If the dictionary already contains a key equal to the passed key, then the existing value is returned via value. If the dictionary doesn't contain that key, then value is associated with that key. between keys is determined by the comparison instance or delegate used to create the dictionary. This method takes time O(log N), where N is the number of keys in the dictionary. If a value is added, It is more efficient than calling TryGetValue followed by Add, because the dictionary is not searched twice. The new key. The new value to associated with that key, if the key isn't present. If the key was present, returns the exist value associated with that key. True if key was already present, false if key wasn't present (and a new value was added). Adds a new key and value to the dictionary. If the dictionary already contains a key equal to the passed key, then an ArgumentException is thrown Equality between keys is determined by the comparison instance or delegate used to create the dictionary. Adding an key and value takes time O(log N), where N is the number of keys in the dictionary. The new key. "null" is a valid key value. The new value to associated with that key. key is already present in the dictionary Changes the value associated with a given key. If the dictionary does not contain a key equal to the passed key, then an ArgumentException is thrown.

Unlike adding or removing an element, changing the value associated with a key can be performed while an enumeration (foreach) on the the dictionary is in progress.

Equality between keys is determined by the comparison instance or delegate used to create the dictionary.

Replace takes time O(log N), where N is the number of entries in the dictionary.

The new key. The new value to associated with that key. key is not present in the dictionary
Adds multiple key-value pairs to a dictionary. If a key exists in both the current instance and dictionaryToAdd, then the value is updated with the value from (no exception is thrown). Since IDictionary<TKey,TValue> inherits from IEnumerable<KeyValuePair<TKey,TValue>>, this method can be used to merge one dictionary into another. AddMany takes time O(M log (N+M)), where M is the size of , and N is the size of this dictionary. A collection of keys and values whose contents are added to the current dictionary. Removes all the keys found in another collection (such as an array or List<TKey>). Each key in keyCollectionToRemove is removed from the dictionary. Keys that are not present are ignored. RemoveMany takes time O(M log N), where M is the size of keyCollectionToRemove, and N is this size of this collection. The number of keys removed from the dictionary. A collection of keys to remove from the dictionary. Determines if this dictionary contains a key equal to . The dictionary is not changed. Searching the dictionary for a key takes time O(log N), where N is the number of keys in the dictionary. The key to search for. True if the dictionary contains key. False if the dictionary does not contain key. Determines if this dictionary contains a key equal to . If so, the value associated with that key is returned through the value parameter. TryGetValue takes time O(log N), where N is the number of entries in the dictionary. The key to search for. Returns the value associated with key, if true was returned. True if the dictionary contains key. False if the dictionary does not contain key. Returns an enumerator that enumerates all the entries in the dictionary. Each entry is returned as a KeyValuePair<TKey,TValue>. The entries are enumerated in the sorted order of the keys.

Typically, this method is not called directly. Instead the "foreach" statement is used to enumerate the elements of the dictionary, which uses this method implicitly.

If an element is added to or deleted from the dictionary while it is being enumerated, then the enumeration will end with an InvalidOperationException.

Enumeration all the entries in the dictionary takes time O(N log N), where N is the number of entries in the dictionary.

An enumerator for enumerating all the elements in the OrderedDictionary.
Implements ICloneable.Clone. Makes a shallow clone of this dictionary; i.e., if keys or values are reference types, then they are not cloned. The cloned dictionary. Returns the IComparer<T> used to compare keys in this dictionary. If the dictionary was created using a comparer, that comparer is returned. If the dictionary was created using a comparison delegate, then a comparer equivalent to that delegate is returned. Otherwise the default comparer for TKey (Comparer<TKey>.Default) is returned. Gets or sets the value associated with a given key. When getting a value, if this key is not found in the collection, then an ArgumentException is thrown. When setting a value, the value replaces any existing value in the dictionary. The indexer takes time O(log N), where N is the number of entries in the dictionary. The value associated with the key A value is being retrieved, and the key is not present in the dictionary. is null. Returns the number of keys in the dictionary. The size of the dictionary is returned in constant time.. The number of keys in the dictionary. The OrderedDictionary<TKey,TValue>.View class is used to look at a subset of the keys and values inside an ordered dictionary. It is returned from the Range, RangeTo, RangeFrom, and Reversed methods.

Views are dynamic. If the underlying dictionary changes, the view changes in sync. If a change is made to the view, the underlying dictionary changes accordingly.

Typically, this class is used in conjunction with a foreach statement to enumerate the keys and values in a subset of the OrderedDictionary. For example:

foreach(KeyValuePair<TKey, TValue> pair in dictionary.Range(from, to)) { // process pair }
Initialize the View. Associated OrderedDictionary to be viewed. Range tester that defines the range being used. If true, then rangeTester defines the entire tree. Is the view enuemerated in reverse order? Determine if the given key lies within the bounds of this view. Key to test. True if the key is within the bounds of this view. Enumerate all the keys and values in this view. An IEnumerator of KeyValuePairs with the keys and views in this view. Tests if the key is present in the part of the dictionary being viewed. Key to check for. True if the key is within this view. Determines if this view contains a key equal to . If so, the value associated with that key is returned through the value parameter. The key to search for. Returns the value associated with key, if true was returned. True if the key is within this view. Removes the key (and associated value) from the underlying dictionary of this view. that is equal to the passed in key. If no key in the view is equal to the passed key, the dictionary and view are unchanged. The key to remove. True if the key was found and removed. False if the key was not found. Removes all the keys and values within this view from the underlying OrderedDictionary. The following removes all the keys that start with "A" from an OrderedDictionary. dictionary.Range("A", "B").Clear(); Creates a new View that has the same keys and values as this, in the reversed order. A new View that has the reversed order of this view. Number of keys in this view. Number of keys that lie within the bounds the view. Gets or sets the value associated with a given key. When getting a value, if this key is not found in the collection, then an ArgumentException is thrown. When setting a value, the value replaces any existing value in the dictionary. When setting a value, the key must be within the range of keys being viewed. The value associated with the key. A value is being retrieved, and the key is not present in the dictionary, or a value is being set, and the key is outside the range of keys being viewed by this View. A holder class for localizable strings that are used. Currently, these are not loaded from resources, but just coded into this class. To make this library localizable, simply change this class to load the given strings from resources. Stores a triple of objects within a single struct. This struct is useful to use as the T of a collection, or as the TKey or TValue of a dictionary. Comparers for the first and second type that are used to compare values. The first element of the triple. The second element of the triple. The thrid element of the triple. Creates a new triple with given elements. The first element of the triple. The second element of the triple. The third element of the triple. Determines if this triple is equal to another object. The triple is equal to another object if that object is a Triple, all element types are the same, and the all three elements compare equal using object.Equals. Object to compare for equality. True if the objects are equal. False if the objects are not equal. Determines if this triple is equal to another triple. Two triples are equal if the all three elements compare equal using IComparable<T>.Equals or object.Equals. Triple to compare with for equality. True if the triples are equal. False if the triples are not equal. Returns a hash code for the triple, suitable for use in a hash-table or other hashed collection. Two triples that compare equal (using Equals) will have the same hash code. The hash code for the triple is derived by combining the hash codes for each of the two elements of the triple. The hash code. Compares this triple to another triple of the some type. The triples are compared by using the IComparable<T> or IComparable interface on TFirst, TSecond, and TThird. The triples are compared by their first elements first, if their first elements are equal, then they are compared by their second elements. If their second elements are also equal, then they are compared by their third elements. If TFirst, TSecond, or TThird does not implement IComparable<T> or IComparable, then an NotSupportedException is thrown, because the triples cannot be compared. The triple to compare to. An integer indicating how this triple compares to . Less than zero indicates this triple is less than . Zero indicate this triple is equals to . Greater than zero indicates this triple is greater than . Either FirstSecond, TSecond, or TThird is not comparable via the IComparable<T> or IComparable interfaces. Compares this triple to another triple of the some type. The triples are compared by using the IComparable<T> or IComparable interface on TFirst, TSecond, and TThird. The triples are compared by their first elements first, if their first elements are equal, then they are compared by their second elements. If their second elements are also equal, then they are compared by their third elements. If TFirst, TSecond, or TThird does not implement IComparable<T> or IComparable, then an NotSupportedException is thrown, because the triples cannot be compared. The triple to compare to. An integer indicating how this triple compares to . Less than zero indicates this triple is less than . Zero indicate this triple is equals to . Greater than zero indicates this triple is greater than . is not of the correct type. Either FirstSecond, TSecond, or TThird is not comparable via the IComparable<T> or IComparable interfaces. Returns a string representation of the triple. The string representation of the triple is of the form: First: {0}, Second: {1}, Third: {2} where {0} is the result of First.ToString(), {1} is the result of Second.ToString(), and {2} is the result of Third.ToString() (or "null" if they are null.) The string representation of the triple. Determines if two triples are equal. Two triples are equal if the all three elements compare equal using IComparable<T>.Equals or object.Equals. First triple to compare. Second triple to compare. True if the triples are equal. False if the triples are not equal. Determines if two triples are not equal. Two triples are equal if the all three elements compare equal using IComparable<T>.Equals or object.Equals. First triple to compare. Second triple to compare. True if the triples are not equal. False if the triples are equal. A holder class for various internal utility functions that need to be shared. Determine if a type is cloneable: either a value type or implementing ICloneable. Type to check. Returns if the type is a value type, and does not implement ICloneable. True if the type is cloneable. Returns the simple name of the class, for use in exception messages. The simple name of this class. Wrap an enumerable so that clients can't get to the underlying implementation via a down-case Enumerable to wrap. A wrapper around the enumerable. Gets the hash code for an object using a comparer. Correctly handles null. Item to get hash code for. Can be null. The comparer to use. The hash code for the item. Wrap an enumerable so that clients can't get to the underlying implementation via a down-cast. Create the wrapper around an enumerable. IEnumerable to wrap.
================================================ FILE: Documentation/Requirements/PowerCollections/Binaries_Signed_4.5/PowerCollections.dll.config ================================================ ================================================ FILE: Documentation/Requirements/Requirements for agent enviroments.txt ================================================ .NET 4.5.1 installed .NET Framework 4.5 Software Development Kit http://msdn.microsoft.com/en-us/library/windows/desktop/hh852363.aspx PowerCollections.dll should be added to the GAC gacutil /i PowerCollections.dll http://msdn.microsoft.com/en-us/library/ex0ss12c.aspx If gacutil doesn't work, paste the assembly in C:\Windows\Microsoft.NET\Framework64\v4.0.30319 and C:\Windows\Microsoft.NET\Framework\v4.0.30319 GCC compiler installed Firewall should block all unnecessary ips and ports System is tested in Win8 and Windows Server 2012 R2 (Preview) The executor process should be with Realtime priority When executor process is run for the first time, a sample process should be run in order for system dlls to be cached. For tests with strange characters to work correctly the non-Unicode setting in Windows settings must be set to proper encoding (for example: Windows-1251) ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {description} Copyright (C) {year} {fullname} This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. {signature of Ty Coon}, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ================================================ FILE: Open Judge System/Data/OJS.Data/App.config ================================================ 
================================================ FILE: Open Judge System/Data/OJS.Data/Configurations/ParticipantAnswersConfiguration.cs ================================================ namespace OJS.Data.Configurations { using System.Data.Entity.ModelConfiguration; using OJS.Data.Models; public class ParticipantAnswersConfiguration : EntityTypeConfiguration { public ParticipantAnswersConfiguration() { /* * The following configuration fixes: * Introducing FOREIGN KEY constraint 'FK_dbo.ParticipantAnswers_dbo.ContestQuestions_ContestQuestionId' on table 'ParticipantAnswers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. */ this.HasRequired(x => x.ContestQuestion) .WithMany(x => x.ParticipantAnswers) .HasForeignKey(x => x.ContestQuestionId) .WillCascadeOnDelete(false); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Configurations/TestRunConfiguration.cs ================================================ namespace OJS.Data.Configurations { using System.Data.Entity.ModelConfiguration; using OJS.Data.Models; public class TestRunConfiguration : EntityTypeConfiguration { public TestRunConfiguration() { /* * The following configuration fixes: * Introducing FOREIGN KEY constraint 'FK_dbo.TestRuns_dbo.Tests_TestId' on table 'TestRuns' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. */ this.HasRequired(x => x.Test) .WithMany(x => x.TestRuns) .HasForeignKey(x => x.TestId) .WillCascadeOnDelete(false); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Configurations/UserProfileConfiguration.cs ================================================ namespace OJS.Data.Configurations { using System.Data.Entity.ModelConfiguration; using OJS.Data.Models; public class UserProfileConfiguration : EntityTypeConfiguration { public UserProfileConfiguration() { this.Property(x => x.UserName) .IsRequired() .HasMaxLength(50) .IsUnicode(false); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/IOjsData.cs ================================================ namespace OJS.Data { using System; using Microsoft.AspNet.Identity.EntityFramework; using OJS.Data.Contracts; using OJS.Data.Models; using OJS.Data.Repositories.Contracts; public interface IOjsData : IDisposable { IContestsRepository Contests { get; } IDeletableEntityRepository Problems { get; } ITestRepository Tests { get; } IDeletableEntityRepository News { get; } IDeletableEntityRepository Events { get; } IDeletableEntityRepository ContestCategories { get; } IDeletableEntityRepository ContestQuestions { get; } IDeletableEntityRepository ContestQuestionAnswers { get; } ITestRunsRepository TestRuns { get; } IDeletableEntityRepository FeedbackReports { get; } IDeletableEntityRepository Checkers { get; } IDeletableEntityRepository Resources { get; } IUsersRepository Users { get; } IRepository Roles { get; } IParticipantsRepository Participants { get; } IRepository Settings { get; } ISubmissionsRepository Submissions { get; } IRepository SubmissionTypes { get; } IDeletableEntityRepository SourceCodes { get; } IRepository AccessLogs { get; } IOjsDbContext Context { get; } int SaveChanges(); } } ================================================ FILE: Open Judge System/Data/OJS.Data/IOjsDbContext.cs ================================================ namespace OJS.Data { using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; using OJS.Data.Models; public interface IOjsDbContext : IDisposable { IDbSet Settings { get; } IDbSet Contests { get; } IDbSet Problems { get; } IDbSet News { get; } IDbSet Events { get; } IDbSet Participants { get; } IDbSet ContestCategories { get; set; } IDbSet ContestQuestions { get; set; } IDbSet ContestQuestionAnswers { get; set; } IDbSet Checkers { get; set; } IDbSet Tests { get; set; } IDbSet Submissions { get; set; } IDbSet SubmissionTypes { get; set; } IDbSet SourceCodes { get; set; } IDbSet FeedbackReports { get; set; } IDbSet ParticipantAnswers { get; set; } IDbSet AccessLogs { get; set; } DbContext DbContext { get; } int SaveChanges(); void ClearDatabase(); DbEntityEntry Entry(TEntity entity) where TEntity : class; IDbSet Set() where T : class; } } ================================================ FILE: Open Judge System/Data/OJS.Data/Migrations/DefaultMigrationConfiguration.cs ================================================ namespace OJS.Data.Migrations { using System; using System.Collections.Generic; using System.Data.Entity.Migrations; using System.Linq; using Microsoft.AspNet.Identity.EntityFramework; using OJS.Common; using OJS.Common.Models; using OJS.Data.Models; public class DefaultMigrationConfiguration : DbMigrationsConfiguration { public DefaultMigrationConfiguration() { this.AutomaticMigrationsEnabled = true; this.AutomaticMigrationDataLossAllowed = true; } protected override void Seed(OjsDbContext context) { if (context.Roles.Any()) { return; } // this.SeedSubmissionsAndTestRuns(context); this.SeedRoles(context); this.SeedCheckers(context); this.SeedSubmissionTypes(context); // this.SeedContests(context); // this.SeedLongNews(context); // this.SeedRandomContests(context); // this.SeedProblem(context); // this.SeedTest(context); // this.SeedCategoryContestProblem(context); } //// TODO: Add seed with .Any() protected void SeedRoles(OjsDbContext context) { foreach (var entity in context.Roles) { context.Roles.Remove(entity); } context.Roles.AddOrUpdate(new IdentityRole(GlobalConstants.AdministratorRoleName)); } protected void SeedCheckers(OjsDbContext context) { var checkers = new[] { new Checker { Name = "Exact", DllFile = "OJS.Workers.Checkers.dll", ClassName = "OJS.Workers.Checkers.ExactChecker", }, new Checker { Name = "Trim", DllFile = "OJS.Workers.Checkers.dll", ClassName = "OJS.Workers.Checkers.TrimChecker", }, new Checker { Name = "Sort lines", DllFile = "OJS.Workers.Checkers.dll", ClassName = "OJS.Workers.Checkers.SortChecker", }, new Checker { Name = "Case-insensitive", DllFile = "OJS.Workers.Checkers.dll", ClassName = "OJS.Workers.Checkers.CaseInsensitiveChecker", }, new Checker { Name = "Precision checker - 14", DllFile = "OJS.Workers.Checkers.dll", ClassName = "OJS.Workers.Checkers.PrecisionChecker", Parameter = "14", }, new Checker { Name = "Precision checker - 7", DllFile = "OJS.Workers.Checkers.dll", ClassName = "OJS.Workers.Checkers.PrecisionChecker", Parameter = "7", }, new Checker { Name = "Precision checker - 3", DllFile = "OJS.Workers.Checkers.dll", ClassName = "OJS.Workers.Checkers.PrecisionChecker", Parameter = "3", } }; context.Checkers.AddOrUpdate(x => x.Name, checkers); context.SaveChanges(); } protected void SeedSubmissionTypes(OjsDbContext context) { foreach (var entity in context.SubmissionTypes) { context.SubmissionTypes.Remove(entity); } context.SaveChanges(); var submissionTypes = new[] { new SubmissionType { Name = "File upload", CompilerType = CompilerType.None, AdditionalCompilerArguments = string.Empty, ExecutionStrategyType = ExecutionStrategyType.DoNothing, IsSelectedByDefault = false, AllowedFileExtensions = "zip,rar", AllowBinaryFilesUpload = true, }, new SubmissionType { Name = "C# code", CompilerType = CompilerType.CSharp, AdditionalCompilerArguments = "/optimize+ /nologo /reference:System.Numerics.dll /reference:PowerCollections.dll", ExecutionStrategyType = ExecutionStrategyType.CompileExecuteAndCheck, IsSelectedByDefault = true, AllowedFileExtensions = null, AllowBinaryFilesUpload = false, }, new SubmissionType { Name = "C++ code", CompilerType = CompilerType.CPlusPlusGcc, AdditionalCompilerArguments = "-pipe -mtune=generic -O3 -static-libgcc -static-libstdc++", ExecutionStrategyType = ExecutionStrategyType.CompileExecuteAndCheck, IsSelectedByDefault = false, AllowedFileExtensions = null, AllowBinaryFilesUpload = false, }, new SubmissionType { Name = "JavaScript code (NodeJS)", CompilerType = CompilerType.None, AdditionalCompilerArguments = string.Empty, ExecutionStrategyType = ExecutionStrategyType.NodeJsPreprocessExecuteAndCheck, IsSelectedByDefault = false, AllowedFileExtensions = null, AllowBinaryFilesUpload = false, }, new SubmissionType { Name = "JavaScript code (Mocha unit tests)", CompilerType = CompilerType.None, AdditionalCompilerArguments = "-R json", ExecutionStrategyType = ExecutionStrategyType .NodeJsPreprocessExecuteAndRunUnitTestsWithMocha, IsSelectedByDefault = false, AllowedFileExtensions = null, AllowBinaryFilesUpload = false, }, new SubmissionType { Name = "JavaScript code (DOM unit tests)", CompilerType = CompilerType.None, AdditionalCompilerArguments = "-R json", ExecutionStrategyType = ExecutionStrategyType .IoJsPreprocessExecuteAndRunJsDomUnitTests, IsSelectedByDefault = false, AllowedFileExtensions = null, AllowBinaryFilesUpload = false, }, new SubmissionType { Name = "C# project/solution", CompilerType = CompilerType.MsBuild, AdditionalCompilerArguments = "/t:rebuild /p:Configuration=Release,Optimize=true /verbosity:quiet /nologo", ExecutionStrategyType = ExecutionStrategyType.CompileExecuteAndCheck, IsSelectedByDefault = false, AllowedFileExtensions = "zip", AllowBinaryFilesUpload = true, }, new SubmissionType { Name = "C# test runner", CompilerType = CompilerType.MsBuild, AdditionalCompilerArguments = "/t:rebuild /p:Configuration=Release,Optimize=true /verbosity:quiet /nologo", ExecutionStrategyType = ExecutionStrategyType.CSharpTestRunner, IsSelectedByDefault = false, AllowedFileExtensions = "zip", AllowBinaryFilesUpload = true, }, new SubmissionType { Name = "Java code", CompilerType = CompilerType.Java, AdditionalCompilerArguments = string.Empty, ExecutionStrategyType = ExecutionStrategyType .JavaPreprocessCompileExecuteAndCheck, IsSelectedByDefault = false, AllowedFileExtensions = null, AllowBinaryFilesUpload = false, }, new SubmissionType { Name = "Java zip file", CompilerType = CompilerType.JavaZip, AdditionalCompilerArguments = string.Empty, ExecutionStrategyType = ExecutionStrategyType .JavaZipFileCompileExecuteAndCheck, IsSelectedByDefault = false, AllowedFileExtensions = "zip", AllowBinaryFilesUpload = true, }, new SubmissionType { Name = "Python code", CompilerType = CompilerType.None, AdditionalCompilerArguments = string.Empty, ExecutionStrategyType = ExecutionStrategyType .PythonExecuteAndCheck, IsSelectedByDefault = false, AllowedFileExtensions = null, AllowBinaryFilesUpload = false, }, new SubmissionType { Name = "PHP code (CGI)", CompilerType = CompilerType.None, AdditionalCompilerArguments = string.Empty, ExecutionStrategyType = ExecutionStrategyType.PhpCgiExecuteAndCheck, IsSelectedByDefault = false, AllowedFileExtensions = null, AllowBinaryFilesUpload = false, }, new SubmissionType { Name = "PHP code (CLI)", CompilerType = CompilerType.None, AdditionalCompilerArguments = string.Empty, ExecutionStrategyType = ExecutionStrategyType.PhpCliExecuteAndCheck, IsSelectedByDefault = false, AllowedFileExtensions = null, AllowBinaryFilesUpload = false, } }; context.SubmissionTypes.AddOrUpdate(x => x.Name, submissionTypes); context.SaveChanges(); } private void SeedCategoryContestProblem(IOjsDbContext context) { foreach (var categoryToBeDeleted in context.ContestCategories) { context.ContestCategories.Remove(categoryToBeDeleted); } foreach (var contestToBeDeleted in context.Contests) { context.Contests.Remove(contestToBeDeleted); } foreach (var problemToBeDeleted in context.Problems) { context.Problems.Remove(problemToBeDeleted); } var category = new ContestCategory { Name = "Category", OrderBy = 1, IsVisible = true, IsDeleted = false, }; var otherCategory = new ContestCategory { Name = "Other Category", OrderBy = 1, IsVisible = true, IsDeleted = false, }; var contest = new Contest { Name = "Contest", OrderBy = 1, PracticeStartTime = DateTime.Now.AddDays(-2), StartTime = DateTime.Now.AddDays(-2), IsVisible = true, IsDeleted = false, Category = category }; var otherContest = new Contest { Name = "Other Contest", OrderBy = 2, PracticeStartTime = DateTime.Now.AddDays(-2), StartTime = DateTime.Now.AddDays(-2), IsVisible = true, IsDeleted = false, Category = category }; var problem = new Problem { Name = "Problem", MaximumPoints = 100, TimeLimit = 10, MemoryLimit = 10, OrderBy = 1, ShowResults = true, IsDeleted = false, Contest = contest }; var otherProblem = new Problem { Name = "Other Problem", MaximumPoints = 100, TimeLimit = 10, MemoryLimit = 10, OrderBy = 1, ShowResults = true, IsDeleted = false, Contest = contest }; var test = new Test { InputDataAsString = "Input", OutputDataAsString = "Output", OrderBy = 0, IsTrialTest = false, Problem = problem, }; var user = new UserProfile { UserName = "Ifaka", Email = "Nekav@nekav.com" }; var participant = new Participant { Contest = contest, IsOfficial = false, User = user }; var submission = new Submission { Problem = problem, Participant = participant, CreatedOn = DateTime.Now }; for (int i = 0; i < 10; i++) { test.TestRuns.Add(new TestRun { MemoryUsed = 100, TimeUsed = 100, CheckerComment = "Checked!", ExecutionComment = "Executed!", ResultType = TestRunResultType.CorrectAnswer, Submission = submission }); } context.Problems.Add(problem); contest.Problems.Add(otherProblem); context.Contests.Add(otherContest); context.ContestCategories.Add(otherCategory); context.Tests.Add(test); } private void SeedSubmissionsAndTestRuns(OjsDbContext context) { foreach (var submission in context.Submissions) { context.Submissions.Remove(submission); } foreach (var testRun in context.TestRuns) { context.TestRuns.Remove(testRun); } foreach (var participantToDelete in context.Participants) { context.Participants.Remove(participantToDelete); } Random random = new Random(); List testRuns = new List(); var test = new Test { IsTrialTest = false, OrderBy = 1 }; for (int i = 0; i < 1000; i++) { testRuns.Add(new TestRun { TimeUsed = (random.Next() % 10) + 1, MemoryUsed = (random.Next() % 1500) + 200, ResultType = (TestRunResultType)(random.Next() % 5), Test = test }); } var contest = new Contest { Name = "Contest batka 2", StartTime = DateTime.Now.AddDays(1), EndTime = DateTime.Now.AddDays(2), IsDeleted = false, IsVisible = true, OrderBy = 1 }; var problem = new Problem { OldId = 0, Contest = contest, Name = "Problem", MaximumPoints = 100, MemoryLimit = 100, OrderBy = 1 }; var user = new UserProfile { UserName = "Ifaka", Email = "Nekav@nekav.com" }; var participant = new Participant { Contest = contest, IsOfficial = false, User = user }; for (int i = 0; i < 100; i++) { var submission = new Submission { Problem = problem, Participant = participant }; for (int j = 0; j < (random.Next() % 20) + 5; j++) { submission.TestRuns.Add(testRuns[random.Next() % 1000]); } context.Submissions.Add(submission); } } private void SeedContest(OjsDbContext context) { foreach (var entity in context.Contests) { context.Contests.Remove(entity); } context.Contests.Add(new Contest { Name = "Contest", }); context.SaveChanges(); } private void SeedProblem(OjsDbContext context) { foreach (var problem in context.Problems) { context.Problems.Remove(problem); } var contest = context.Contests.FirstOrDefault(x => x.Name == "Contest"); contest.Problems.Add(new Problem { Name = "Problem" }); contest.Problems.Add(new Problem { Name = "Other problem" }); context.SaveChanges(); } private void SeedTest(OjsDbContext context) { foreach (var entity in context.Tests) { context.Tests.Remove(entity); } var selectedProblem = context.Problems.FirstOrDefault(x => x.Name == "Problem" && !x.IsDeleted); selectedProblem.Tests.Add(new Test { InputDataAsString = "Trial input test 1", OutputDataAsString = "Trial output test 1", IsTrialTest = true }); selectedProblem.Tests.Add(new Test { InputDataAsString = "Trial input test 2", OutputDataAsString = "Trial output test 2", IsTrialTest = true }); for (int i = 0; i < 10; i++) { selectedProblem.Tests.Add(new Test { InputDataAsString = i.ToString(), OutputDataAsString = (i + 1).ToString(), IsTrialTest = false }); } var otherProblem = context.Problems.FirstOrDefault(x => x.Name == "Other problem" && !x.IsDeleted); otherProblem.Tests.Add(new Test { InputDataAsString = "Trial input test 1 other", OutputDataAsString = "Trial output test 1 other", IsTrialTest = true }); otherProblem.Tests.Add(new Test { InputDataAsString = "Trial input test 2 other", OutputDataAsString = "Trial output test 2 other", IsTrialTest = true }); for (int i = 0; i < 10; i++) { otherProblem.Tests.Add(new Test { InputDataAsString = i.ToString() + "other", OutputDataAsString = (i + 1).ToString() + "other", IsTrialTest = false }); } } private void SeedLongNews(OjsDbContext context) { foreach (var news in context.News) { context.News.Remove(news); } for (int i = 1; i < 150; i++) { context.News.Add( new News { IsVisible = true, Author = "Author", Source = "Source", Title = "News " + i, Content = "Very Some long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long news", }); context.News.Add( new News { Author = "Author", Source = "Source", IsVisible = false, Title = "This should not be visible!", Content = "Very Some long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long newsSome long long long long long long long long long long long news", }); } } private void SeedRandomContests(OjsDbContext context) { foreach (var contest in context.Contests) { context.Contests.Remove(contest); } var category = new ContestCategory { Name = "Category", OrderBy = 1, IsVisible = true, IsDeleted = false, }; context.Contests.Add( new Contest { Name = "DSA future", IsVisible = true, StartTime = DateTime.Now.AddHours(10), EndTime = DateTime.Now.AddHours(19), Category = category, }); context.Contests.Add( new Contest { Name = "DSA 2 out", IsVisible = false, StartTime = DateTime.Now.AddHours(10), EndTime = DateTime.Now.AddHours(19), Category = category, }); context.Contests.Add( new Contest { Name = "DSA 3 past", IsVisible = true, StartTime = DateTime.Now.AddHours(-10), EndTime = DateTime.Now.AddHours(-8), Category = category, }); context.Contests.Add( new Contest { Name = "DSA 2 active", IsVisible = true, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(2), Category = category, }); context.Contests.Add( new Contest { Name = "JS Apps another active", IsVisible = true, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(2), Category = category, }); context.Contests.Add( new Contest { Name = "JS Apps another active 2", IsVisible = true, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(2), Category = category, }); context.Contests.Add( new Contest { Name = "JS Apps another active 3", IsVisible = true, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(2), Category = category, }); context.Contests.Add( new Contest { Name = "JS Apps 2 past", IsVisible = true, StartTime = DateTime.Now.AddHours(-10), EndTime = DateTime.Now.AddHours(-8), Category = category, }); context.Contests.Add( new Contest { Name = "JS Apps 3 past", IsVisible = true, StartTime = DateTime.Now.AddHours(-10), EndTime = DateTime.Now.AddHours(-8), Category = category, }); context.Contests.Add( new Contest { Name = "JS Apps 3 past", IsVisible = true, StartTime = DateTime.Now.AddHours(10), EndTime = DateTime.Now.AddHours(18), Category = category, }); context.Contests.Add( new Contest { Name = "JS Apps 3 past", IsVisible = true, StartTime = DateTime.Now.AddHours(10), EndTime = DateTime.Now.AddHours(18), Category = category, }); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/OJS.Data.csproj ================================================  Debug AnyCPU {1807194C-9E25-4365-B3BE-FE1DF627612B} Library Properties OJS.Data OJS.Data v4.5 512 ..\..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll True ..\..\packages\EntityFramework.BulkInsert-ef6.6.0.2.8\lib\Net45\EntityFramework.BulkInsert.dll True ..\..\packages\EntityFramework.Extended.6.1.0.168\lib\net45\EntityFramework.Extended.dll True ..\..\packages\EntityFramework.MappingAPI.6.1.0.9\lib\net45\EntityFramework.MappingAPI.dll True ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll True ..\..\packages\Glimpse.Ado.1.7.3\lib\net45\Glimpse.Ado.dll True ..\..\packages\Glimpse.1.8.6\lib\net45\Glimpse.Core.dll True False ..\..\packages\Microsoft.AspNet.Identity.Core.1.0.0\lib\net45\Microsoft.AspNet.Identity.Core.dll False ..\..\packages\Microsoft.AspNet.Identity.EntityFramework.1.0.0\lib\net45\Microsoft.AspNet.Identity.EntityFramework.dll {69b10b02-22cf-47d6-b5f3-8a5ffb7dc771} OJS.Common {8c4bf453-24ef-46f3-b947-31505fb905de} OJS.Data.Contracts {341ca732-d483-4487-923e-27ed2a6e9a4f} OJS.Data.Models ================================================ FILE: Open Judge System/Data/OJS.Data/OjsData.cs ================================================ namespace OJS.Data { using System; using System.Collections.Generic; using Microsoft.AspNet.Identity.EntityFramework; using OJS.Data.Contracts; using OJS.Data.Models; using OJS.Data.Repositories; using OJS.Data.Repositories.Base; using OJS.Data.Repositories.Contracts; public class OjsData : IOjsData { private readonly IOjsDbContext context; private readonly Dictionary repositories = new Dictionary(); public OjsData() : this(new OjsDbContext()) { } public OjsData(IOjsDbContext context) { this.context = context; } public IContestsRepository Contests => (ContestsRepository)this.GetRepository(); public IDeletableEntityRepository Problems => this.GetDeletableEntityRepository(); public ITestRepository Tests => (TestRepository)this.GetRepository(); public IDeletableEntityRepository News => this.GetDeletableEntityRepository(); public IDeletableEntityRepository Events => this.GetDeletableEntityRepository(); public IDeletableEntityRepository ContestCategories => this.GetDeletableEntityRepository(); public IDeletableEntityRepository ContestQuestions => this.GetDeletableEntityRepository(); public IDeletableEntityRepository ContestQuestionAnswers => this.GetDeletableEntityRepository(); public ISubmissionsRepository Submissions => (SubmissionsRepository)this.GetRepository(); public IRepository SubmissionTypes => this.GetRepository(); public IDeletableEntityRepository SourceCodes => this.GetDeletableEntityRepository(); public IRepository AccessLogs => this.GetRepository(); public ITestRunsRepository TestRuns => (TestRunsRepository)this.GetRepository(); public IParticipantsRepository Participants => (ParticipantsRepository)this.GetRepository(); public IDeletableEntityRepository FeedbackReports => this.GetDeletableEntityRepository(); public IDeletableEntityRepository Checkers => this.GetDeletableEntityRepository(); public IDeletableEntityRepository Resources => this.GetDeletableEntityRepository(); public IRepository Settings => this.GetRepository(); public IUsersRepository Users => (UsersRepository)this.GetRepository(); public IRepository Roles => this.GetRepository(); public IOjsDbContext Context => this.context; /// /// Saves all changes made in this context to the underlying database. /// /// /// The number of objects written to the underlying database. /// /// Thrown if the context has been disposed. public int SaveChanges() { return this.context.SaveChanges(); } public void Dispose() { this.Dispose(true); } protected virtual void Dispose(bool disposing) { if (disposing) { this.context?.Dispose(); } } private IRepository GetRepository() where T : class { if (!this.repositories.ContainsKey(typeof(T))) { var type = typeof(GenericRepository); if (typeof(T).IsAssignableFrom(typeof(Contest))) { type = typeof(ContestsRepository); } if (typeof(T).IsAssignableFrom(typeof(Submission))) { type = typeof(SubmissionsRepository); } if (typeof(T).IsAssignableFrom(typeof(Test))) { type = typeof(TestRepository); } if (typeof(T).IsAssignableFrom(typeof(TestRun))) { type = typeof(TestRunsRepository); } if (typeof(T).IsAssignableFrom(typeof(UserProfile))) { type = typeof(UsersRepository); } if (typeof(T).IsAssignableFrom(typeof(Participant))) { type = typeof(ParticipantsRepository); } this.repositories.Add(typeof(T), Activator.CreateInstance(type, this.context)); } return (IRepository)this.repositories[typeof(T)]; } private IDeletableEntityRepository GetDeletableEntityRepository() where T : class, IDeletableEntity, new() { if (!this.repositories.ContainsKey(typeof(T))) { var type = typeof(DeletableEntityRepository); this.repositories.Add(typeof(T), Activator.CreateInstance(type, this.context)); } return (IDeletableEntityRepository)this.repositories[typeof(T)]; } } } ================================================ FILE: Open Judge System/Data/OJS.Data/OjsDbContext.cs ================================================ namespace OJS.Data { using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using Microsoft.AspNet.Identity.EntityFramework; using OJS.Data.Configurations; using OJS.Data.Contracts; using OJS.Data.Contracts.CodeFirstConventions; using OJS.Data.Models; using User = OJS.Data.Models.UserProfile; public class OjsDbContext : IdentityDbContext, IOjsDbContext { public OjsDbContext() : this("DefaultConnection") { } public OjsDbContext(string nameOrConnectionString) : base(nameOrConnectionString) { } public virtual IDbSet Settings { get; set; } public virtual IDbSet Contests { get; set; } public virtual IDbSet Problems { get; set; } public virtual IDbSet News { get; set; } public virtual IDbSet Events { get; set; } public virtual IDbSet Participants { get; set; } public virtual IDbSet ContestCategories { get; set; } public virtual IDbSet ContestQuestions { get; set; } public virtual IDbSet ContestQuestionAnswers { get; set; } public virtual IDbSet Checkers { get; set; } public virtual IDbSet Tests { get; set; } public virtual IDbSet Submissions { get; set; } public virtual IDbSet SubmissionTypes { get; set; } public virtual IDbSet SourceCodes { get; set; } public virtual IDbSet TestRuns { get; set; } public virtual IDbSet FeedbackReports { get; set; } public virtual IDbSet ParticipantAnswers { get; set; } public virtual IDbSet AccessLogs { get; set; } public DbContext DbContext => this; public override int SaveChanges() { this.ApplyAuditInfoRules(); return base.SaveChanges(); } public void ClearDatabase() { /* // Possible solution to foreign key deletes: http://www.ridgway.co.za/articles/174.aspx // The above solution does not work with cyclic relations. */ this.SaveChanges(); var tableNames = /* this.Database.SqlQuery( "SELECT [TABLE_NAME] from information_schema.tables WHERE [TABLE_NAME] != '__MigrationHistory'") .ToList(); */ new List { "ParticipantAnswers", "FeedbackReports", "AspNetUserRoles", "AspNetRoles", "AspNetUserLogins", "AspNetUserClaims", "News", "Events", "TestRuns", "Submissions", "Participants", "AspNetUsers", "Tests", "Problems", "Checkers", "ContestQuestionAnswers", "ContestQuestions", "Contests", "ContestCategories", }; foreach (var tableName in tableNames) { this.Database.ExecuteSqlCommand(string.Format("DELETE FROM {0}", tableName)); try { this.Database.ExecuteSqlCommand(string.Format("DBCC CHECKIDENT ('{0}',RESEED, 0)", tableName)); } catch { // The table does not contain an identity column } } this.SaveChanges(); } public new IDbSet Set() where T : class { return base.Set(); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Add(new IsUnicodeAttributeConvention()); modelBuilder.Configurations.Add(new TestRunConfiguration()); modelBuilder.Configurations.Add(new ParticipantAnswersConfiguration()); modelBuilder.Configurations.Add(new UserProfileConfiguration()); base.OnModelCreating(modelBuilder); // Without this call EntityFramework won't be able to configure the identity model } protected override void Dispose(bool disposing) { base.Dispose(disposing); } private void ApplyAuditInfoRules() { // Approach via @julielerman: http://bit.ly/123661P foreach (var entry in this.ChangeTracker.Entries() .Where( e => e.Entity is IAuditInfo && ((e.State == EntityState.Added) || (e.State == EntityState.Modified)))) { var entity = (IAuditInfo)entry.Entity; if (entry.State == EntityState.Added) { if (!entity.PreserveCreatedOn) { entity.CreatedOn = DateTime.Now; } } else { entity.ModifiedOn = DateTime.Now; } } } private void ApplyDeletableEntityRules() { // Approach via @julielerman: http://bit.ly/123661P foreach ( var entry in this.ChangeTracker.Entries() .Where(e => e.Entity is IDeletableEntity && (e.State == EntityState.Deleted))) { var entity = (IDeletableEntity)entry.Entity; entity.DeletedOn = DateTime.Now; entity.IsDeleted = true; entry.State = EntityState.Modified; } } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Data")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Data")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("33fb6ec2-5092-4426-b5f5-3d43c762a15c")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Data/OJS.Data/Providers/GlimpseConnectionEfSqlBulkInsertProvider.cs ================================================ namespace OJS.Data.Providers { using System; using System.Reflection; using EntityFramework.BulkInsert.Providers; using Glimpse.Ado.AlternateType; internal class GlimpseConnectionEfSqlBulkInsertProvider : EfSqlBulkInsertProviderWithMappedDataReader { protected override string ConnectionString => this.GetConnectionStringWithPassword(); private string GetConnectionStringWithPassword() { const string PropName = "_connectionString"; var innerConnection = ((GlimpseDbConnection)this.DbConnection).InnerConnection; var type = innerConnection.GetType(); FieldInfo fieldInfo = null; PropertyInfo propertyInfo = null; while (fieldInfo == null && propertyInfo == null && type != null) { fieldInfo = type.GetField(PropName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); if (fieldInfo == null) { propertyInfo = type.GetProperty(PropName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); } type = type.BaseType; } if (fieldInfo == null && propertyInfo == null) { throw new Exception("Field _connectionString was not found"); } if (fieldInfo != null) { return (string)fieldInfo.GetValue(innerConnection); } return (string)propertyInfo.GetValue(innerConnection, null); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Providers/Registries/EfBulkInsertGlimpseProviderRegistry.cs ================================================ namespace OJS.Data.Providers.Registries { using EntityFramework.BulkInsert; public static class EfBulkInsertGlimpseProviderRegistry { public static void Execute() { ProviderFactory.Register("Glimpse.Ado.AlternateType.GlimpseDbConnection"); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/Base/DeletableEntityRepository.cs ================================================ namespace OJS.Data.Repositories.Base { using System; using System.Linq; using System.Linq.Expressions; using EntityFramework.Extensions; using OJS.Data.Contracts; public class DeletableEntityRepository : GenericRepository, IDeletableEntityRepository where T : class, IDeletableEntity, new() { public DeletableEntityRepository(IOjsDbContext context) : base(context) { } public override IQueryable All() { return base.All().Where(x => !x.IsDeleted); } public IQueryable AllWithDeleted() { return base.All(); } public override void Delete(T entity) { entity.IsDeleted = true; entity.DeletedOn = DateTime.Now; this.Update(entity); } public override int Delete(Expression> filterExpression) { return this.DbSet.Where(filterExpression).Update(entity => new T { IsDeleted = true, DeletedOn = DateTime.Now }); } public void HardDelete(T entity) { base.Delete(entity); } public int HardDelete(Expression> filterExpression) { return base.Delete(filterExpression); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/Base/GenericRepository.cs ================================================ namespace OJS.Data.Repositories.Base { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Linq; using System.Linq.Expressions; using EntityFramework.BulkInsert.Extensions; using EntityFramework.Extensions; using OJS.Common.Extensions; using OJS.Data.Contracts; public class GenericRepository : IRepository where T : class { public GenericRepository(IOjsDbContext context) { if (context == null) { throw new ArgumentException("An instance of DbContext is required to use this repository.", nameof(context)); } this.Context = context; this.DbSet = this.Context.Set(); } protected IDbSet DbSet { get; set; } protected IOjsDbContext Context { get; set; } public virtual IQueryable All() { return this.DbSet.AsQueryable(); } public virtual T GetById(int id) { return this.DbSet.Find(id); } public virtual void Add(T entity) { DbEntityEntry entry = this.Context.Entry(entity); if (entry.State != EntityState.Detached) { entry.State = EntityState.Added; } else { this.DbSet.Add(entity); } } public void Add(IEnumerable entities) { this.Context.DbContext.BulkInsert(entities); } public virtual void Update(T entity) { DbEntityEntry entry = this.Context.Entry(entity); if (entry.State == EntityState.Detached) { this.DbSet.Attach(entity); } entry.State = EntityState.Modified; } public virtual int Update(Expression> filterExpression, Expression> updateExpression) { return this.DbSet.Where(filterExpression).Update(updateExpression); } public virtual void Delete(T entity) { DbEntityEntry entry = this.Context.Entry(entity); if (entry.State != EntityState.Deleted) { entry.State = EntityState.Deleted; } else { this.DbSet.Attach(entity); this.DbSet.Remove(entity); } } public virtual void Delete(int id) { var entity = this.GetById(id); if (entity != null) { this.Delete(entity); } } public virtual int Delete(Expression> filterExpression) { return this.DbSet.Where(filterExpression).Delete(); } public virtual void Detach(T entity) { DbEntityEntry entry = this.Context.Entry(entity); entry.State = EntityState.Detached; } /// /// This method updates database values by using expression. It works with both anonymous and class objects. /// It is used in one of the following ways: /// 1. .UpdateValues(x => new Type { Id = ..., Property = ..., AnotherProperty = ... }) /// 2. .UpdateValues(x => new { Id = ..., Property = ..., AnotherProperty = ... }) /// /// Expression for the updated entity public virtual void UpdateValues(Expression> entity) { // compile the expression to delegate and invoke it object compiledExpression = entity.Compile()(null); // cast the result of invokation to T T updatedEntity = compiledExpression is T ? compiledExpression as T : compiledExpression.CastTo(); // attach the entry if missing in ObjectStateManager var entry = this.Context.Entry(updatedEntity); if (entry.State == EntityState.Detached) { try { this.DbSet.Attach(updatedEntity); } catch { var key = this.GetPrimaryKey(entry); entry = this.Context.Entry(this.DbSet.Find(key)); entry.CurrentValues.SetValues(updatedEntity); } } // get current database values of the entity var values = entry.GetDatabaseValues(); if (values == null) { throw new InvalidOperationException("Object does not exists in ObjectStateDictionary. Entity Key|Id should be provided or valid."); } // select the updated members as property names IEnumerable members; if (compiledExpression is T) { members = ((MemberInitExpression)entity.Body).Bindings.Select(b => b.Member.Name); } else { members = ((NewExpression)entity.Body).Members.Select(m => m.Name); } // select all not mapped properties and set value typeof(T) .GetProperties() .Where(pr => !pr.GetCustomAttributes(typeof(NotMappedAttribute), true).Any()) .ForEach(prop => { if (members.Contains(prop.Name)) { // if a member is updated set its state to modified entry.Property(prop.Name).IsModified = true; } else { // otherwise set the existing database value var value = values.GetValue(prop.Name); prop.SetValue(entry.Entity, value); } }); } private int GetPrimaryKey(DbEntityEntry entry) { var myObject = entry.Entity; var property = myObject .GetType() .GetProperties() .FirstOrDefault(prop => Attribute.IsDefined(prop, typeof(KeyAttribute))); return (int)property.GetValue(myObject, null); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/ContestsRepository.cs ================================================ namespace OJS.Data.Repositories { using System; using System.Linq; using OJS.Data.Models; using OJS.Data.Repositories.Base; using OJS.Data.Repositories.Contracts; public class ContestsRepository : DeletableEntityRepository, IContestsRepository { public ContestsRepository(IOjsDbContext context) : base(context) { } public IQueryable AllActive() { return this.All() .Where(x => x.StartTime <= DateTime.Now && DateTime.Now <= x.EndTime && x.IsVisible); } public IQueryable AllFuture() { return this.All().Where(x => x.StartTime > DateTime.Now && x.IsVisible); } public IQueryable AllPast() { return this.All().Where(x => x.EndTime < DateTime.Now && x.IsVisible); } public IQueryable AllVisible() { return this.All() .Where(x => x.IsVisible); } public IQueryable AllVisibleInCategory(int categoryId) { return this.All() .Where(x => x.IsVisible && x.CategoryId == categoryId); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/Contracts/IContestsRepository.cs ================================================ namespace OJS.Data.Repositories.Contracts { using System.Linq; using OJS.Data.Contracts; using OJS.Data.Models; public interface IContestsRepository : IRepository, IDeletableEntityRepository { IQueryable AllActive(); IQueryable AllFuture(); IQueryable AllPast(); IQueryable AllVisible(); IQueryable AllVisibleInCategory(int categoryId); } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/Contracts/IParticipantsRepository.cs ================================================ namespace OJS.Data.Repositories.Contracts { using OJS.Data.Contracts; using OJS.Data.Models; public interface IParticipantsRepository : IRepository { Participant GetWithContest(int contestId, string userId, bool isOfficial); bool Any(int contestId, string userId, bool isOfficial); } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/Contracts/ISubmissionsRepository.cs ================================================ namespace OJS.Data.Repositories.Contracts { using System.Linq; using OJS.Data.Contracts; using OJS.Data.Models; public interface ISubmissionsRepository : IDeletableEntityRepository { IQueryable AllPublic(); Submission GetSubmissionForProcessing(); bool HasSubmissionTimeLimitPassedForParticipant(int participantId, int limitBetweenSubmissions); IQueryable GetLastFiftySubmissions(); } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/Contracts/ITestRepository.cs ================================================ namespace OJS.Data.Repositories.Contracts { using OJS.Data.Contracts; using OJS.Data.Models; public interface ITestRepository : IRepository { } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/Contracts/ITestRunsRepository.cs ================================================ namespace OJS.Data.Repositories.Contracts { using OJS.Data.Contracts; using OJS.Data.Models; public interface ITestRunsRepository : IRepository { int DeleteBySubmissionId(int submissionId); } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/Contracts/IUsersRepository.cs ================================================ namespace OJS.Data.Repositories.Contracts { using OJS.Data.Contracts; using OJS.Data.Models; public interface IUsersRepository : IRepository { UserProfile GetByUsername(string username); UserProfile GetById(string id); } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/ParticipantsRepository.cs ================================================ namespace OJS.Data.Repositories { using System.Data.Entity; using System.Linq; using OJS.Data.Models; using OJS.Data.Repositories.Base; using OJS.Data.Repositories.Contracts; public class ParticipantsRepository : GenericRepository, IParticipantsRepository { public ParticipantsRepository(IOjsDbContext context) : base(context) { } public Participant GetWithContest(int contestId, string userId, bool isOfficial) { return this.All() .Include(x => x.Contest) .FirstOrDefault(x => x.ContestId == contestId && x.UserId == userId && x.IsOfficial == isOfficial); } public bool Any(int contestId, string userId, bool isOfficial) { return this.All() .Any(x => x.ContestId == contestId && x.UserId == userId && x.IsOfficial == isOfficial); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/SubmissionsRepository.cs ================================================ namespace OJS.Data.Repositories { using System; using System.Data.Entity; using System.Linq; using OJS.Data.Models; using OJS.Data.Repositories.Base; using OJS.Data.Repositories.Contracts; public class SubmissionsRepository : DeletableEntityRepository, ISubmissionsRepository { public SubmissionsRepository(IOjsDbContext context) : base(context) { } public IQueryable AllPublic() { return this.All() .Where(x => ((x.Participant.IsOfficial && x.Problem.Contest.ContestPassword == null) || (!x.Participant.IsOfficial && x.Problem.Contest.PracticePassword == null)) && x.Problem.Contest.IsVisible && !x.Problem.Contest.IsDeleted && x.Problem.ShowResults); } public Submission GetSubmissionForProcessing() { var submission = this.All() .Where(x => !x.Processed && !x.Processing) .OrderBy(x => x.Id) .Include(x => x.Problem) .Include(x => x.Problem.Tests) .Include(x => x.Problem.Checker) .Include(x => x.SubmissionType) .FirstOrDefault(); return submission; } public bool HasSubmissionTimeLimitPassedForParticipant(int participantId, int limitBetweenSubmissions) { var lastSubmission = this.All() .Where(x => x.ParticipantId == participantId) .OrderByDescending(x => x.CreatedOn) .Select(x => new { x.Id, x.CreatedOn }) .FirstOrDefault(); if (lastSubmission != null) { // check if the submission was sent after the submission time limit has passed var latestSubmissionTime = lastSubmission.CreatedOn; var differenceBetweenSubmissions = DateTime.Now - latestSubmissionTime; if (differenceBetweenSubmissions.TotalSeconds < limitBetweenSubmissions) { return true; } } return false; } public IQueryable GetLastFiftySubmissions() { // TODO: add language type var submissions = this.AllPublic() .OrderByDescending(x => x.CreatedOn) .Take(50); return submissions; } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/TestRepository.cs ================================================ namespace OJS.Data.Repositories { using System.Data.Entity; using System.Linq; using OJS.Data.Models; using OJS.Data.Repositories.Base; using OJS.Data.Repositories.Contracts; public class TestRepository : GenericRepository, ITestRepository { public TestRepository(IOjsDbContext context) : base(context) { } public override void Delete(int id) { // TODO: Evaluate if this is the best solution var testToDelete = this.Context.DbContext.ChangeTracker.Entries().FirstOrDefault(t => t.Property(pr => pr.Id).CurrentValue == id); if (testToDelete != null) { var test = testToDelete.Entity; this.Context.Entry(test).State = EntityState.Deleted; } } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/TestRunsRepository.cs ================================================ namespace OJS.Data.Repositories { using System.Data.Entity; using System.Linq; using OJS.Data.Models; using OJS.Data.Repositories.Base; using OJS.Data.Repositories.Contracts; public class TestRunsRepository : GenericRepository, ITestRunsRepository { public TestRunsRepository(IOjsDbContext context) : base(context) { } public int DeleteBySubmissionId(int submissionId) { var testRuns = this.All().Where(x => x.SubmissionId == submissionId).ToList(); foreach (var testRun in testRuns) { this.Delete(testRun); } return testRuns.Count; } public override void Delete(int id) { // TODO: evaluate if this is the best solution var testRunToDelete = this.Context.DbContext.ChangeTracker.Entries().FirstOrDefault(t => t.Property(pr => pr.Id).CurrentValue == id); if (testRunToDelete != null) { var testRun = testRunToDelete.Entity; this.Context.Entry(testRun).State = EntityState.Deleted; } } } } ================================================ FILE: Open Judge System/Data/OJS.Data/Repositories/UsersRepository.cs ================================================ namespace OJS.Data.Repositories { using System; using System.Linq; using OJS.Data.Models; using OJS.Data.Repositories.Base; using OJS.Data.Repositories.Contracts; public class UsersRepository : GenericRepository, IUsersRepository { public UsersRepository(IOjsDbContext context) : base(context) { } public UserProfile GetByUsername(string username) { return this.All().FirstOrDefault(x => x.UserName == username); } public UserProfile GetById(string id) { return this.All().FirstOrDefault(x => x.Id == id); } public override void Delete(UserProfile entity) { throw new NotImplementedException(); } } } ================================================ FILE: Open Judge System/Data/OJS.Data/packages.config ================================================  ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/App.config ================================================ 
================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/AuditInfo.cs ================================================ namespace OJS.Data.Contracts { using System; using System.ComponentModel.DataAnnotations.Schema; public abstract class AuditInfo : IAuditInfo { public DateTime CreatedOn { get; set; } /// /// Gets or sets a value indicating whether or not the CreatedOn property should be automatically set. /// [NotMapped] public bool PreserveCreatedOn { get; set; } public DateTime? ModifiedOn { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/CodeFirstConventions/IsUnicodeAttributeConvention.cs ================================================ namespace OJS.Data.Contracts.CodeFirstConventions { using System.Data.Entity.ModelConfiguration.Configuration; using System.Data.Entity.ModelConfiguration.Conventions; using OJS.Data.Contracts.DataAnnotations; public class IsUnicodeAttributeConvention : PrimitivePropertyAttributeConfigurationConvention { public override void Apply(ConventionPrimitivePropertyConfiguration configuration, IsUnicodeAttribute attribute) { configuration.IsUnicode(attribute.IsUnicode); } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/DataAnnotations/IsUnicodeAttribute.cs ================================================ namespace OJS.Data.Contracts.DataAnnotations { using System; public class IsUnicodeAttribute : Attribute { public IsUnicodeAttribute(bool isUnicode) { this.IsUnicode = isUnicode; } public bool IsUnicode { get; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/DeletableEntity.cs ================================================ namespace OJS.Data.Contracts { using System; using System.ComponentModel.DataAnnotations; public abstract class DeletableEntity : AuditInfo, IDeletableEntity { [Display(Name = "Изтрит?")] [Editable(false)] public bool IsDeleted { get; set; } [Display(Name = "Дата на изтриване")] [Editable(false)] [DataType(DataType.DateTime)] public DateTime? DeletedOn { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/IAuditInfo.cs ================================================ namespace OJS.Data.Contracts { using System; public interface IAuditInfo { DateTime CreatedOn { get; set; } bool PreserveCreatedOn { get; set; } DateTime? ModifiedOn { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/IDeletableEntity.cs ================================================ namespace OJS.Data.Contracts { using System; public interface IDeletableEntity { bool IsDeleted { get; set; } DateTime? DeletedOn { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/IDeletableEntityRepository.cs ================================================ namespace OJS.Data.Contracts { using System; using System.Linq; using System.Linq.Expressions; public interface IDeletableEntityRepository : IRepository where T : class { IQueryable AllWithDeleted(); void HardDelete(T entity); int HardDelete(Expression> filterExpression); } } ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/IOrderable.cs ================================================ namespace OJS.Data.Contracts { public interface IOrderable { int OrderBy { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/IRepository.cs ================================================ namespace OJS.Data.Contracts { using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; public interface IRepository where T : class { IQueryable All(); T GetById(int id); void Add(T entity); // Use only in transaction scope void Add(IEnumerable entities); void Update(T entity); int Update(Expression> filterExpression, Expression> updateExpression); void Delete(T entity); void Delete(int id); int Delete(Expression> filterExpression); void Detach(T entity); void UpdateValues(Expression> entity); } } ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/OJS.Data.Contracts.csproj ================================================  Debug AnyCPU {8C4BF453-24EF-46F3-B947-31505FB905DE} Library Properties OJS.Data.Contracts OJS.Data.Contracts v4.5 512 ..\..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll True ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll True ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Data.Contracts")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Data.Contracts")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("7634943f-a60a-4a69-a617-9ab3c887a824")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Data/OJS.Data.Contracts/packages.config ================================================  ================================================ FILE: Open Judge System/Data/OJS.Data.Models/AccessLog.cs ================================================ namespace OJS.Data.Models { using System.ComponentModel.DataAnnotations; using OJS.Data.Contracts; public class AccessLog : AuditInfo { [Key] public long Id { get; set; } public string UserId { get; set; } public virtual UserProfile User { get; set; } public string IpAddress { get; set; } public string RequestType { get; set; } public string Url { get; set; } public string PostParams { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/App.config ================================================ 
================================================ FILE: Open Judge System/Data/OJS.Data.Models/Checker.cs ================================================ namespace OJS.Data.Models { using System.ComponentModel.DataAnnotations; using OJS.Common; using OJS.Data.Contracts; public class Checker : DeletableEntity { [Key] public int Id { get; set; } [Required] [MinLength(GlobalConstants.CheckerNameMinLength)] [MaxLength(GlobalConstants.CheckerNameMaxLength)] public string Name { get; set; } public string Description { get; set; } public string DllFile { get; set; } public string ClassName { get; set; } public string Parameter { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/Contest.cs ================================================ namespace OJS.Data.Models { using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using OJS.Common; using OJS.Data.Contracts; public class Contest : DeletableEntity, IValidatableObject, IOrderable { private ICollection questions; private ICollection problems; private ICollection participants; private ICollection submissionTypes; public Contest() { this.questions = new HashSet(); this.problems = new HashSet(); this.participants = new HashSet(); this.submissionTypes = new HashSet(); } [Key] public int Id { get; set; } public int? OldId { get; set; } [MaxLength(GlobalConstants.ContestNameMaxLength)] [MinLength(GlobalConstants.ContestNameMinLength)] public string Name { get; set; } [Required] public bool IsVisible { get; set; } public int? CategoryId { get; set; } public virtual ContestCategory Category { get; set; } /// /// If StartTime is null the contest cannot be competed. /// public DateTime? StartTime { get; set; } /// /// If EndTime is null the contest can be competed forever. /// public DateTime? EndTime { get; set; } /// /// If ContestPassword is null the contest can be competed by everyone without require a password. /// If the ContestPassword is not null the contest participant should provide a valid password. /// [MaxLength(GlobalConstants.ContestPasswordMaxLength)] public string ContestPassword { get; set; } /// /// If PracticePassword is null the contest can be practiced by everyone without require a password. /// If the PracticePassword is not null the practice participant should provide a valid password. /// [MaxLength(GlobalConstants.ContestPasswordMaxLength)] public string PracticePassword { get; set; } /// /// If PracticeStartTime is null the contest cannot be practiced. /// public DateTime? PracticeStartTime { get; set; } /// /// If PracticeEndTime is null the contest can be practiced forever. /// public DateTime? PracticeEndTime { get; set; } [DefaultValue(0)] public int LimitBetweenSubmissions { get; set; } [DefaultValue(0)] public int OrderBy { get; set; } public string Description { get; set; } public virtual ICollection Questions { get { return this.questions; } set { this.questions = value; } } public virtual ICollection Problems { get { return this.problems; } set { this.problems = value; } } public virtual ICollection Participants { get { return this.participants; } set { this.participants = value; } } public virtual ICollection SubmissionTypes { get { return this.submissionTypes; } set { this.submissionTypes = value; } } [NotMapped] public bool CanBeCompeted { get { if (!this.IsVisible) { return false; } if (this.IsDeleted) { return false; } if (!this.StartTime.HasValue) { // Cannot be competed return false; } if (!this.EndTime.HasValue) { // Compete forever return this.StartTime <= DateTime.Now; } return this.StartTime <= DateTime.Now && DateTime.Now <= this.EndTime; } } [NotMapped] public bool CanBePracticed { get { if (!this.IsVisible) { return false; } if (this.IsDeleted) { return false; } if (!this.PracticeStartTime.HasValue) { // Cannot be practiced return false; } if (!this.PracticeEndTime.HasValue) { // Practice forever return this.PracticeStartTime <= DateTime.Now; } return this.PracticeStartTime <= DateTime.Now && DateTime.Now <= this.PracticeEndTime; } } [NotMapped] public bool ResultsArePubliclyVisible { get { if (!this.IsVisible) { return false; } if (this.IsDeleted) { return false; } if (!this.StartTime.HasValue) { // Cannot be competed return false; } return this.EndTime.HasValue && this.EndTime.Value <= DateTime.Now; } } [NotMapped] public bool HasContestPassword => this.ContestPassword != null; [NotMapped] public bool HasPracticePassword => this.PracticePassword != null; public IEnumerable Validate(ValidationContext validationContext) { var validationResults = new List(); var contest = validationContext.ObjectInstance as Contest; if (contest == null) { return validationResults; } if (contest.StartTime.HasValue && contest.EndTime.HasValue && contest.StartTime.Value > contest.EndTime.Value) { validationResults.Add( new ValidationResult("StartTime can not be after EndTime", new[] { "StartTime", "EndTime" })); } return validationResults; } public override string ToString() { return $"#{this.Id} {this.Name}"; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/ContestCategory.cs ================================================ namespace OJS.Data.Models { using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using OJS.Common; using OJS.Data.Contracts; public class ContestCategory : DeletableEntity, IOrderable { private ICollection children; private ICollection contests; public ContestCategory() { this.children = new HashSet(); this.contests = new HashSet(); } [Key] public int Id { get; set; } [Required] [MaxLength(GlobalConstants.ContestCategoryNameMaxLength)] [MinLength(GlobalConstants.ContestCategoryNameMinLength)] public string Name { get; set; } [DefaultValue(0)] public int OrderBy { get; set; } [ForeignKey("Parent")] public int? ParentId { get; set; } public virtual ContestCategory Parent { get; set; } [InverseProperty("Parent")] public virtual ICollection Children { get { return this.children; } set { this.children = value; } } public virtual ICollection Contests { get { return this.contests; } set { this.contests = value; } } public bool IsVisible { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/ContestQuestion.cs ================================================ namespace OJS.Data.Models { using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using OJS.Common; using OJS.Common.Models; using OJS.Data.Contracts; /// /// Represents question that is asked for every participant (real or practice) in the specified contest. /// public class ContestQuestion : DeletableEntity { private ICollection answers; private ICollection participantAnswers; public ContestQuestion() { this.answers = new HashSet(); this.participantAnswers = new HashSet(); } [Key] public int Id { get; set; } [ForeignKey("Contest")] public int ContestId { get; set; } public virtual Contest Contest { get; set; } [MaxLength(GlobalConstants.ContestQuestionMaxLength)] [MinLength(GlobalConstants.ContestQuestionMinLength)] public string Text { get; set; } [DefaultValue(true)] public bool AskOfficialParticipants { get; set; } [DefaultValue(true)] public bool AskPracticeParticipants { get; set; } public ContestQuestionType Type { get; set; } public virtual ICollection Answers { get { return this.answers; } set { this.answers = value; } } public virtual ICollection ParticipantAnswers { get { return this.participantAnswers; } set { this.participantAnswers = value; } } public string RegularExpressionValidation { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/ContestQuestionAnswer.cs ================================================ namespace OJS.Data.Models { using System.ComponentModel.DataAnnotations; using OJS.Common; using OJS.Data.Contracts; public class ContestQuestionAnswer : DeletableEntity { [Key] public int Id { get; set; } public int QuestionId { get; set; } public virtual ContestQuestion Question { get; set; } [MaxLength(GlobalConstants.ContestQuestionAnswerMaxLength)] [MinLength(GlobalConstants.ContestQuestionAnswerMinLength)] public string Text { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/Event.cs ================================================ namespace OJS.Data.Models { using System; using System.ComponentModel.DataAnnotations; using OJS.Data.Contracts; public class Event : DeletableEntity { [Key] public int Id { get; set; } [Required(AllowEmptyStrings = false)] public string Title { get; set; } public string Description { get; set; } public DateTime StartTime { get; set; } /// /// If EndTime is null, the event happens (and should be displayed) only on the StartTime /// public DateTime? EndTime { get; set; } public string Url { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/FeedbackReport.cs ================================================ namespace OJS.Data.Models { using System.ComponentModel.DataAnnotations; using OJS.Data.Contracts; public class FeedbackReport : DeletableEntity { [Key] public int Id { get; set; } public string Name { get; set; } [EmailAddress] public string Email { get; set; } public string Content { get; set; } public virtual UserProfile User { get; set; } public bool IsFixed { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/News.cs ================================================ namespace OJS.Data.Models { using System.ComponentModel.DataAnnotations; using OJS.Data.Contracts; public class News : DeletableEntity { [Key] public int Id { get; set; } public string Title { get; set; } public string Author { get; set; } public string Source { get; set; } public string Content { get; set; } public bool IsVisible { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/OJS.Data.Models.csproj ================================================  Debug AnyCPU {341CA732-D483-4487-923E-27ED2A6E9A4F} Library Properties OJS.Data.Models OJS.Data.Models v4.5 512 ..\..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll True ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll True False ..\..\packages\Microsoft.AspNet.Identity.Core.1.0.0\lib\net45\Microsoft.AspNet.Identity.Core.dll False ..\..\packages\Microsoft.AspNet.Identity.EntityFramework.1.0.0\lib\net45\Microsoft.AspNet.Identity.EntityFramework.dll {69b10b02-22cf-47d6-b5f3-8a5ffb7dc771} OJS.Common {8c4bf453-24ef-46f3-b947-31505fb905de} OJS.Data.Contracts ================================================ FILE: Open Judge System/Data/OJS.Data.Models/Participant.cs ================================================ namespace OJS.Data.Models { using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using OJS.Data.Contracts; public class Participant : AuditInfo { private ICollection submissions; private ICollection answers; public Participant() { this.submissions = new HashSet(); this.answers = new HashSet(); } public Participant(int contestId, string userId, bool isOfficial) : this() { this.ContestId = contestId; this.UserId = userId; this.IsOfficial = isOfficial; } [Key] public int Id { get; set; } public int OldId { get; set; } public int ContestId { get; set; } public string UserId { get; set; } public bool IsOfficial { get; set; } [Required] public virtual Contest Contest { get; set; } public virtual UserProfile User { get; set; } public virtual ICollection Submissions { get { return this.submissions; } set { this.submissions = value; } } public virtual ICollection Answers { get { return this.answers; } set { this.answers = value; } } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/ParticipantAnswer.cs ================================================ namespace OJS.Data.Models { using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class ParticipantAnswer { [Key] [Column(Order = 1)] public int ParticipantId { get; set; } [Required] public virtual Participant Participant { get; set; } [Key] [Column(Order = 2)] public int ContestQuestionId { get; set; } [Required] public virtual ContestQuestion ContestQuestion { get; set; } public string Answer { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/Problem.cs ================================================ namespace OJS.Data.Models { using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using OJS.Common; using OJS.Data.Contracts; public class Problem : DeletableEntity, IOrderable { private ICollection tests; private ICollection resources; private ICollection submissions; private ICollection tags; public Problem() { this.tests = new HashSet(); this.resources = new HashSet(); this.submissions = new HashSet(); this.tags = new HashSet(); } [Key] public int Id { get; set; } public int? OldId { get; set; } public int ContestId { get; set; } public virtual Contest Contest { get; set; } [Required] [MaxLength(GlobalConstants.ProblemNameMaxLength)] public string Name { get; set; } public short MaximumPoints { get; set; } /// /// Gets or sets time limit for the problem. Measured in milliseconds. /// public int TimeLimit { get; set; } /// /// Gets or sets memory limit for the problem. Measured in bytes. /// public int MemoryLimit { get; set; } /// /// Gets or sets file size limit (measured in bytes). /// public int? SourceCodeSizeLimit { get; set; } [ForeignKey("Checker")] public int? CheckerId { get; set; } public virtual Checker Checker { get; set; } public int OrderBy { get; set; } /// /// Gets or sets predefined skeleton for the task /// public byte[] SolutionSkeleton { get; set; } [DefaultValue(true)] public bool ShowResults { get; set; } [DefaultValue(false)] public bool ShowDetailedFeedback { get; set; } public virtual ICollection Tests { get { return this.tests; } set { this.tests = value; } } public virtual ICollection Resources { get { return this.resources; } set { this.resources = value; } } public virtual ICollection Submissions { get { return this.submissions; } set { this.submissions = value; } } public virtual ICollection Tags { get { return this.tags; } set { this.tags = value; } } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/ProblemResource.cs ================================================ namespace OJS.Data.Models { using System.ComponentModel.DataAnnotations; using OJS.Common; using OJS.Common.Models; using OJS.Data.Contracts; public class ProblemResource : DeletableEntity, IOrderable { [Key] public int Id { get; set; } public int ProblemId { get; set; } public Problem Problem { get; set; } [Required] [MinLength(GlobalConstants.ProblemResourceNameMinLength)] [MaxLength(GlobalConstants.ProblemResourceNameMaxLength)] public string Name { get; set; } public ProblemResourceType Type { get; set; } public byte[] File { get; set; } [MaxLength(GlobalConstants.FileExtentionMaxLength)] public string FileExtension { get; set; } public string Link { get; set; } public int OrderBy { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Data.Models")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Data.Models")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("4faa99d9-bcfa-43b3-aeed-71cee6be5076")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Data/OJS.Data.Models/Setting.cs ================================================ namespace OJS.Data.Models { using System.ComponentModel.DataAnnotations; public class Setting { [Key] public string Name { get; set; } public string Value { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/SourceCode.cs ================================================ namespace OJS.Data.Models { using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using OJS.Common.Extensions; using OJS.Data.Contracts; public class SourceCode : DeletableEntity { [Key] public int Id { get; set; } public string AuthorId { get; set; } public virtual UserProfile Author { get; set; } public int? ProblemId { get; set; } public virtual Problem Problem { get; set; } public byte[] Content { get; set; } [NotMapped] public string ContentAsString { get { return this.Content.Decompress(); } set { this.Content = value.Compress(); } } public bool IsPublic { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/Submission.cs ================================================ namespace OJS.Data.Models { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using OJS.Common; using OJS.Common.Extensions; using OJS.Common.Models; using OJS.Data.Contracts; public class Submission : DeletableEntity { private ICollection testRuns; public Submission() { this.testRuns = new HashSet(); } [Key] public int Id { get; set; } public int? ParticipantId { get; set; } public virtual Participant Participant { get; set; } public int? ProblemId { get; set; } public virtual Problem Problem { get; set; } public int? SubmissionTypeId { get; set; } public virtual SubmissionType SubmissionType { get; set; } /// /// Using byte[] (compressed with deflate) to save database space for text inputs. For other file types the actual file content is saved in the field. /// public byte[] Content { get; set; } /// /// If the value of FileExtension is null, then compressed text file is written in Content /// public string FileExtension { get; set; } public byte[] SolutionSkeleton { get; set; } [StringLength(GlobalConstants.IpAdressMaxLength)] [Column(TypeName = "varchar")] public string IpAddress { get; set; } [NotMapped] public bool IsBinaryFile => !string.IsNullOrWhiteSpace(this.FileExtension); [NotMapped] public string ContentAsString { get { if (this.IsBinaryFile) { throw new InvalidOperationException(GlobalConstants.ContentAsStringErrorMessage); } return this.Content.Decompress(); } set { if (this.IsBinaryFile) { throw new InvalidOperationException(GlobalConstants.ContentAsStringErrorMessage); } this.Content = value.Compress(); } } public bool IsCompiledSuccessfully { get; set; } public string CompilerComment { get; set; } public virtual ICollection TestRuns { get { return this.testRuns; } set { this.testRuns = value; } } public bool Processed { get; set; } public bool Processing { get; set; } public string ProcessingComment { get; set; } /// /// Cache field for submissions points (to speed-up some of the database queries) /// public int Points { get; set; } [NotMapped] public int CorrectTestRunsCount { get { return this.TestRuns.Count(x => x.ResultType == TestRunResultType.CorrectAnswer); } } [NotMapped] public int CorrectTestRunsWithoutTrialTestsCount { get { return this.TestRuns.Count(x => x.ResultType == TestRunResultType.CorrectAnswer && !x.Test.IsTrialTest); } } [NotMapped] public int TestsWithoutTrialTestsCount { get { return this.Problem.Tests.Count(x => !x.IsTrialTest); } } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/SubmissionType.cs ================================================ namespace OJS.Data.Models { using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using OJS.Common; using OJS.Common.Extensions; using OJS.Common.Models; public class SubmissionType { private ICollection contests; public SubmissionType() { this.contests = new HashSet(); } [Key] public int Id { get; set; } [Required] [MaxLength(GlobalConstants.SubmissionTypeNameMaxLength)] [MinLength(GlobalConstants.SubmissionTypeNameMinLength)] public string Name { get; set; } [DefaultValue(false)] public bool IsSelectedByDefault { get; set; } public ExecutionStrategyType ExecutionStrategyType { get; set; } public CompilerType CompilerType { get; set; } public string AdditionalCompilerArguments { get; set; } public string Description { get; set; } [DefaultValue(false)] public bool AllowBinaryFilesUpload { get; set; } /// /// Gets or sets comma-separated list of allowed file extensions. /// If the value is null or whitespace then only text values are allowed. If any extension is specified then no text input is allowed. /// public string AllowedFileExtensions { get; set; } [NotMapped] public IEnumerable AllowedFileExtensionsList { get { var list = this.AllowedFileExtensions.Split(new[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(x => x.Trim()); return list.ToArray(); } } public virtual ICollection Contests { get { return this.contests; } set { this.contests = value; } } [NotMapped] public string FileNameExtension { get { string extension = (this.ExecutionStrategyType.GetFileExtension() ?? this.CompilerType.GetFileExtension()) ?? string.Empty; return extension; } } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/Tag.cs ================================================ namespace OJS.Data.Models { using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using OJS.Data.Contracts; public class Tag : DeletableEntity { private ICollection problems; public Tag() { this.problems = new HashSet(); } [Key] public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public string ForegroundColor { get; set; } public string BackgroundColor { get; set; } public virtual ICollection Problems { get { return this.problems; } set { this.problems = value; } } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/Test.cs ================================================ namespace OJS.Data.Models { using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using OJS.Common.Extensions; using OJS.Data.Contracts; public class Test : IOrderable { private ICollection testRuns; public Test() { this.testRuns = new HashSet(); } [Key] public int Id { get; set; } public int ProblemId { get; set; } public virtual Problem Problem { get; set; } /// /// Using byte[] (compressed with zip) to save database space. /// public byte[] InputData { get; set; } [NotMapped] public string InputDataAsString { get { return this.InputData.Decompress(); } set { this.InputData = value.Compress(); } } /// /// Using byte[] (compressed with zip) to save database space. /// public byte[] OutputData { get; set; } [NotMapped] public string OutputDataAsString { get { return this.OutputData.Decompress(); } set { this.OutputData = value.Compress(); } } public bool IsTrialTest { get; set; } public int OrderBy { get; set; } public virtual ICollection TestRuns { get { return this.testRuns; } set { this.testRuns = value; } } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/TestRun.cs ================================================ namespace OJS.Data.Models { using System.ComponentModel.DataAnnotations; using OJS.Common.Models; public class TestRun { [Key] public int Id { get; set; } public int SubmissionId { get; set; } public Submission Submission { get; set; } public int TestId { get; set; } public Test Test { get; set; } public int TimeUsed { get; set; } public long MemoryUsed { get; set; } public TestRunResultType ResultType { get; set; } public string ExecutionComment { get; set; } public string CheckerComment { get; set; } public string ExpectedOutputFragment { get; set; } public string UserOutputFragment { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/UserProfile.cs ================================================ namespace OJS.Data.Models { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.AspNet.Identity.EntityFramework; using OJS.Data.Contracts; using OJS.Data.Contracts.DataAnnotations; public class UserProfile : IdentityUser, IDeletableEntity, IAuditInfo { public UserProfile() : this(string.Empty, string.Empty) { } public UserProfile(string userName, string email) : base(userName) { this.Email = email; this.UserSettings = new UserSettings(); this.CreatedOn = DateTime.Now; } [Required] [MaxLength(80)] [IsUnicode(false)] [DataType(DataType.EmailAddress)] public string Email { get; set; } /// /// This property is true when the user comes from the old system and is not preregistered in the new system. /// [DefaultValue(false)] public bool IsGhostUser { get; set; } public int? OldId { get; set; } public UserSettings UserSettings { get; set; } public Guid? ForgottenPasswordToken { get; set; } public bool IsDeleted { get; set; } [DataType(DataType.DateTime)] public DateTime? DeletedOn { get; set; } [DataType(DataType.DateTime)] public DateTime CreatedOn { get; set; } /// /// Gets or sets a value indicating whether or not the CreatedOn property should be automatically set. /// [NotMapped] public bool PreserveCreatedOn { get; set; } [DataType(DataType.DateTime)] public DateTime? ModifiedOn { get; set; } } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/UserSettings.cs ================================================ namespace OJS.Data.Models { using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using OJS.Common; [ComplexType] public class UserSettings { public UserSettings() { this.DateOfBirth = null; } [Column("FirstName")] [MaxLength(GlobalConstants.FirstNameMaxLength)] public string FirstName { get; set; } [Column("LastName")] [MaxLength(GlobalConstants.LastNameMaxLength)] public string LastName { get; set; } [Column("City")] [MaxLength(GlobalConstants.CityNameMaxLength)] public string City { get; set; } [Column("EducationalInstitution")] [MaxLength(GlobalConstants.EducationalInstitutionMaxLength)] public string EducationalInstitution { get; set; } [Column("FacultyNumber")] [MaxLength(GlobalConstants.FacultyNumberMaxLength)] public string FacultyNumber { get; set; } [Column("DateOfBirth")] [DataType(DataType.Date)] //// TODO: [Column(TypeName = "Date")] temporally disabled because of SQL Compact database not having "date" type public DateTime? DateOfBirth { get; set; } [Column("Company")] [MaxLength(GlobalConstants.CompanyNameMaxLength)] public string Company { get; set; } [Column("JobTitle")] [MaxLength(GlobalConstants.JobTitleMaxLenth)] public string JobTitle { get; set; } [NotMapped] public byte? Age => Calculator.Age(this.DateOfBirth); } } ================================================ FILE: Open Judge System/Data/OJS.Data.Models/packages.config ================================================  ================================================ FILE: Open Judge System/External Libraries/Kendo.Mvc.README ================================================ This is Kendo UI Trial unified package, which contains all Kendo UI products and is not bound to any of the commercial Kendo UI offerings. It includes trial versions of the Kendo UI server wrappers, which are available in the individual commercial packages as follows: . Kendo UI Complete for ASP.NET MVC . Kendo UI Complete for JSP . Telerik DevCraft Complete or Ultimate Collections ================================================ FILE: Open Judge System/External Libraries/Kendo.Mvc.xml ================================================ Kendo.Mvc Get the Application root path. The instance. Determines whether this instance can compress the specified instance. The instance. true if this instance can compress the specified instance; otherwise, false. A strongly-typed resource class, for looking up localized strings, etc. Returns the cached ResourceManager instance used by this class. Overrides the current thread's CurrentUICulture property for all resource lookups using this strongly typed resource class. Looks up a localized string similar to Add column on the left. Looks up a localized string similar to Add column on the right. Looks up a localized string similar to Add row above. Looks up a localized string similar to Add row below. Looks up a localized string similar to Background color. Looks up a localized string similar to Bold. Looks up a localized string similar to Insert hyperlink. Looks up a localized string similar to Create table. Looks up a localized string similar to Delete column. Looks up a localized string similar to Are you sure you want to delete "{0}"?. Looks up a localized string similar to Delete row. Looks up a localized string similar to or. Looks up a localized string similar to Cancel. Looks up a localized string similar to Insert. Looks up a localized string similar to A directory with this name was not found.. Looks up a localized string similar to drop files here to upload. Looks up a localized string similar to Empty Folder. Looks up a localized string similar to Select font family. Looks up a localized string similar to (inherited font). Looks up a localized string similar to Select font size. Looks up a localized string similar to (inherited size). Looks up a localized string similar to Color. Looks up a localized string similar to Format. Looks up a localized string similar to Alternate text. Looks up a localized string similar to Web address. Looks up a localized string similar to Indent. Looks up a localized string similar to Insert HTML. Looks up a localized string similar to Insert image. Looks up a localized string similar to Insert ordered list. Looks up a localized string similar to Insert unordered list. Looks up a localized string similar to The selected file "{0}" is not valid. Supported file types are {1}.. Looks up a localized string similar to Italic. Looks up a localized string similar to Center text. Looks up a localized string similar to Justify. Looks up a localized string similar to Align text left. Looks up a localized string similar to Align text right. Looks up a localized string similar to Open link in new window. Looks up a localized string similar to Text. Looks up a localized string similar to ToolTip. Looks up a localized string similar to Web address. Looks up a localized string similar to Arrange by:. Looks up a localized string similar to Name. Looks up a localized string similar to Size. Looks up a localized string similar to Outdent. Looks up a localized string similar to 'A file with name "{0}" already exists in the current directory. Do you want to overwrite it?. Looks up a localized string similar to Search. Looks up a localized string similar to Strikethrough. Looks up a localized string similar to Styles. Looks up a localized string similar to Subscript. Looks up a localized string similar to Superscript. Looks up a localized string similar to Underline. Looks up a localized string similar to Remove hyperlink. Looks up a localized string similar to Upload. Looks up a localized string similar to And. Looks up a localized string similar to Cancel. Looks up a localized string similar to Clear. Looks up a localized string similar to Is equal to. Looks up a localized string similar to Is after. Looks up a localized string similar to Is after or equal to. Looks up a localized string similar to Is before. Looks up a localized string similar to Is before or equal to. Looks up a localized string similar to Is not equal to. Looks up a localized string similar to Is equal to. Looks up a localized string similar to Is not equal to. Looks up a localized string similar to Filter. Looks up a localized string similar to Show items with value that:. Looks up a localized string similar to is false. Looks up a localized string similar to is true. Looks up a localized string similar to Is equal to. Looks up a localized string similar to Is greater than. Looks up a localized string similar to Is greater than or equal to. Looks up a localized string similar to Is less than. Looks up a localized string similar to Is less than or equal to. Looks up a localized string similar to Is not equal to. Looks up a localized string similar to Operator. Looks up a localized string similar to Or. Looks up a localized string similar to -Select value-. Looks up a localized string similar to Contains. Looks up a localized string similar to Does not contain. Looks up a localized string similar to Ends with. Looks up a localized string similar to Is equal to. Looks up a localized string similar to Is not equal to. Looks up a localized string similar to Starts with. Looks up a localized string similar to Value. Looks up a localized string similar to Cancel. Looks up a localized string similar to Cancel changes. Looks up a localized string similar to Cancel. Looks up a localized string similar to Columns. Looks up a localized string similar to Column Settings. Looks up a localized string similar to Are you sure you want to delete this record?. Looks up a localized string similar to Delete. Looks up a localized string similar to Add new record. Looks up a localized string similar to Delete. Looks up a localized string similar to Done. Looks up a localized string similar to Edit. Looks up a localized string similar to Save changes. Looks up a localized string similar to Select. Looks up a localized string similar to Sort Ascending. Looks up a localized string similar to Sort Descending. Looks up a localized string similar to Update. Looks up a localized string similar to Drag a column header and drop it here to group by that column. Looks up a localized string similar to {0} - {1} of {2} items. Looks up a localized string similar to No items to display. Looks up a localized string similar to Go to the first page. Looks up a localized string similar to items per page. Looks up a localized string similar to Go to the last page. Looks up a localized string similar to Go to the next page. Looks up a localized string similar to of {0}. Looks up a localized string similar to Page. Looks up a localized string similar to Go to the previous page. Looks up a localized string similar to Refresh. Looks up a localized string similar to all day. Looks up a localized string similar to Cancel. Looks up a localized string similar to Are you sure you want to delete this event?. Looks up a localized string similar to Date. Looks up a localized string similar to Delete event. Looks up a localized string similar to Delete. Looks up a localized string similar to All day event. Looks up a localized string similar to Description. Looks up a localized string similar to Event. Looks up a localized string similar to End. Looks up a localized string similar to End timezone. Looks up a localized string similar to Repeat. Looks up a localized string similar to Use separate start and end time zones. Looks up a localized string similar to Start. Looks up a localized string similar to Start timezone. Looks up a localized string similar to . Looks up a localized string similar to Time zone. Looks up a localized string similar to Timezones. Looks up a localized string similar to Title. Looks up a localized string similar to Event. Looks up a localized string similar to Do you want to delete only this event occurrence or the whole series?. Looks up a localized string similar to Delete current occurrence. Looks up a localized string similar to Delete the series. Looks up a localized string similar to Delete Recurring Item. Looks up a localized string similar to days(s). Looks up a localized string similar to Repeat every: . Looks up a localized string similar to After . Looks up a localized string similar to End:. Looks up a localized string similar to Never. Looks up a localized string similar to occurrence(s). Looks up a localized string similar to On . Looks up a localized string similar to Daily. Looks up a localized string similar to Monthly. Looks up a localized string similar to Never. Looks up a localized string similar to Weekly. Looks up a localized string similar to Yearly. Looks up a localized string similar to Day . Looks up a localized string similar to month(s). Looks up a localized string similar to Repeat every: . Looks up a localized string similar to Repeat on: . Looks up a localized string similar to first. Looks up a localized string similar to fourth. Looks up a localized string similar to last. Looks up a localized string similar to second. Looks up a localized string similar to third. Looks up a localized string similar to day. Looks up a localized string similar to weekday. Looks up a localized string similar to weekend day. Looks up a localized string similar to week(s). Looks up a localized string similar to Repeat every: . Looks up a localized string similar to Repeat on: . Looks up a localized string similar to year(s). Looks up a localized string similar to of . Looks up a localized string similar to Repeat every: . Looks up a localized string similar to Repeat on: . Looks up a localized string similar to Do you want to edit only this event occurrence or the whole series?. Looks up a localized string similar to Edit current occurrence. Looks up a localized string similar to Edit the series. Looks up a localized string similar to Edit Recurring Item. Looks up a localized string similar to Save. Looks up a localized string similar to Show full day. Looks up a localized string similar to Show business hours. Looks up a localized string similar to Time. Looks up a localized string similar to Today. Looks up a localized string similar to Agenda. Looks up a localized string similar to Day. Looks up a localized string similar to Month. Looks up a localized string similar to Week. Looks up a localized string similar to Cancel. Looks up a localized string similar to drop files here to upload. Looks up a localized string similar to Done. Looks up a localized string similar to Uploading.... Looks up a localized string similar to Remove. Looks up a localized string similar to Retry. Looks up a localized string similar to Select.... Looks up a localized string similar to failed. Looks up a localized string similar to uploaded. Looks up a localized string similar to uploading. Looks up a localized string similar to Upload files. The HtmlAttributes applied to objects which can have child items Writes the initialization script. The writer. Initializes a new instance of the class. The view context. The client side object writer factory. Renders the component. Writes the initialization script. The writer. Writes the HTML. Gets the client events of the grid. The client events. Gets or sets the name. The name. Gets the id. The id. Gets the HTML attributes. The HTML attributes. Gets or sets the view context to rendering a view. The view context. Defines the fluent interface for configuring the component. View component Builder base class. Initializes a new instance of the class. The component. Returns the internal view component. Sets the name of the component. The name. Suppress initialization script rendering. Note that this options should be used in conjunction with Sets the HTML attributes. The HTML attributes. Sets the HTML attributes. The HTML attributes. Renders the component. Gets the view component. The component. Use to enable or disable animation of the popup element. The boolean value. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Animation(false) //toggle effect %> Configures the animation effects of the widget. The action which configures the animation effects. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Animation(animation => { animation.Open(open => { open.SlideIn(SlideDirection.Down); } }) %> Sets the field of the data item that provides the text content of the list items. <%= Html.Kendo().DropDownList() .Name("DropDownList") .DataTextField("Text") %> Configures the DataSource options. The DataSource configurator action. <%= Html.Kendo().DropDownList() .Name("DropDownList") .DataSource(source => { source.Read(read => { read.Action("GetProducts", "Home"); } }) %> Specifies the delay in ms after which the widget will start filtering the dataSource. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Delay(300) %> Enables or disables the combobox. Use it to enable case insensitive bahavior of the combobox. If true the combobox will select the first matching item ignoring its casing. <%= Html.Kendo().ComboBox() .Name("ComboBox") .IgnoreCase(true) %> Sets the height of the drop-down list in pixels. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Height(300) %> Header template which will be rendered as a static header of the popup element. <%= Html.Kendo().DropDownList() .Name("DropDownList") .HeaderTemplate("

Customers

") %>
HeaderTemplateId to be used for rendering the static header of the popup element. <%= Html.Kendo().DropDownList() .Name("DropDownList") .HeaderTemplateId("widgetHeaderTemplateId") %> Template to be used for rendering the items in the list. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Template("#= data #") %> TemplateId to be used for rendering the items in the list. <%= Html.Kendo().DropDownList() .Name("DropDownList") .TemplateId("widgetTemplateId") %> Sets the value of the widget. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Value("1") %> Initializes a new instance of the class. The component. Configures the client-side events. The client events action. <%= Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.Change("change") ) %> Use it to enable filtering of items. <%= Html.Kendo().AutoComplete() .Name("AutoComplete") .Filter("startswith"); %> Use it to enable filtering of items. <%= Html.Kendo().AutoComplete() .Name("AutoComplete") .Filter(FilterType.Contains); %> Use it to enable highlighting of first matched item. <%= Html.Kendo().AutoComplete() .Name("AutoComplete") .HighlightFirst(true) %> Specifies the minimum number of characters that should be typed before the widget queries the dataSource. <%= Html.Kendo().AutoComplete() .Name("AutoComplete") .MinLength(3) %> A string that appears in the textbox when it has no value. <%= Html.Kendo().AutoComplete() .Name("AutoComplete") .MinLength(3) %> Sets the separator for completion. Empty by default, allowing for only one completion. <%= Html.Kendo().AutoComplete() .Name("AutoComplete") .Separator(", ") %> Controls whether the AutoComplete should automatically auto-type the rest of text. <%= Html.Kendo().AutoComplete() .Name("AutoComplete") .Suggest(true) %> The fluent API for subscribing to Kendo UI AutoComplete events. Initializes a new instance of the class. The client events. Defines the inline handler of the Select client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.Select( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Select client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.Select("select")) ) Defines the inline handler of the Change client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.Change("change")) ) Defines the inline handler of the DataBound client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.DataBound( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the DataBound client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.DataBound("dataBound")) %> Defines the name of the JavaScript function that will handle the the Open client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.Open("open")) ) Defines the inline handler of the Open client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.Open( @<text> function(e) { //event handling code } </text> )) ) Defines the inline handler of the Close client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.Close( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Close client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().AutoComplete() .Name("AutoComplete") .Events(events => events.Close("close")) ) Gets or sets the render type. The render type. Initializes a new instance of the class. The spacing to be applied in all directions. Initializes a new instance of the class. Gets or sets the top spacing. Gets or sets the right spacing. Gets or sets the bottom spacing. Gets or sets the left spacing. Represents the symbologies (encodings) supported by Kendo UI Barcode for ASP.NET MVC Initializes a new instance of the class. Initializes a new instance of the class. Gets or sets the width of the border. Gets or sets the color of the border. Gets or sets the dash type of the border. Defines the fluent interface for configuring the . Sets the value of the barcode Sets the preferred rendering engine. If it is not supported by the browser, the Chart will switch to the first available mode. The preferred rendering engine. Sets the value of the barcode Sets the background color of the barcode area Configures the options for the border of the Barcode Configurator to fine tune the padding options Specifies padding for top,bottom,right and left at once. Specifies whether the Checksum should be displayed next to the text or not Specifies the color of the bars Configures options for the Text of the Barcode Sets the symbology which will be used to encode the value of the barcode Sets the height of the barcode area Sets the width of the barcode area Defines the fluent interface for configuring the . Defines the fluent interface for configuring the . Initializes a new instance of the class. The Barcode component. Creates the barcode top-level div. Builds the Barcode component markup. Serializes the current instance Specifies the pane contents Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Sets the HTML content of the Button. The action which renders the HTML content. <% Html.Kendo().Button() .Name("Button1") .Content(() => { >% <p>Content</p> %<}) .Render(); %> Sets the HTML content of the Button. The Razor template for the HTML content. @(Html.Kendo().Button() .Name("Button1") .Content(@<p>Content</p>) .Render();) Sets the HTML content of the Button. The HTML content. <%= Html.Kendo().Button() .Name("Button") .Content("<p>Content</p>") %> Sets whether Button should be enabled. Sets the icon name of the Button. Sets the image URL of the Button. Sets the sprite CSS class(es) of the Button. Configures the client-side events. The client events action. <%= Html.Kendo().Button() .Name("Button") .Events(events => events.Click("onClick")) %> Sets the Button HTML tag. A button tag is used by default. <%= Html.Kendo().Button() .Name("Button") .Tag("span") %> Defines the fluent interface for configuring the Button events. Defines the inline handler of the Click client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Button() .Name("Button") .Events(events => events.Click( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Click client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Button() .Name("Button") .Events(events => events.Click("onClick")) %> Gets or sets the name of the route. The name of the route. Gets or sets the name of the controller. The name of the controller. Gets or sets the name of the action. The name of the action. Gets the route values. The route values. Gets or sets the URL. The URL. Defines the fluent interface for configuring datepicker client events. Defines the inline handler of the Change client-side event The handler code wrapped in a text tag (Razor syntax). <%= Html.Kendo().Calendar() .Name("DatePicker") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) %> Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Calendar() .Name("Calendar") .Events(events => events.Change("change")) %> Defines the inline handler of the Navigate client-side event The handler code wrapped in a text tag (Razor syntax). <%= Html.Kendo().Calendar() .Name("Calendar") .Events(events => events.Navigate( @<text> %> function(e) { //event handling code } </text> )) %> Defines the name of the JavaScript function that will handle the Navigate client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Calendar() .Name("Calendar") .Events(events => events.Navigate("navigate")) %> Defines the fluent interface for configuring the . Initializes a new instance of the class. The selection settings. Defines list of dates. This list determines which dates to be rendered with action link. List of objects Sets the action to which the date should navigate The route values of the Action method. Sets the action to which the item should navigate Name of the action. Name of the controller. The route values. Gets or sets the label font. Gets or sets a value indicating if the label is visible Gets or sets the label background. Gets or sets the label border. Gets or sets the label margin. Gets or sets the label padding. Gets or sets the label color. Gets or sets the label format. Gets or sets the label template. Gets or sets the label opacity. Gets or sets the label rotation. Initializes a new instance of the class. Gets or sets the label font. Specify a font in CSS format. For example "12px Arial,Helvetica,sans-serif". Gets or sets a value indicating if the label is visible Gets or sets the label background. The label background. Gets or sets the label border. The label border. Gets or sets the label margin. The label margin. Gets or sets the label padding. The label padding. Gets or sets the label color. The label color. Gets or sets the label format. The label format. Gets or sets the label template. The label template. Gets or sets the label opacity. The label opacity. Gets or sets the label rotation. The label opacity. Initializes a new instance of the class. A value indicating whether to render the axis labels on the other side. Label rendering step. Every n-th label is rendered where n is the step. Label rendering skip. Skips rendering the first n labels. Date formats for the date axis. Culture to use for formatting date labels. The axis major ticks configuration. The axis minor ticks configuration. The major grid lines configuration. The minor grid lines configuration. The axis line configuration. The axis labels. The axis title. The axis name. Leave empty to use the "primary" default value. The color for all axis elements. Can be overriden by individual settings. A value indicating if the axis labels should be rendered in reverse. A value indicating if the automatic axis range should snap to 0. The axis crosshair configuration. The axis plot bands. The axis notes configuration. The name of the pane that the axis should be rendered in. Gets or sets the axis visibility. The angle (degrees) where the 0 value is placed. It defaults to 0. Angles increase counterclockwise and zero is to the right. Negative values are acceptable. The axis background color Initializes a new instance of the class. The chart. Gets or sets the chart. The chart. The axis major ticks configuration. The axis crosshair configuration. The axis minor ticks configuration. The major grid lines configuration. The minor grid lines configuration. The axis line configuration. The axis labels. The axis plot bands. The axis title. The axis name. Leave empty to use the "primary" default value. The name of the pane that the axis should be rendered in. The color for all axis elements. Can be overriden by individual settings. The axis background color A value indicating if the axis labels should be rendered in reverse. A value indicating if the automatic axis range should snap to 0. Gets or sets the axis visibility. The angle (degrees) where the 0 value is placed. It defaults to 0. Angles increase counterclockwise and zero is to the right. Negative values are acceptable. The axis notes. The categories displayed on the axis The Model member used to populate the The category indicies at which perpendicular axes cross this axis. Specifies the category axis type. Specifies the date category axis base unit. Sets the step (interval) between categories in base units. Specifies the maximum number of groups (categories) to produce when either BaseUnit is set to Fit or BaseUnitStep is set to 0 (auto). This option is ignored in all other cases. If set to false, the min and max dates will not be rounded off to the nearest baseUnit. This option is most useful in combination with explicit min and max dates. It will be ignored if either Bar, Column, OHLC or Candlestick series are plotted on the axis. The week start day when the base unit is Weeks. The default is Sunday. Positions categories and series points on major ticks. This removes the empty space before and after the series. This option will be ignored if either Bar, Column, OHLC or Candlestick series are plotted on the axis. Specifies the discrete BaseUnitStep values when either BaseUnit is set to Fit or BaseUnitStep is set to 0 (auto). Specifies the date category axis minimum (start) date. Specifies the date category axis maximum (end) date. Gets or sets the axis selection. Initializes a new instance of the class. The chart. The values at which perpendicular axes cross this axis. The categories displayed on the axis Gets the member name to be used as category. The member. Specifies the category axis type. Specifies the date category axis base unit. Sets the step (interval) between categories in base units. Specifies the maximum number of groups (categories) to produce when either BaseUnit is set to Fit or BaseUnitStep is set to 0 (auto). This option is ignored in all other cases. If set to false, the min and max dates will not be rounded off to the nearest baseUnit. This option is most useful in combination with explicit min and max dates. It will be ignored if either Bar, Column, OHLC or Candlestick series are plotted on the axis. A boolean value that indicates if the axis range should be rounded to the nearest base unit. The default value is true. The week start day when the base unit is Weeks. The default is Sunday. Positions categories and series points on major ticks. This removes the empty space before and after the series. This option will be ignored if either Bar, Column, OHLC or Candlestick series are plotted on the axis. Specifies the discrete BaseUnitStep values when either BaseUnit is set to Fit or BaseUnitStep is set to 0 (auto). Specifies the date category axis minimum (start) date. Specifies the date category axis maximum (end) date. Gets or sets the axis selection. Initializes a new instance of the class. Gets or sets the icon. Gets or sets the label. Gets or sets the line. Gets or sets the note position. Initializes a new instance of the class. Gets or sets the note position. The values at which perpendicular axes cross this axis. The axis minimum value The axis maximum value The interval between major divisions The interval between minor divisions. Initializes a new instance of the class. The chart. The values at which perpendicular axes cross this axis. The minimum axis value. The axis maximum value. The interval between major divisions The interval between minor divisions. It defaults to MajorUnit / 5. Initializes a new instance of the class. The chart. Initializes a new instance of the class. Gets or sets the plot band start position. The start position of the plot band. Gets or sets the plot band end position. The end position of the plot band. Gets or sets the plot band background color. The plot band background color. Gets or sets the plot band opacity. The plot band opacity. Initializes a new instance of the class. Gets or sets the axis title text. Gets or sets the axis title font. Specify a font in CSS format. For example "16px Arial,Helvetica,sans-serif". Gets or sets the axis title position. The default value is Gets or sets the axis title margin Gets or sets the axis title background color Gets or sets the axis title text color Gets or sets the axis title padding Gets or sets the axis title border Gets or sets the axis title opacity. The axis title opacity. Gets or sets the axis title rrotation. The label opacity. Initializes a new instance of the class. Gets or sets the ticks size. Gets or sets the ticks visibility. Initializes a new instance of the class. Date format to use when the base date unit is . Date format to use when the base date unit is . Date format to use when the base date unit is . Date format to use when the base date unit is . Date format to use when the base date unit is . Date format to use when the base date unit is . Date format to use when the base date unit is . The base time interval for the axis labels. The default baseUnit is determined automatically from the value range. The dates at which perpendicular axes cross this axis. The axis minimum (start) date The axis maximum (end) date The interval between major divisions in base units. The interval between minor divisions in base units. It defaults to 1/5th of the majorUnit. Initializes a new instance of the class. The chart. Specifies the date category axis base unit. The values at which perpendicular axes cross this axis. The minimum axis value. The axis maximum value. The interval between major divisions in base units. The interval between minor divisions in base units. It defaults to 1/5th of the majorUnit. The discrete baseUnitStep values when baseUnit is set to Seconds and baseUnitStep is set to Auto. The discrete baseUnitStep values when baseUnit is set to Minutes and baseUnitStep is set to Auto. The discrete baseUnitStep values when baseUnit is set to Hours and baseUnitStep is set to Auto. The discrete baseUnitStep values when baseUnit is set to Minutes and baseUnitStep is set to Auto. The discrete baseUnitStep values when baseUnit is set to Weeks and baseUnitStep is set to Auto. The discrete baseUnitStep values when baseUnit is set to Months and baseUnitStep is set to Auto. The discrete baseUnitStep values when baseUnit is set to Years and baseUnitStep is set to Auto. Initializes a new instance of the class. Initializes a new instance of the class. Initializes a new instance of the class. Gets or sets the line width. Gets or sets the line opacity. Gets or sets the line color. Gets or sets the line visibility. Gets or sets the line dash type. Gets or sets the line skip. Gets or sets the line step. Initializes a new instance of the class. The tooltip of the crosshair. Initializes a new instance of the class. Gets or sets the tooltip font. Specify a font in CSS format. For example "16px Arial,Helvetica,sans-serif". Gets or sets a value indicating if the tooltip is visible Gets or sets the tooltip margin Gets or sets the tooltip border Gets or sets the tooltip background. The label background. Gets or sets the tooltip color. The label color. Gets or sets the tooltip format. The label format. Gets or sets the tooltip template. The tooltip template. Gets or sets the tooltip opacity. The tooltip opacity. Initializes a new instance of the class. Initializes a new instance of the class. Initializes a new instance of the class. The lower boundary of the range. The upper boundary of the range. Mousewheel zoom settings Initializes a new instance of the class. Gets or sets a value that indicates if the mousewheel direction should be reversed. The mousewheel reverse flag. Gets or sets zoom direction settings. The zoom direction settings. The component series. The component UrlGenerator The component view context Gets or sets the data source. The data source. Gets or sets the URL generator. The URL generator. Gets or sets the Chart area. The Chart area. Gets or sets the Plot area. The Plot area. Gets or sets the Chart theme. The Chart theme. Gets or sets the render type. The render type. Gets or sets the Chart title. The Chart title. Gets or sets the Chart legend. The Chart legend. Gets or sets the Chart transitions. The Chart Transitions. Gets the chart series. Gets the chart panes. Gets the default settings for all series. Configuration for all category axes Configuration for all value axes Configuration for all X axes in scatter charts Configuration for all Y axes in scatter charts Configuration for the default axis Gets the data source configuration. Gets or sets a value indicating if the chart should be data bound during initialization. Gets or sets the series colors. Gets or sets the data point tooltip options Initializes a new instance of the class. Defines the width of the line. Defines the color of the line. Defines the length of the line. Initializes a new instance of the class. Gets or sets the title text Gets or sets the title font. Specify a font in CSS format. For example "16px Arial,Helvetica,sans-serif". Gets or sets the title color Gets or sets the title position. The default value is Gets or sets the title text alignment. The default value is Gets or sets a value indicating if the title is visible Gets or sets the title margin Gets or sets the title background color Gets or sets the title padding Gets or sets the legend border Initializes a new instance of the class. Gets or sets the legend font. Specify a font in CSS format. For example "16px Arial,Helvetica,sans-serif". Gets or sets the legend labels color. Specify the color of the labels. Gets or sets the legend position. The default value is Gets or sets the legend X-offset from its position. Gets or sets the legend Y-offset from its position. Gets or sets a value indicating if the legend is visible Gets or sets the legend margin Gets or sets the legend margin Gets or sets the legend background color Gets or sets the legend border Gets or sets the legend labels Initializes a new instance of the class. Initializes a new instance of the class. Gets or sets the opacity of the border. Gets or sets the width of the border. Gets or sets the color of the border. Gets or sets the dash type of the border. Initializes a new instance of the class. Gets or sets the Chart area background. The Chart area background. Gets or sets the Chart area border. The Chart area border. Gets or sets the Chart area margin. The Chart area margin. Gets or sets the Chart area width. The Chart area width. Gets or sets the Chart area height. The Chart area height. Initializes a new instance of the class. Initializes a new instance of the class. Initializes a new instance of the class with the specified name. The unique pane name. Initializes a new instance of the class. Gets or sets the unique pane name Gets or sets the pane height in pixels. Gets or sets the pane title. Gets or sets the pane margin Gets or sets the pane background color Gets or sets the pane padding Gets or sets the pane border Initializes a new instance of the class. Initializes a new instance of the class. Gets or sets the note value. Defines the behavior rendering the line between values in scatterLine series. The values will be connected with a straight line. The values will be connected with a smooth line. Specifies the zoom direction. Both ends of the selection are moved. The left selection edge is moved during zoom. The right selection edge is moved during zoom. Defines the position of the note label The label is positioned inside of the icon. The label is positioned outside of the icon. Defines the position of the note The note is positioned on the top The note is positioned on the bottom The note is positioned on the left The note is positioned on the right Defines the behavior rendering the line between values in line series. The values will be connected with straight line. The values will be connected with a line at right. The values will be connected with smooth line. Defines the behavior rendering the line between values in area series. The values will be connected with straight line. The values will be connected with a line at right. The values will be connected with a smooth line. Defines the behavior rendering the line between values in radar line series. The values will be connected with straight line. The values will be connected with smooth line. Defines the behavior rendering the line between values in radar area series. The values will be connected with straight line. The values will be connected with a smooth line. Defines the behavior rendering the line between values in polar area series. The values will be connected with straight line. The values will be connected with a smooth line. Defines the behavior rendering the line between values in polar line series. The values will be connected with straight line. The values will be connected with smooth line. Initializes a new instance of the class. Initializes a new instance of the class. The style of the area. Defines the fluent interface for configuring . Defines the fluent interface for configuring . Initializes a new instance of the class. The chart line. Sets the line color The line color (CSS format). <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MajorGridLines(lines => lines.Color("#f00"))) .Render(); %> Sets the line width The line width. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MajorGridLines(lines => lines.Width(2))) .Render(); %> Sets the line dashType. The line dashType. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MajorGridLines(lines => lines.DashType(ChartDashType.Dot))) .Render(); %> Initializes a new instance of the class. The chart line. Sets the line opacity. The line opacity. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .Line(line => line.Opacity(0.2)) ) .Render(); %> Configures the line style for area series. The style. The default is normal. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .Line(line => line.Style(ChartAreaStyle.Step)) ) %> The series name. The series opacity The series base color Gets or sets the series color function Gets or sets the data point tooltip options Gets or sets the axis name to use for this series. Name template for auto-generated series when binding to grouped data. Gets or sets the series highlight options Gets or sets the visibility of the series. Gets or sets the series notes options Initializes a new instance of the class. Gets or sets the title of the series. The title. Gets or sets the series opacity. A value between 0 (transparent) and 1 (opaque). Gets or sets the series base color Gets or sets the series color function Gets or sets the data point tooltip options Gets or sets the axis name to use for this series. The axis name. Name template for auto-generated series when binding to grouped data. Gets or sets the series highlight options Gets or sets a value indicating if the series is visible Gets or sets the series notes options Gets the data member of the series. Gets the model data category member name. The model data category member name. Gets the model data note text member name. The model data note text member name. The data used for binding. Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point category from the chart model. The expression used to extract the point note text from the chart model. Initializes a new instance of the class. The series data. Initializes a new instance of the class. The data used for binding. Gets the model data note text member name. The model data note text member name. Gets the model data member name. The model data member name. Gets the model data category member name. The model data category member name. Gets a function which returns the category of the property to which the column is bound to. A value indicating if the areas should be stacked. Aggregate function for date series. Gets the area chart data labels configuration The area chart markers configuration. The behavior for handling missing values in area series. The orientation of the series. Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point category from the chart model. The expression used to extract the point note text from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. A value indicating if the areas should be stacked. Aggregate function for date series. Gets the area chart data labels configuration. The area chart markers configuration. The behavior for handling missing values in area series. The orientation of the area chart. Can be either horizontal or vertical. The default value is horizontal. Gets or sets the series error bars options The area chart line configuration. Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point category from the chart model. The expression used to extract the point note text from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. The area chart line configuration. Gets or sets the series error bars options Initializes a new instance of the class. The expression used to extract the point value from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. Defines the fluent interface for configuring area series. The type of the data item Defines the fluent interface for configuring series. The type of the series builder. Initializes a new instance of the class. The series. Sets the series title displayed in the legend. The title. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bar(s => s.Sales).Name("Sales")) %> Sets the name template for auto-generated series when binding to grouped data. The name template for auto-generated series when binding to grouped data. <% Html.Kendo().Chart() .Name("Chart") .DataSource(dataSource => dataSource .Read(read => read.Action("_StockData", "Scatter_Charts")) .Group(group => group.Add(model => model.Symbol)) ) .Series(series => series.Bar(s => s.Sales) .Name("Sales") .GroupNameTemplate("#= series.name # for #= group.field # #= group.value #") ) .Render(); %> Sets the series opacity. The series opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bar(s => s.Sales).Opacity(0.5)) %> Sets the bar fill color The bar fill color (CSS syntax). <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bar(s => s.Sales).Color("Red")) .Render(); %> Sets the function used to retrieve point color. The JavaScript function that will be executed to retrieve the color of each point. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Color( @<text> function(point) { return point.value > 5 ? "red" : "green"; } </text> ) ) .Render(); %> Configure the data point tooltip for the series. Use the configurator to set data tooltip options. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bar(s => s.Sales) .Tooltip(tooltip => { tooltip.Visible(true).Format("{0:C}"); }) ) %> Sets the data point tooltip visibility. A value indicating if the data point tooltip should be displayed. The tooltip is not visible by default. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bar(s => s.Sales).Tooltip(true)) %> Sets the axis name to use for this series. The axis name for this series. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bar(s => s.Sales).Name("Sales").Axis("secondary")) .ValueAxis(axis => axis.Numeric()) .ValueAxis(axis => axis.Numeric("secondary")) .CategoryAxis(axis => axis.AxisCrossingValue(0, 10)) %> Configures the series highlight The configuration action. Configures the highlight visibility The highlight visibility. Sets the labels visibility The labels visibility. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bar(s => s.Sales).Visible(false)) .Render(); %> Configures the series notes The configuration action. Gets or sets the series. The series. Initializes a new instance of the class. The series. Sets a value indicating if the areas should be stacked. A value indicating if the areas should be stacked. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Area(s => s.Sales).Stack(true)) %> Sets the aggregate function for date series. This function is used when a category (an year, month, etc.) contains two or more points. Aggregate function name. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Area(s => s.Sales).Aggregate()) %> Configures the area chart labels. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .Labels(labels => labels .Position(ChartBarLabelsPosition.Above) .Visible(true) ); ) %> Sets the visibility of area chart labels. The visibility. The default value is false. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .Labels(true); ) %> Configures the area chart markers. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .Markers(markers => markers .Type(ChartMarkerShape.Triangle) ); ) %> Sets the visibility of area chart markers. The visibility. The default value is true. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .Markers(true); ) %> Configures the behavior for handling missing values in area series. The missing values behavior. The default is to leave gaps. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .MissingValues(ChartAreaMissingValues.Interpolate); ) %> Initializes a new instance of the class. The series. Configures the area chart line. The line width. The line color. The line dashType. The line style. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .Line(2, "red", ChartDashType.Dot, ChartAreaStyle.Smooth) ) .Render(); %> Configures the area chart line. The configuration action. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .Line(line => line.Opacity(0.2)) ) .Render(); %> Configures the series error bars The configuration action. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .ErrorBars(e => e.Value(1)) ) .Render(); %> The radar area chart line configuration. Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point category from the chart model. The expression used to extract the point note text from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. The area chart line configuration. Initializes a new instance of the class. The expression used to extract the point value from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. Initializes a new instance of the class. Initializes a new instance of the class. The style of the radar area. Initializes a new instance of the class. The chart line. Sets the line opacity. The line opacity. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .RadarArea(s => s.Sales) .Line(line => line.Opacity(0.2)) ) .Render(); %> Configures the line style for radar area series. The style. The default is normal. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .RadarArea(s => s.Sales) .Line(line => line.Style(ChartRadarAreaStyle.Smooth)) ) %> Initializes a new instance of the class. The series. Configures the radar area chart line. The line width. The line color. The line dashType. The line style. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .RadarArea(s => s.Sales) .Line(2, "red", ChartDashType.Dot, ChartScatterLineStyle.Smooth) ) .Render(); %> Configures the radar area chart line. The configuration action. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .RadarArea(s => s.Sales) .Line(line => line.Opacity(0.2)) ) .Render(); %> A value indicating if the bars should be stacked. The stack name that this series belongs to. Aggregate function for date series. The distance between category clusters. Space between bars. The orientation of the bars. Gets the bar chart data labels configuration Gets or sets the bar's border Gets or sets the effects overlay Gets the model color member name. The model color member name. Gets or sets the series color for negative values Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point color from the chart model. The expression used to extract the point category from the chart model. The expression used to extract the point note text from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. A value indicating if the bars should be stacked. Aggregate function for date series. The stack name that this series belongs to. The distance between category clusters. A value of 1 means that there is a total of 1 column width / bar height between categories. The distance is distributed evenly on each side. Space between bars. Value of 1 means that the distance between bars is equal to their width. The orientation of the bars. Can be either horizontal (bar chart) or vertical (column chart). The default value is horizontal. Gets the bar chart data labels configuration Gets or sets the bar border Gets or sets the effects overlay Gets the model color member name. The model color member name. Gets or sets the series color for negative values Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point color from the chart model. The expression used to extract the point category from the chart model. The expression used to extract the point note text from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. Gets or sets the series error bars options Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point color from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. Defines the fluent interface for configuring bar series. The type of the data item Initializes a new instance of the class. The series. Sets a value indicating if the bars should be stacked. A value indicating if the bars should be stacked. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bar(s => s.Sales).Stack(true)) %> Sets the name of the stack that this series belongs to. Each unique name creates a new stack. The name of the stack. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bar(s => s.Sales).Stack("Female")) %> Sets the aggregate function for date series. This function is used when a category (an year, month, etc.) contains two or more points. Aggregate function name. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bar(s => s.Sales).Aggregate()) %> Set distance between category clusters. A value of 1 means that there is a total of 1 column width / bar height between categories. The distance is distributed evenly on each side. The default value is 1.5 <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bar(s => s.Sales).Gap(1)) %> Sets a value indicating the distance between bars / categories. Value of 1 means that the distance between bars is equal to their width. The default value is 0 <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Spacing(s => s.Sales).Spacing(1)) %> Configures the bar chart labels. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Position(ChartBarLabelsPosition.InsideEnd) .Visible(true) ); ) %> Sets the visibility of bar chart labels. The visibility. The default value is false. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(true); ) %> Sets the bars border The bars border width. The bars border color (CSS syntax). The bars border dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bar(s => s.Sales).Border("1", "#000", ChartDashType.Dot)) .Render(); %> Configures the bar border The border configuration action Sets the bar effects overlay The bar effects overlay. The default is ChartBarSeriesOverlay.Glass <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bar(s => s.Sales).Overlay(ChartBarSeriesOverlay.None)) .Render(); %> Sets the bar color for negative values The bar color for negative values(CSS syntax). <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bar(s => s.Sales).NegativeColor("Red")) .Render(); %> Initializes a new instance of the class. The series. Configures the series error bars The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Value(1)) ) %> Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point color from the chart model. The expression used to extract the point category from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point color from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. Initializes a new instance of the class. The series. A value indicating if the lines should be stacked. Aggregate function for date series. Gets the line chart data labels configuration The line chart markers configuration. The line chart line width. The line chart line dash type. The behavior for handling missing values in line series. The orientation of the series. Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point category from the chart model. The expression used to extract the point note text from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. A value indicating if the lines should be stacked. Aggregate function for date series. Gets the line chart data labels configuration The line chart markers configuration. The line chart line width. The behavior for handling missing values in line series. The line chart line dashType. The orientation of the line. Can be either horizontal or vertical. The default value is horizontal. The style of the series. Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point category from the chart model. The expression used to extract the point note text from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. The style of the line. Gets or sets the series error bars options Initializes a new instance of the class. The expression used to extract the point value from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. Defines the fluent interface for configuring line series. The type of the data item Initializes a new instance of the class. The series. Sets a value indicating if the lines should be stacked. A value indicating if the lines should be stacked. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Line(s => s.Sales).Stack(true)) %> Sets the aggregate function for date series. This function is used when a category (an year, month, etc.) contains two or more points. Aggregate function name. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Line(s => s.Sales).Aggregate()) %> Configures the line chart labels. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Labels(labels => labels .Position(ChartBarLabelsPosition.Above) .Visible(true) ); ) %> Sets the visibility of line chart labels. The visibility. The default value is false. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Labels(true); ) %> Sets the line chart line width. The line width. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Line(s => s.Sales).Width(2)) .Render(); %> Sets the line chart line dash type. The line dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Line(s => s.Sales).DashType(ChartDashType.Dot)) .Render(); %> Configures the line chart markers. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Markers(markers => markers .Type(ChartMarkerShape.Triangle) ); ) %> Sets the visibility of line chart markers. The visibility. The default value is true. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Markers(true); ) %> Configures the behavior for handling missing values in line series. The missing values behavior. The default is to leave gaps. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .MissingValues(ChartLineMissingValues.Interpolate); ) %> Initializes a new instance of the class. The series. Configures the style for line series. The style. The default is normal. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Style(ChartLineStyle.Step); ) %> Configures the series error bars The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .ErrorBars(e => e.Value(1)) ) %> The radar line series style. Initializes a new instance of the class. The expression used to extract the point value from the chart model. The expression used to extract the point category from the chart model. The expression used to extract the point note text from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. The style of the line. Initializes a new instance of the class. The expression used to extract the point value from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. Initializes a new instance of the class. The series. Configures the style for radar line series. The style. The default is normal. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .RadarLine(s => s.Sales) .Style(ChartRadarLineStyle.Smooth); ) %> Gets the X data member of the series. Gets the Y data member of the series. Gets the note text member of the series. Gets the scatter chart data labels configuration The scatter chart markers configuration. Gets or sets the X axis name to use for this series. Gets or sets the Y axis name to use for this series. The data used for binding. Initializes a new instance of the class. The X expression. The Y expression. The note text expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. Gets the model X data member name. The model X data member name. Gets the model Y data member name. The model Y data member name. Gets the model note text member name. The model note text member name. Gets or sets the X axis name to use for this series. Gets or sets the Y axis name to use for this series. Gets the scatter chart data labels configuration The line chart markers configuration. The scatter chart data source. The line chart line width. The chart line dash type. The behavior for handling missing values in scatter line series. Initializes a new instance of the class. The X expression. The Y expression. The note text expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. The chart line width. The chart line dashType. The behavior for handling missing values in scatter line series. The scatter chart error bars configuration. The style of the series. Initializes a new instance of the class. The X expression. The Y expression. The note text expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. The style of the series. The error bars of the series. Defines the fluent interface for configuring scatter line series. The type of the data item Defines the fluent interface for configuring scatter series. The type of the data item The type of the builder Initializes a new instance of the class. The series. Configures the scatter chart labels. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Scatter(s => s.x, s => s.y) .Labels(labels => labels .Position(ChartBarLabelsPosition.Above) .Visible(true) ); ) %> Sets the visibility of scatter chart labels. The visibility. The default value is false. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Scatter(s => s.x, s => s.y) .Labels(true); ) %> Configures the scatter chart markers. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Scatter(s => s.x, s => s.y) .Markers(markers => markers .Type(ChartMarkerShape.Triangle) ); ) %> Sets the visibility of scatter chart markers. The visibility. The default value is true. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Scatter(s => s.x, s => s.y) .Markers(true); ) %> Sets the axis name to use for this series. The axis name for this series. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Scatter(s => s.X, s => s.Y).Name("Scatter").XAxis("secondary")) .XAxis(axis => axis.Numeric()) .XAxis(axis => axis.Numeric("secondary")) %> Sets the axis name to use for this series. The axis name for this series. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Scatter(s => s.Sales).Name("Sales").YAxis("secondary")) .YAxis(axis => axis.Numeric()) .YAxis(axis => axis.Numeric("secondary")) %> Not applicable to scatter series Initializes a new instance of the class. The series. Sets the chart line width. The line width. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.ScatterLine(s => s.x, s => s.y).Width(2)) .Render(); %> Sets the chart line dash type. The line dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.ScatterLine(s => s.x, s => s.y).DashType(ChartDashType.Dot)) .Render(); %> Configures the behavior for handling missing values in scatter line series. The missing values behavior. The default is to leave gaps. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .ScatterLine(s => s.x, s => s.y) .MissingValues(ChartScatterLineMissingValues.Interpolate); ) %> Initializes a new instance of the class. The series. Configures the scatter line series error bars. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .ScatterLine(s => s.x, s => s.y) .ErrorBars(e => e.XValue(1)) ) %> Configures the style for scatterLine series. The style. The default is normal. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .ScatterLine(s => s.x, s => s.y) .Style(ChartScatterLineStyle.Smooth); ) %> Initializes a new instance of the class. The X expression. The Y expression. The note text expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. The scatter chart error bars configuration. Defines the fluent interface for configuring scatter series. The type of the data item Initializes a new instance of the class. The series. Configures the scatter series error bars. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XValue(1)) ) %> Initializes a new instance of the class. Initializes a new instance of the class. Initializes a new instance of the class. The style of the polar area. Initializes a new instance of the class. The chart line. Configures the line style for polar area series. The style. The default is normal. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .PolarArea(s => s.Sales) .Line(line => line.Style(ChartPolarAreaStyle.Smooth)) ) %> Initializes a new instance of the class. The series. Configures the polar area chart line. The line width. The line color. The line dashType. The line style. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .PolarArea(s => s.Sales) .Line(2, "red", ChartDashType.Dot, ChartPolarAreaStyle.Smooth) ) .Render(); %> Configures the polar area chart line. The configuration action. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .PolarArea(s => s.Sales) .Line(line => line.Width(2)) ) .Render(); %> Initializes a new instance of the class. The series. Configures the style for scatterLine series. The style. The default is normal. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .PolarLine(s => s.x, s => s.y) .Style(ChartPolarLineStyle.Smooth); ) %> Initializes a new instance of the class. The series. The style of the series. The polar area chart line configuration. Initializes a new instance of the class. The X expression. The Y expression. The note text expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. The polar area chart line configuration. Initializes a new instance of the class. The X expression. The Y expression. The note text expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. The style of the series. Initializes a new instance of the class. The X expression. The Y expression. The note text expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. Defines the position of funnel chart labels. The label is positioned at the center of the funnel segment. The label is positioned at the top of the label area. The label is positioned at the bottom of the label area. Defines the alignment of the funnel labels. The labels are positioned on the top of the funnel chart The labels are positioned on the left side of the chart The labels are positioned on the right side of the chart Defines the rendering modes supported by DataViz widgets Renders the widget as VML, if available. Renders the widget as a Canvas element, if available. Renders the widget as inline SVG document, if available. Note: Animations and most interactive features will be disabled. Gets or sets the error bars color. Gets or sets a value indicating if the end caps are visible The error bars line Gets or sets the error bars value. Gets the model data error low member name. The model data error low member name. Gets the model data error high member name. The model data error high member name. Defines the fluent interface for configuring funnel series. The type of the data item Initializes a new instance of the class. The series. Sets the name of the series. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Funnel(s => s.Sales, s => s.DateString).Name("Sales")) %> Sets the segmentSpacing of the chart. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Funnel(s => s.Sales, s => s.DateString).SegmentSpacing(5)) .Render(); %> Sets the opacity of the funnel series. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Funnel(s => s.Sales, s => s.DateString).Opacity(0.3)) .Render(); %> Sets the neck ratio of the funnel chart. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Funnel(s => s.Sales, s => s.DateString).NeckRatio(3)) .Render(); %> Sets the dynamic slope of the funnel chart. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Funnel(s => s.Sales, s => s.DateString).DynamicSlope(true)) .Render(); %> Sets the dynamic height of the funnel chart. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Funnel(s => s.Sales, s => s.DateString).DynamicHeight(true)) .Render(); %> Configures the funnel chart labels. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Funnel(s => s.Sales, s => s.DateString) .Labels(labels => labels .Color("red") .Visible(true) ); ) %> Sets the visibility of funnel chart labels. The visibility. The default value is false. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Funnel(s => s.Sales, s => s.DateString) .Labels(true); ) %> Sets the funnel segments border The funnel segments border width. The funnel segments border color (CSS syntax). The funnel segments border dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Funnel(s => s.Sales, s => s.DateString).Border(1, "#000", ChartDashType.Dot)) .Render(); %> Configures the funnel border The border configuration action Gets or sets the series. The series. Defines the fluent interface for configuring the chart data labels. Defines the fluent interface for configuring the chart labels. Initializes a new instance of the class. The labels configuration. Sets the labels font The labels font (CSS format). <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Font("14px Arial,Helvetica,sans-serif") .Visible(true) ); ) .Render(); %> Sets the labels visibility The labels visibility. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Visible(true) ); ) .Render(); %> Sets the labels background color The labels background color. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Background("Red") .Visible(true); ); ) .Render(); %> Sets the labels text color The labels text color. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Color("Red") .Visible(true); ); ) .Render(); %> Sets the labels margin The labels top margin. The labels right margin. The labels bottom margin. The labels left margin. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Margin(0, 5, 5, 0) .Visible(true); ); ) .Render(); %> Sets the labels margin The labels margin. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Margin(20) .Visible(true); ); ) .Render(); %> Sets the labels padding The labels top padding. The labels right padding. The labels bottom padding. The labels left padding. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Padding(0, 5, 5, 0) .Visible(true); ); ) .Render(); %> Sets the labels padding The labels padding. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Padding(20) .Visible(true); ); ) .Render(); %> Sets the labels border The labels border width. The labels border color (CSS syntax). The labels border dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Border(1, "Red", ChartDashType.Dot) .Visible(true); ); ) .Render(); %> Configures the labels border The border configuration action Sets the labels format. The labels format. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Format("{0:C}") .Visible(true); ); ) .Render(); %> Sets the labels template. The labels template. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Template("${TotalSales}") .Visible(true); ); ) .Render(); %> Sets the labels opacity. The series opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Opacity(0.5) .Visible(true); ); ) .Render(); %> Sets the labels text rotation The labels text rotation. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Rotation(45) .Visible(true); ); ) .Render(); %> Initializes a new instance of the class. The data labels configuration. Sets the labels align The labels align. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Funnel(p => p.Sales) .Labels(labels => labels .Align(ChartFunnelLabelsAlign.Center) .Visible(true) ); ) .Render(); %> Sets the labels position The labels position. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Funnel(p => p.Sales) .Labels(labels => labels .Position(ChartFunnelLabelsPosition.Center) .Visible(true) ); ) .Render(); %> Defines the fluent interface for configuring the error bars. Initializes a new instance of the class. The error bars configuration. Sets the error bars color. The error bars color. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Color("red")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Color("red")) ) %> Sets a value indicating if the end caps should be shown. A value indicating if the end caps should be shown. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.EndCaps("false")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.EndCaps("false")) ) %> Configures the error bars lines. The line width. The line color. The line dash type. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Line(2, "red", ChartDashType.Dot)) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Line(2, "red", ChartDashType.Dot)) ) %> Configures the error bars lines. The configuration action. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Line(l => l.Width(2))) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Line(l => l.Width(2))) ) %> Initializes a new instance of the class. The error bars. Sets the error bars value. The error bars value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Value("stderr")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Value("stderr")) ) %> Sets the error bars difference from the point value. The error bars difference from the point value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Value(1)) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Value(1)) ) %> Sets the error bars low and high value difference from the point value. The error bar low value difference from point value. The error bar high value difference from point value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Value(1, 2)) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Value(1, 2)) ) %> Sets a handler function that returns the error bars value. The handler code that returns the error bars value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Value(@<text> function(data) { var value = data.value, lowPercentage = value * 0.05, highPercentage = value * 0.1; return [lowPercentage, highPercentage]; } </text>)) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Value(o => @"function(data) { var value = data.value, lowPercentage = value * 0.05, highPercentage = value * 0.1; return [lowPercentage, highPercentage]; }" )) ) %> Sets the error bars low field. The error bars low field. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.LowField("Low")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.LowField("Low")) ) %> Sets the error bars high field. The error bars high field. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.HighField("High")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.HighField("High")) ) %> Sets the error bars low and high fields. The error bars low field. The error bars high field. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Fields("Low", "High")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Bar(s => s.Sales) .ErrorBars(e => e.Fields("Low", "High")) ) %> Gets or sets the error bars X value. Gets or sets the error bars Y value. Gets the model data x axis error low member name. The model data x axis error low member name. Gets the model data x axis error high member name. The model data x axis error high member name. Gets the model data y axis error low member name. The model data y axis error low member name. Gets the model data y axis error high member name. The model data y axis error high member name. Defines the fluent interface for configuring the error bars. Initializes a new instance of the class. The error bars. Sets the error bars x value. The error bars x value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XValue("stderr")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XValue("stderr")) ) %> Sets the error bars difference from the point x value. The error bars difference from the point x value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XValue(1)) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XValue(1)) ) %> Sets the error bars low and high value difference from the point x value. The error bar low value difference from point x value. The error bar high value difference from point x value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XValue(1, 2)) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XValue(1, 2)) ) %> Sets a handler function that returns the error bars x value. The handler code that returns the error bars x value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XValue(@<text> function(data) { var value = data.value.x, lowPercentage = value * 0.05, highPercentage = value * 0.1; return [lowPercentage, highPercentage]; } </text>)) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XValue(o => @"function(data) { var value = data.value.x, lowPercentage = value * 0.05, highPercentage = value * 0.1; return [lowPercentage, highPercentage]; }" )) ) %> Sets the error bars y value. The error bars y value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YValue("stderr")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YValue("stderr")) ) %> Sets the error bars difference from the point y value. The error bars difference from the point y value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YValue(1)) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YValue(1)) ) %> Sets the error bars low and high value difference from the point y value. The error bar low value difference from point y value. The error bar high value difference from point y value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YValue(1, 2)) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YValue(1, 2)) ) %> Sets a handler function that returns the error bars y value. The handler code that returns the error bars y value. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YValue(@<text> function(data) { var value = data.value.y, lowPercentage = value * 0.05, highPercentage = value * 0.1; return [lowPercentage, highPercentage]; } </text>)) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YValue(o => @"function(data) { var value = data.value.y, lowPercentage = value * 0.05, highPercentage = value * 0.1; return [lowPercentage, highPercentage]; }" )) ) %> Sets the error bars x low field. The error bars x low field. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XLowField("Low")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XLowField("Low")) ) %> Sets the error bars x high field. The error bars x high field. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XHighField("High")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XHighField("High")) ) %> Sets the error bars x low and high fields. The error bars x low field. The error bars x high field. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XFields("Low", "High")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.XFields("Low", "High")) ) %> Sets the error bars y low field. The error bars y low field. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YLowField("Low")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YLowField("Low")) ) %> Sets the error bars y high field. The error bars y high field. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YHighField("High")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YHighField("High")) ) %> Sets the error bars y low and high fields. The error bars y low field. The error bars y high field. @(Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YFields("Low", "High")) ) ) <%= Html.Kendo().Chart(Model) .Name("chart") .Series(series => series .Scatter(s => s.x, s => s.y) .ErrorBars(e => e.YFields("Low", "High")) ) %> Creates panes for the . Initializes a new instance of the class. The container. Defines a chart pane. Defines a named chart pane. The unique pane name The parent Chart Defines the fluent interface for configuring Pane. Initializes a new instance of the class. The phart pane. Sets the title of the pane. The pane title. Defines the title of the pane. The configuration action. Sets the height of the pane. The pane height. Sets the pane background color The background color. Sets the pane margin The pane top margin. The pane right margin. The pane bottom margin. The pane left margin. Sets the pane margin The pane margin. Sets the pane padding The pane top padding. The pane right padding. The pane bottom padding. The pane left padding. Sets the pane padding The pane padding. Sets the pane border The pane border width. The pane border color. The pane dash type. Configures the pane border The border configuration action Gets or sets the Pane. The Pane. Defines the fluent interface for configuring . Initializes a new instance of the class. The axis base unit steps. The discrete BaseUnitStep values when BaseUnit is set to Seconds and BaseUnitStep is set to 0 (auto). The discrete steps when BaseUnit is set to Seconds. <% Html.Kendo().Chart() .Name("chart") .Title("Units sold") .Series(series => { series .Column(new int[] { 20, 40, 45, 30, 50 }); }) .CategoryAxis(axis => axis .Date() .BaseUnit(ChartAxisBaseUnit.Fit) .AutoBaseUnitSteps(steps => steps.Seconds(1, 2)) ) %> The discrete BaseUnitStep values when BaseUnit is set to Minutes and BaseUnitStep is set to 0 (auto). The discrete steps when BaseUnit is set to Minutes. <% Html.Kendo().Chart() .Name("chart") .Title("Units sold") .Series(series => { series .Column(new int[] { 20, 40, 45, 30, 50 }); }) .CategoryAxis(axis => axis .Date() .BaseUnit(ChartAxisBaseUnit.Fit) .AutoBaseUnitSteps(steps => steps.Minutes(1, 2)) ) %> The discrete BaseUnitStep values when BaseUnit is set to Hours and BaseUnitStep is set to 0 (auto). The discrete steps when BaseUnit is set to Hours. <% Html.Kendo().Chart() .Name("chart") .Title("Units sold") .Series(series => { series .Column(new int[] { 20, 40, 45, 30, 50 }); }) .CategoryAxis(axis => axis .Date() .BaseUnit(ChartAxisBaseUnit.Fit) .AutoBaseUnitSteps(steps => steps.Hours(1, 2)) ) %> The discrete BaseUnitStep values when BaseUnit is set to Days and BaseUnitStep is set to 0 (auto). The discrete steps when BaseUnit is set to Days. <% Html.Kendo().Chart() .Name("chart") .Title("Units sold") .Series(series => { series .Column(new int[] { 20, 40, 45, 30, 50 }); }) .CategoryAxis(axis => axis .Date() .BaseUnit(ChartAxisBaseUnit.Fit) .AutoBaseUnitSteps(steps => steps.Days(1, 2)) ) %> The discrete BaseUnitStep values when BaseUnit is set to Weeks and BaseUnitStep is set to 0 (auto). The discrete steps when BaseUnit is set to Weeks. <% Html.Kendo().Chart() .Name("chart") .Title("Units sold") .Series(series => { series .Column(new int[] { 20, 40, 45, 30, 50 }); }) .CategoryAxis(axis => axis .Date() .BaseUnit(ChartAxisBaseUnit.Fit) .AutoBaseUnitSteps(steps => steps.Weeks(1, 2)) ) %> The discrete BaseUnitStep values when BaseUnit is set to Months and BaseUnitStep is set to 0 (auto). The discrete steps when BaseUnit is set to Months. <% Html.Kendo().Chart() .Name("chart") .Title("Units sold") .Series(series => { series .Column(new int[] { 20, 40, 45, 30, 50 }); }) .CategoryAxis(axis => axis .Date() .BaseUnit(ChartAxisBaseUnit.Fit) .AutoBaseUnitSteps(steps => steps.Months(1, 2)) ) %> The discrete BaseUnitStep values when BaseUnit is set to Years and BaseUnitStep is set to 0 (auto). The discrete steps when BaseUnit is set to Years. <% Html.Kendo().Chart() .Name("chart") .Title("Units sold") .Series(series => { series .Column(new int[] { 20, 40, 45, 30, 50 }); }) .CategoryAxis(axis => axis .Date() .BaseUnit(ChartAxisBaseUnit.Fit) .AutoBaseUnitSteps(steps => steps.Years(1, 2)) ) %> Defines the fluent interface for configuring bubble series highlight. Defines the fluent interface for configuring series highlight. Initializes a new instance of the class. The series highlight. Sets the highlight visibility The highlight visibility. Gets or sets the highlight Initializes a new instance of the class. The series highlight. Sets the bubble highlight border width. The color is computed automatically from the base point color. The bubble highlight border width. Sets the bubble highlight border width. The border width. The border color Configures the highlight border Sets the bubble highlight opacity. The bubble highlight opacity. Defines the fluent interface for configuring pie series highlight. Initializes a new instance of the class. The series highlight. Sets the bubble highlight border width. The color is computed automatically from the base point color. The bubble highlight border width. Sets the bubble highlight border width. The border width. The border color Configures the highlight border Sets the bubble highlight opacity. The bubble highlight opacity. Sets the pie highlight color. The highlight color Defines the fluent interface for configuring candlestick series highlight. Initializes a new instance of the class. The series highlight. Sets the bubble highlight border width. The color is computed automatically from the base point color. The bubble highlight border width. Sets the bubble highlight border width. The border width. The border color Configures the highlight border Sets the bubble highlight opacity. The bubble highlight opacity. Configures the candlestick highlight line width. The lines width. Configures the candlestick highlight lines. The lines width. The lines color. Configures the candlestick highlight chart lines. The configuration action. Defines the fluent interface for configuring OHLC series highlight. Initializes a new instance of the class. The series highlight. Configures the candlestick highlight line width. The lines width. Configures the candlestick highlight lines. The lines width. The lines color. Configures the OHLC highlight chart lines. The configuration action. Gets or sets the highlight Defines the fluent interface for configuring . Initializes a new instance of the class. The chart line. Configures the crosshair tooltip The tooltip configuration action Sets the crosshair visible The crosshair visible. <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) ) ) .Render(); %> Defines the fluent interface for configuring . Initializes a new instance of the class. The chart crosshair tooltip. Sets the tooltip font The tooltip font (CSS format). <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) .Tooltip(tooltip => tooltip .Font("14px Arial,Helvetica,sans-serif") .Visible(true) ) ) ) .Render(); %> Sets the tooltip visible The tooltip visible. <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) .Tooltip(tooltip => tooltip .Visible(true) ) ) ) .Render(); %> Sets the tooltip background The tooltip background. <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) .Tooltip(tooltip => tooltip .Background("red") .Visible(true) ) ) ) .Render(); %> Sets the tooltip text color The tooltip text color. The default is the same as the series labels color. <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) .Tooltip(tooltip => tooltip .color("red") .Visible(true) ) ) ) .Render(); %> Sets the tooltip padding The tooltip top padding. The tooltip right padding. The tooltip bottom padding. The tooltip left padding. <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) .Tooltip(tooltip => tooltip .Padding(0, 5, 5, 0) .Visible(true) ) ) ) .Render(); %> Sets the tooltip padding The tooltip padding. <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) .Tooltip(tooltip => tooltip .Padding(20) .Visible(true) ) ) ) .Render(); %> Sets the tooltip border The tooltip border width. The tooltip border color (CSS syntax). <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) .Tooltip(tooltip => tooltip .Border(1, "Red") .Visible(true) ) ) ) .Render(); %> Configures the tooltip border The border configuration action Sets the tooltip format The tooltip format. The format string is ignored if a template is set. <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) .Tooltip(tooltip => tooltip .Format("{0:C}") .Visible(true) ) ) ) .Render(); %> Sets the tooltip template The tooltip template. A client-side template for the tooltip. Available template variables: value - the point value The format string is ignored if a template is set. <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) .Tooltip(tooltip => tooltip .Template("|<#= value #|>") .Visible(true) ) ) ) .Render(); %> Sets the tooltip opacity. The series opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <% Html.Kendo().Chart() .Name("Chart") .Series(series => { .series.Bar(new double[] { 15.7, 16.7, 20, 23.5, 26.6 }).Name("World"); .series.Bar(new double[] { 67.96, 68.93, 75, 74, 78 }).Name("United States"); }) .CategoryAxis(axis => axis .Categories("2005", "2006", "2007", "2008", "2009") .Crosshair(crosshair => crosshair .Visible(true) .Tooltip(tooltip => tooltip .Opacity(0.5) .Visible(true) ) ) ) .Render(); %> Defines the fluent interface for configuring bullet series. The type of the data item Initializes a new instance of the class. The series. Set distance between category clusters. A value of 1 means that there is a total of 1 bullet width / vertical bullet height between categories. The distance is distributed evenly on each side. The default value is 1.5 <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target).Gap(1)) %> Sets a value indicating the distance between bullets / categories. Value of 1 means that the distance between bullets is equal to their width. The default value is 0 <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target).Spacing(1)) %> Sets the bullets border. The bullets border width. The bullets border color (CSS syntax). The bullets border dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target).Border("1", "#000", ChartDashType.Dot)) .Render(); %> Sets the bullet effects overlay The bullet effects overlay. The default is ChartBarSeriesOverlay.Glass <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target).Overlay(ChartBarSeriesOverlay.None)) .Render(); %> Sets the series title displayed in the legend. The title. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target).Name("Sales")) %> Sets the series opacity. The series opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target).Opacity(0.5)) %> Sets the bullet fill color The bar bullet color (CSS syntax). <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target).Color("Red")) .Render(); %> Configure the data point tooltip for the series. Use the configurator to set data tooltip options. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target) .Tooltip(tooltip => { tooltip.Visible(true).Format("{0:C}"); }) ) %> Sets the data point tooltip visibility. A value indicating if the data point tooltip should be displayed. The tooltip is not visible by default. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target).Tooltip(true)) %> Sets the axis name to use for this series. The axis name for this series. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target).Name("Sales").Axis("secondary")) .ValueAxis(axis => axis.Numeric()) .ValueAxis(axis => axis.Numeric("secondary")) .CategoryAxis(axis => axis.AxisCrossingValue(0, 10)) %> Configure the data point tooltip for the series. Use the configurator to set data tooltip options. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series.Bullet(s => s.Current, s => s.Target) .Tooltip(tooltip => { tooltip.Visible(true).Format("{0:C}"); }) ) %> Gets or sets the series. The series. Defines the fluent interface for configuring the chart target. Initializes a new instance of the class. The chart target configuration. Sets the target width. The target width. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bullet(s => s.Current, s => s.Target) .Target(target => target .Width(10) ); ) .Render(); %> Sets the target border The target border width. The target border color (CSS syntax). The target border dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bullet(s => s.Current, s => s.Target) .Target(target => target .Border(1, "Red", ChartDashType.Dot) ); ) .Render(); %> Configures the markers border The border configuration action Sets the color of the bullet chart target. The color of the bullet chart target. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bullet(s => s.Current, s => s.Target) .Target(target => target .Color("Red"); ); ) .Render(); %> Defines the fluent interface for configuring the . Initializes a new instance of the class. The chart legend. Sets the selection lower boundary The selection lower boundary. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.Select(select => select.From(from)) ) .Render(); %> Sets the selection lower boundary The selection lower boundary. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.Select(select => select.From(from).To(to) )) .Render(); %> Sets the selection upper boundary The selection upper boundary. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.Select(select => select.To(toDate).To(toDate) )) .Render(); %> Sets the selection upper boundary The selection upper boundary. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.Select(select => select.To(to).To(to) )) .Render(); %> Configures the mousewheel zoom options The mousewheel zoom options Defines the fluent interface for configuring the . Initializes a new instance of the class. The mousewheel zoom settings. Reverses the mousewheel direction. Rotating the wheel down will shrink the selection, rotating up will expand it. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.Select(select => select .From(fromDate).To(toDate) .Mousewheel(mw => mw.Reverse()) )) .Render(); %> Sets a value indicating if the mousewheel should be reversed. true: scrolling up shrinks the selection. false: scrolling down expands the selection. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.Select(select => select .From(fromDate).To(toDate) .Mousewheel(mw => mw.Reverse(true)) )) .Render(); %> Sets the mousehweel zoom type The mousehweel zoom type. Default value is ChartZoomDirection.Both <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.Select(select => select.From(from).To(to) .Mousewheel(mw => mw.Zoom(ChartZoomDirection.Left)) )) .Render(); %> Defines the fluent interface for configuring the chart labels. Initializes a new instance of the class. The labels configuration. Sets the labels font The labels font (CSS format). <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend .Labels(labels => labels .Font("14px Arial,Helvetica,sans-serif") ) ) .Render(); %> Sets the labels text color The labels text color. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend .Labels(labels => labels .Color("Red") ) ) .Render(); %> Sets the labels template. The labels template. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend .Labels(labels => labels .Template("${TotalSales}") ) ) .Render(); %> Defines the fluent interface for configuring the chart note label. Initializes a new instance of the class. The data labels configuration. Sets the labels position The labels position. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(note => note .Label(label => label .Position(ChartNoteLabelPosition.Inside) ) ) ) .Render(); %> Sets the labels position The labels position. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(note => note .Data(data => { data.Add().Value(1).Text("A"); data.Add().Value(2).Text("B"); }) ) ) .Render(); %> Defines the fluent interface for configuring the chart note line. Initializes a new instance of the class. The connectors configuration. Sets the line width The line width. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Note(note => note.Line(line => line.Width(2))) ) .Render(); %> Sets the line color The line color. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Note(note => note.Line(line => line.Color("red"))) ) .Render(); %> Sets the connectors padding The connectors padding. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Note(note => note.Line(line => line.Length(15))) ) .Render(); %> Defines the fluent interface for configuring the chart note. Initializes a new instance of the class. The note configuration. Sets the line configuration of the note The line configuration. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(note => note .Line(line => line.Width(2)) ) ) .Render(); %> Sets the label configuration of the note The label configurator. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(note => note .Label(label => label.Position(ChartNoteLabelPosition.Inside)) ) ) .Render(); %> Sets the icon configuration of the note The icon configuration. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(note => note.Icon(icon => icon.Size(10))) ) .Render(); %> Sets the note position. The note position. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(note => note.Position(ChartNotePosition.Left)) ) .Render(); %> Creates items for the . Initializes a new instance of the class. The contener of the item. Defines a item. Defines the fluent interface for configuring the chart note. Initializes a new instance of the class. The data labels configuration. Sets the note value. The value of the note. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(note => note .Data(items => { data.Add().Value(1); data.Add().Value(2); }) ) ) .Render(); %> Defines the fluent interface for configuring notes of the axis. Initializes a new instance of the class. The notes. Sets the line configuration of the note The line configuration. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(notes => notes .Line(line => line.Width(2)) ) ) .Render(); %> Sets the label configuration of the note The label configurator. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(notes => notes .Label(label => label.Position(ChartNoteLabelPosition.Inside)) ) ) .Render(); %> Sets the icon configuration of the note The icon configuration. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(notes => notes.Icon(icon => icon.Size(10))) ) .Render(); %> Sets the note position. The note position. <% Html.Kendo().Chart() .Name("Chart") .ValueAxis(a => a.Numeric() .Note(notes => notes.Position(ChartNotePosition.Left)) ) .Render(); %> Gets or sets the axis. The axis. Defines the fluent interface for configuring . Defines the fluent interface for configuring . Initializes a new instance of the class. The chart line. Sets the line visibility The line visibility. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MajorGridLines(lines => lines.Visible(true))) .Render(); %> Initializes a new instance of the class. The chart line. Sets the line skip The line skip. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MajorGridLines(lines => lines.Skip(2))) .Render(); %> Sets the line step The line step. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MajorGridLines(lines => lines.Step(2))) .Render(); %> Defines the fluent interface for configuring . Initializes a new instance of the class. The chart line. Sets the line skip The line skip. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MinorGridLines(lines => lines.Skip(2))) .Render(); %> Sets the line step The line step. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MinorGridLines(lines => lines.Step(2))) .Render(); %> Defines the fluent interface for configuring . Initializes a new instance of the class. The chart line. Sets the line skip The line skip. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MinorTicks(lines => lines.Skip(2))) .Render(); %> Sets the line step The line step. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MinorTicks(lines => lines.Step(2))) .Render(); %> Defines the fluent interface for configuring . Initializes a new instance of the class. The chart line. Sets the line skip The line skip. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MajorTicks(lines => lines.Skip(2))) .Render(); %> Sets the line step The line step. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.MajorTicks(lines => lines.Step(2))) .Render(); %> Defines the fluent interface for configuring bar series. The type of the data item Initializes a new instance of the class. The series. Sets the aggregate function for date series. This function is used when a category (an year, month, etc.) contains two or more points. Lower aggregate name. Q1 aggregate name. Median aggregate name. Q3 aggregate name. Upper aggregate name. Mean aggregate name. Outliers aggregate name. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.BoxPlot(s => s.Lower, s => s.Q1, s => s.Median, s => s.Q3, s => s.Upper) .Aggregate( ChartSeriesAggregate.Max, ChartSeriesAggregate.Max, ChartSeriesAggregate.Max, ChartSeriesAggregate.Max, ChartSeriesAggregate.Max, ChartSeriesAggregate.Max, ChartSeriesAggregate.Max, ChartSeriesAggregate.First ) ) %> Set distance between category clusters. A value of 1 means that there is a total of 1 point width between categories. The distance is distributed evenly on each side. The default value is 1 <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.BoxPlot(s => s.Lower, s => s.Q1, s => s.Median, s => s.Q3, s => s.Upper).Gap(1.5)) %> Sets a value indicating the distance between points in the same category. Value of 1 means that the distance between points in the same category. The default value is 0.3 <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.BoxPlot(s => s.Lower, s => s.Q1, s => s.Median, s => s.Q3, s => s.Upper).Spacing(1)) %> Sets the points border The points border width. The points border color (CSS syntax). The points border dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.BoxPlot(s => s.Lower, s => s.Q1, s => s.Median, s => s.Q3, s => s.Upper).Border("1", "#000", ChartDashType.Dot)) .Render(); %> Configures the ohlc chart lines. The lines width. The lines color. The lines dashType. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .BoxPlot(s => s.Lower, s => s.Q1, s => s.Median, s => s.Q3, s => s.Upper) .Line(2, "red", ChartDashType.Dot) ) .Render(); %> Configures the ohlc line width. The lines width. Configures the ohlc lines. The lines width. The lines color. Configures the ohlc chart lines. The configuration action. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .BoxPlot(s => s.Lower, s => s.Q1, s => s.Median, s => s.Q3, s => s.Upper) .Line(line => line.Opacity(0.2)) ) .Render(); %> Configures the box plot chart outliers. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .BoxPlot(s => s.Lower, s => s.Q1, s => s.Median, s => s.Q3, s => s.Upper) .Outliers(outliers => outliers .Type(ChartMarkerShape.Triangle) ); ) %> Sets the visibility of box plot chart outliers. The visibility. The default value is true. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .BoxPlot(s => s.Lower, s => s.Q1, s => s.Median, s => s.Q3, s => s.Upper) .Outliers(true); ) %> Configures the box plot chart extremum. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .BoxPlot(s => s.Lower, s => s.Q1, s => s.Median, s => s.Q3, s => s.Upper) .Extremum(extremum => extremum .Type(ChartMarkerShape.Triangle) ); ) %> Sets the visibility of box plot chart extremum. The visibility. The default value is true. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .BoxPlot(s => s.Lower, s => s.Q1, s => s.Median, s => s.Q3, s => s.Upper) .Extremum(true); ) %> Defines the position of axis ticks The tick is drawn on the outer side of the axis No tick is drawn Defines the gradient of bar/column charts The bars have glass effect overlay. The bars have no effect overlay. Defines the position of bar/column chart labels The label is positioned at the bar center The label is positioned inside, near the end of the bar The label is positioned inside, near the base of the bar The label is positioned outside, near the end of the bar. Not applicable for stacked bar series. Defines the position chart legend The legend is positioned on the top The legend is positioned on the bottom The legend is positioned on the left The legend is positioned on the right The legend is positioned using OffsetX and OffsetY Defines the position of point labels. The label is positioned at the top of the point marker. The label is positioned at the right of the point marker. The label is positioned at the bottom of the point marker. The label is positioned at the left of the point marker. Defines the behavior for handling missing values in line series. The value is interpolated from neighboring points. The value is assumed to be zero. The line stops before the missing point and continues after it. Defines the shape of the marker. The marker shape is square. The marker shape is triangle. The marker shape is circle. Defines text alignment options The text is aligned to the left The text is aligned to the middle The text is aligned to the right Defines the position chart title The title is positioned on the top The title is positioned on the bottom Specifies a line dash type. Specifies a solid line. Specifies a line consisting of dots. Specifies a line consisting of dashes. Specifies a line consisting of a repeating pattern of long-dash. Specifies a line consisting of a repeating pattern of dash-dot. Specifies a line consisting of a repeating pattern of lond-dash-dot. Specifies a line consisting of a repeating pattern of long-dash-dot-dot. Defines the available pie series effects overlays The pies have no effect overlay The pie segments have sharp bevel effect overlay The pie segments have sharp bevel effect overlay Defines the alignment of the pie labels. The labels are positioned in circle around the pie chart. The labels are positioned in columns to the left and right of the pie chart. Defines the behavior for handling missing values in scatter line series. The value is interpolated from neighboring points. The line stops before the missing point and continues after it. Defines the position of pie chart labels. The label is positioned at the center of the pie segment. The label is positioned inside, near the end of the pie segment. The label is positioned outside, near the end of the pie segment. The label and the pie segment are connected with connector line. Defines chart axis orientation The axis is verical The axis is horizontal Defines the position chart axis title The axis title is positioned on the top (work only with vertical axis) The axis title is positioned on the bottom (work only with vertical axis) The axis title is positioned on the left (work only with horizontal axis) The axis title is positioned on the right (work only with horizontal axis) The axis title is positioned in the center Defines the behavior for handling missing values in area series. The value is interpolated from neighboring points. The value is assumed to be zero. The line stops before the missing point and continues after it. Aggregate function for date series. The highest value for the date period The lowest value for the date period The sum of all values for the date period The number of values for the date period The average of all values for the date period The first of all values for the date period Specifies the category axis type. Discrete category axis. Specialized axis for displaying chronological data. The base time interval for the axis. Seconds Minutes Hours Days Months Weeks Years Automatic base unit based on limit set from MaxDataGroups. Note that the BaseUnitStep setting will be disregarded. Defines the fluent interface for configuring of all axes. Defines the fluent interface for configuring axes. The type of the series builder. Initializes a new instance of the class. The axis. Configures the major ticks. The configuration action. <%= Html.Kendo().Chart(Model) .Name("Chart") .ValueAxis(axis => axis .MajorTicks(ticks => ticks .Visible(false) ) ) %> Configures the major ticks. The configuration action. <%= Html.Kendo().Chart(Model) .Name("Chart") .ValueAxis(axis => axis .Crosshair(crosshair => crosshair .Visible(false) ) ) %> Sets the axis name. The axis name. <%= Html.Kendo().Chart(Model) .Name("Chart") .ValueAxis(axis => axis .Name("axisName") ) %> Configures the minor ticks. The configuration action. <%= Html.Kendo().Chart(Model) .Name("Chart") .ValueAxis(axis => axis .MinorTicks(ticks => ticks .Visible(false) ) ) %> Configures the major grid lines. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .MajorGridLines(lines => lines.Visible(true)) ) %> Sets color and width of the major grid lines and enables them. The major gridlines width The major gridlines color (CSS syntax) The major gridlines line dashType. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .MajorGridLines(2, "red", ChartDashType.Dot) ) %> Configures the minor grid lines. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .MinorGridLines(lines => lines.Visible(true)) ) %> Sets color and width of the minor grid lines and enables them. The minor gridlines width The minor gridlines color (CSS syntax) The minor grid lines dash type <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .MinorGridLines(2, "red", ChartDashType.Dot) ) %> Configures the axis line. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .Line(line => line.Color("#f00")) ) %> Sets color and width of the lines and enables them. The axis line width The axis line color (CSS syntax) The axis line dashType. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .Line(2, "#f00", ChartDashType.Dot) ) %> Configures the axis labels. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Labels(labels => labels .Color("Red") .Visible(true) ); ) %> Sets the visibility of numeric axis chart labels. The visibility. The default value is false. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis.Labels(true)) %> Defines the plot bands items. The add action. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .PlotBands.Add() .From(1) .To(2) ) %> Configures the chart axis title. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .Title(title => title.Text("Axis")) ) %> Sets the axis title. The axis title. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .Title("Axis") ) %> Renders the axis in the pane with the specified name. The pane name. <%= Html.Kendo().Chart() .Name("Chart") .Panes(panes => { panes.Add().Title("Value"); panes.Add("volumePane").Title("Volume"); }) .CategoryAxis(axis => axis .Categories(s => s.DateString) .Pane("volumePane") ) %> Sets the color for all axis elements. Can be overriden by individual settings. The axis color. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .Color("#ff0000") ) %> Sets the axis reverse option. A value indicating if the axis labels should be rendered in reverse. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .Reverse(true) ) %> Reverse the axis. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) .Reverse() ) %> Sets the axis visibility The axis visibility. The angle (degrees) where the 0 value is placed. It defaults to 0. Angles increase counterclockwise and 0 is to the right. Negative values are acceptable. A value indicating if the automatic axis range should snap to 0. The narrowRange value. Sets the axis background color The axis visibility. Gets or sets the axis. The axis. Initializes a new instance of the class. The chart. Defines the fluent interface for configuring the chart labels. Initializes a new instance of the class. The labels configuration. Renders the axis labels on the other side. A value indicating whether to render the axis labels on the other side. <%= Html.Kendo().Chart() .Name("Chart") .ValueAxis(axis => axis .Numeric().Labels(labels => labels.Mirror(true)) ) .CategoryAxis(axis => axis .Categories(s => s.DateString) // Move the value axis to the right side .AxisCrossingValue(5) ) %> Label rendering step. A value indicating the step at which labels are rendered. Every n-th label is rendered where n is the step. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(product => product.Name) .Labels(labels => labels.Step(2)) ) %> Label rendering skip. Skips rendering the first n labels. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Categories(product => product.Name) .Labels(labels => labels.Skip(2)) ) %> Defines the fluent interface for configuring the chart data labels. Initializes a new instance of the class. The data labels configuration. Sets the labels align The labels align. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Pie(p => p.Sales) .Labels(labels => labels .Align(ChartPieLabelsAlign.Column) .Visible(true) ); ) .Render(); %> Sets the labels distance The labels distance. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Pie(p => p.Sales) .Labels(labels => labels .Distance(20) .Visible(true) ); ) .Render(); %> Sets the labels position The labels position. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Pie(p => p.Sales) .Labels(labels => labels .Position(ChartPieLabelsPosition.Center) .Visible(true) ); ) .Render(); %> Defines the fluent interface for configuring the chart data points tooltip. Initializes a new instance of the class. The data point tooltip configuration. Sets the tooltip font The tooltip font (CSS format). <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Font("14px Arial,Helvetica,sans-serif") .Visible(true) ) .Render(); %> Sets the tooltip visibility The tooltip visibility. The tooltip is not visible by default. <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Visible(true) ) .Render(); %> Sets the tooltip background color The tooltip background color. The default is determined from the series color. <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Background("Red") .Visible(true) ) .Render(); %> Sets the tooltip text color The tooltip text color. The default is the same as the series labels color. <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Color("Red") .Visible(true) ) .Render(); %> Sets the tooltip padding The tooltip top padding. The tooltip right padding. The tooltip bottom padding. The tooltip left padding. <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Padding(0, 5, 5, 0) .Visible(true) ) .Render(); %> Sets the tooltip padding The tooltip padding. <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Padding(20) .Visible(true) ) .Render(); %> Sets the tooltip border The tooltip border width. The tooltip border color (CSS syntax). <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Border(1, "Red") .Visible(true) ) .Render(); %> Configures the tooltip border The border configuration action Sets the tooltip format The tooltip format. The format string is ignored if a template is set. <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Format("{0:C}") .Visible(true) ) .Render(); %> Sets the tooltip template The tooltip template. A client-side template for the tooltip. Available template variables: value - the point value category - the category name series - the data series configuration object dataItem - the original data item (client-side binding only) The format string is ignored if a template is set. <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Template("<#= category #> - <#= value #>") .Visible(true) ) .Render(); %> Sets the tooltip opacity. The series opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Opacity(0.5) .Visible(true) ) .Render(); %> Sets the tooltip shared The tooltip shared. <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Visible(true) .Shared(true) ) .Render(); %> Sets the tooltip shared template The tooltip shared template. A client-side shared template for the tooltip. Available shared template variables: points - the category points category - the category name <% Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => tooltip .Template("<#= category #>") .Visible(true) ) .Render(); %> Defines the fluent interface for configuring pie series. The type of the data item Initializes a new instance of the class. The series. Sets the name of the series. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Pie(s => s.Sales, s => s.DateString).Name("Sales")) %> Sets the series opacity. The series opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Pie(s => s.Sales, s => s.DateString).Opacity(0.5)) %> Sets the padding of the chart. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Pie(s => s.Sales, s => s.DateString).Padding(100)) .Render(); %> Sets the start angle of the first pie segment. The pie start angle(in degrees). <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Pie(s => s.Sales, s => s.DateString).StartAngle(100)) .Render(); %> Configures the pie chart labels. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Pie(s => s.Sales, s => s.DateString) .Labels(labels => labels .Color("red") .Visible(true) ); ) %> Sets the visibility of pie chart labels. The visibility. The default value is false. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Pie(s => s.Sales, s => s.DateString) .Labels(true); ) %> Sets the pie segments border The pie segments border width. The pie segments border color (CSS syntax). The pie segments border dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Pie(s => s.Sales, s => s.DateString).Border(1, "#000", ChartDashType.Dot)) .Render(); %> Configures the pie border The border configuration action Sets the pie segments effects overlay The pie segment effects overlay. The default value is set in the theme. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Pie(s => s.Sales, s => s.DateString).Overlay(ChartPieSeriesOverlay.None)) .Render(); %> Configures the pie chart connectors. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Pie(s => s.Sales, s => s.DateString) .Connectors(c => c .Color("red") ); ) %> Configures the pie highlight The configuration action. Gets or sets the series. The series. Defines the fluent interface for configuring the chart connectors. Initializes a new instance of the class. The connectors configuration. Sets the connectors width The connectors width. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Pie(p => p.Sales) .Connectors(c => c .Width(3) ); ) .Render(); %> Sets the connectors color The connectors color. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Pie(p => p.Sales) .Connectors(c => c .Color(red) ); ) .Render(); %> Sets the connectors padding The connectors padding. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Pie(p => p.Sales) .Connectors(c => c .Padding(10) ); ) .Render(); %> Defines the fluent interface for configuring plot band. Initializes a new instance of the class. The plot band. Sets the plot band start position. The plot band start position. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .PlotBands(plotBands => plotBands .Add().From(1).Color("Red"); ) ) .Render(); %> Sets the plot band end position. The plot band end position. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .PlotBands(plotBands => plotBands .Add().To(2).Color("Red"); ) ) .Render(); %> Sets the plot band background color The plot band background color. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .PlotBands(plotBands => plotBands .Add().Color("Red"); ) ) .Render(); %> Sets the plot band opacity The plot band opacity. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .PlotBands(plotBands => plotBands .Add().Opacity(0.5); ) ) .Render(); %> Creates plot bands for the . Initializes a new instance of the class. The axis. Adds a plot band. Defines a item. The Axis Defines the fluent interface for configuring the . Initializes a new instance of the class. The chart axis title. Sets the axis title text. The text of the axis title. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Text("Axis") ); ) .Render(); %> Sets the axis title font. The axis title font (CSS format). <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Font("16px Arial,Helvetica,sans-serif") ); ) .Render(); %> Sets the axis title background color. The axis background color. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Background("red") ); ) .Render(); %> Sets the axis title text color. The axis text color. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Color("red") ); ) .Render(); %> Sets the axis title position. The axis title position. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Position(ChartTitlePosition.Center) ); ) .Render(); %> Sets the axis title margin. The axis title top margin. The axis title right margin. The axis title bottom margin. The axis title left margin. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Margin(20, 20, 20, 20) ); ) .Render(); %> Sets the axis title margin. The axis title margin. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Margin(20) ); ) .Render(); %> Sets the axis title padding. The axis title top padding. The axis title right padding. The axis title bottom padding. The axis title left padding. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Padding(20, 20, 20, 20) ); ) .Render(); %> Sets the axis title padding The axis title padding. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Padding(20) ); ) .Render(); %> Sets the axis title border The axis title border width. The axis title border color. The axis title dash type. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Border(1, "#000", ChartDashType.Dot) ); ) .Render(); %> Configures the title border The border configuration action Sets the axis title opacity. The series opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <% Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Title(title => title .Opacity(0.5) ); ) .Render(); %> Defines the fluent interface for configuring . Initializes a new instance of the class. The chart border. Sets the border color. The border color (CSS format). <% Html.Kendo().Chart() .Name("Chart") .ChartArea(chartArea => chartArea.Border(border => border.Color("#f00"))) .Render(); %> Sets the border opacity The border opacity (CSS format). <% Html.Kendo().Chart() .Name("Chart") .ChartArea(chartArea => chartArea.Border(border => border.Opacity(0.2))) .Render(); %> Sets the border width. The border width. <% Html.Kendo().Chart() .Name("Chart") .ChartArea(chartArea => chartArea.Border(border => border.Width(2))) .Render(); %> Sets the border dashType. The border dashType. <% Html.Kendo().Chart() .Name("Chart") .ChartArea(chartArea => chartArea.Border(border => border.DashType(ChartDashType.Dot))) .Render(); %> Defines the fluent interface for configuring . Initializes a new instance of the class. The chart axis ticks. Sets the ticks size The ticks size. <% Html.Kendo().Chart() .Name("chart") .ValueAxis(axis => axis.MajorTicks(ticks => ticks.Size(2))) .Render(); %> Sets the ticks visibility The ticks visibility. <% Html.Kendo().Chart() .Name("chart") .ValueAxis(axis => axis.MajorTicks(ticks => ticks.Visible(false))) .Render(); %> Configures date category axis for the . The type of the data item to which the chart is bound to Initializes a new instance of the class. The chart. Defines bound categories. The expression used to extract the categories value from the chart model Defines categories. The list of categories Defines categories. The list of categories Sets the date category axis base unit. The date category axis base unit Sets the step (interval) between categories in base units. Specifiying 0 (auto) will set the step to such value that the total number of categories does not exceed MaxDateGroups. This option is ignored if baseUnit is set to "fit". the step (interval) between categories in base units. Set 0 for automatic step. The default value is 1. Specifies the maximum number of groups (categories) that the chart will attempt to produce when either BaseUnit is set to Fit or BaseUnitStep is set to 0 (auto). This option is ignored in all other cases. the maximum number of groups (categories). The default value is 10. If set to false, the min and max dates will not be rounded off to the nearest baseUnit. This option is most useful in combination with explicit min and max dates. It will be ignored if either Bar, Column, OHLC or Candlestick series are plotted on the axis. A boolean value that indicates if the axis range should be rounded to the nearest base unit. The default value is true. Sets the week start day. The week start day when the base unit is Weeks. The default is Sunday. Positions categories and series points on major ticks. This removes the empty space before and after the series. This option will be ignored if either Bar, Column, OHLC or Candlestick series are plotted on the axis. A boolean value that indicates if the empty space before and after the series should be removed. The default value is false. Positions categories and series points on major ticks. This removes the empty space before and after the series. This option will be ignored if either Bar, Column, OHLC or Candlestick series are plotted on the axis. Specifies the discrete baseUnitStep values when either BaseUnit is set to Fit or BaseUnitStep is set to 0 (auto). The configuration action. Sets the date category axis minimum (start) date. The date category axis minimum (start) date Sets the date category axis maximum (end) date. The date category axis maximum (end) date Sets value at which the first perpendicular axis crosses this axis. The value at which the first perpendicular axis crosses this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .CategoryAxis(axis => axis.Date().AxisCrossingValue(4)) .ValueAxis(axis => axis.Numeric().Title("Axis 1")) .ValueAxis(axis => axis.Numeric("secondary").Title("Axis 2")) %> Sets value at which perpendicular axes cross this axis. The values at which perpendicular axes cross this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .CategoryAxis(axis => axis.Date().AxisCrossingValue(0, 10)) .ValueAxis(axis => axis.Numeric().Title("Axis 1")) .ValueAxis(axis => axis.Numeric("secondary").Title("Axis 2")) %> Sets value at which perpendicular axes cross this axis. The values at which perpendicular axes cross this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .CategoryAxis(axis => axis.Date().AxisCrossingValue(new double[] { 0, 10 })) .ValueAxis(axis => axis.Numeric().Title("Axis 1")) .ValueAxis(axis => axis.Numeric("secondary").Title("Axis 2")) %> Configures the axis labels. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Date() .Labels(labels => labels .Culture(new CultureInfo("es-ES") .Visible(true) ) )) %> Sets the selection range The selection range start. The selection range end. *Note*: The specified date is not included in the selected range unless the axis is justified. In order to select all categories specify a value larger than the last date. <%= Html.Kendo().StockChart(Model) .Name("StockChart") .CategoryAxis(axis => axis.Select(DateTime.Today.AddMonths(-1), DateTime.Today)) %> Configures the selection The configuration action. <%= Html.Kendo().StockChart(Model) .Name("StockChart") .CategoryAxis(axis => axis.Select(select => select.Mousewheel(mw => mw.Reverse()) )) %> The parent Chart Defines the fluent interface for configuring the chart labels. Initializes a new instance of the class. The labels configuration. Culture to use for formatting the dates. Culture to use for formatting the dates. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Date() .Categories(sale => sale.Date) .Labels(labels => labels.Culture(new CultureInfo("es-ES"))) ) %> Culture to use for formatting the dates. See Globalization for more information. Culture to use for formatting the dates. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Date() .Categories(sale => sale.Date) .Labels(labels => labels.Culture(new CultureInfo("es-ES"))) ) %> Defines the fluent interface for configuring . Initializes a new instance of the class. The date formats. Sets the date format when the base date unit is The date format. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Date() .Labels(labels => labels .DateFormats(formats => formats .Seconds("HH:mm:ss") ) ) ); %> Sets the date format when the base date unit is The date format. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Date() .Labels(labels => labels .DateFormats(formats => formats .Minutes("ss") ) ) ); %> Sets the date format when the base date unit is The date format. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Date() .Labels(labels => labels .DateFormats(formats => formats .Hours("HH:mm") ) ) ); %> Sets the date format when the base date unit is The date format. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Date() .Labels(labels => labels .DateFormats(formats => formats .Days("dddd dd") ) ) ); %> Sets the date format when the base date unit is The date format. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Date() .Labels(labels => labels .DateFormats(formats => formats .Months("MMMM MM") ) ) ); %> Sets the date format when the base date unit is The date format. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Date() .Labels(labels => labels .DateFormats(formats => formats .Months("dddd") ) ) ); %> Sets the date format when the base date unit is The date format. <%= Html.Kendo().Chart() .Name("Chart") .CategoryAxis(axis => axis .Date() .Labels(labels => labels .DateFormats(formats => formats .Years("yyyy") ) ) ); %> Defines the fluent interface for configuring numeric axis. Initializes a new instance of the class. The axis. Sets the date axis base unit. The date axis base unit Sets the start date of the axis. The start date of the axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .XAxis(a => a.Date().Min(DateTime.Parse("2012/01/01"))) %> Sets the end date of the axis. The end date of the axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .XAxis(a => a.Date().Max(DateTime.Parse("2012/01/01"))) %> Sets the interval between major divisions in base units. The interval between major divisions in base units. <%= Html.Kendo().Chart(Model) .Name("Chart") .XAxis(a => a.Date().BaseUnit(ChartAxisBaseUnit.Months).MajorUnit(4)) %> Sets the interval between minor divisions in base units. It defaults to 1/5th of the majorUnit The interval between minor divisions in base units. <%= Html.Kendo().Chart(Model) .Name("Chart") .XAxis(a => a.Date().BaseUnit(ChartAxisBaseUnit.Days).MajorUnit(4).MinorUnit(2)) %> Sets value at which the first perpendicular axis crosses this axis. The value at which the first perpendicular axis crosses this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .XAxis(axis => axis.Date().AxisCrossingValue(DateTime.Parse("2012/01/01"))) %> Sets value at which perpendicular axes cross this axis. The values at which perpendicular axes cross this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .CategoryAxis(axis => axis.Date().AxisCrossingValue(DateTime.Parse("2012/01/01"), DateTime.Parse("2012/01/10"))) .ValueAxis(axis => axis.Numeric().Title("Axis 1")) .ValueAxis(axis => axis.Numeric("secondary").Title("Axis 2")) %> Sets value at which perpendicular axes cross this axis. The values at which perpendicular axes cross this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .CategoryAxis(axis => axis.Date().AxisCrossingValue(new DateTime[] { DateTime.Parse("2012/01/01"), DateTime.Parse("2012/01/10") })) .ValueAxis(axis => axis.Numeric().Title("Axis 1")) .ValueAxis(axis => axis.Numeric("secondary").Title("Axis 2")) %> Configures the axis labels. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .XAxis(axis => axis .Date() .Labels(labels => labels .Culture(new CultureInfo("es-ES") .Visible(true) ) )) %> Defines the fluent interface for configuring donut series. The type of the data item Initializes a new instance of the class. The series. Sets the margin of the donut series. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Donut(s => s.Sales, s => s.DateString).Margin(10)) .Render(); %> Sets the the size of the donut hole. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Donut(s => s.Sales, s => s.DateString).HoleSize(40)) .Render(); %> Sets the size of the donut series. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Donut(s => s.Sales, s => s.DateString).Size(20)) .Render(); %> Gets or sets the series. The series. Defines the fluent interface for configuring bubble series. The type of the data item Initializes a new instance of the class. The series. Configures the bubble chart behavior for negative values. By default negative values are not visible. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bubble(s => s.x, s => s.y, s => s.size) .NegativeValues(n => n .Visible(true) ); ) %> Sets the bubble border The bubble border width. The bubble border color (CSS syntax). <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bubble(s => s.x, s => s.y, s => s.size) .Border(1, "Red"); ) .Render(); %> Not applicable to bubble series Not applicable to bubble series Configures the bubble highlight The configuration action. Defines the fluent interface for configuring . Initializes a new instance of the class. The negative value settings. Sets the color for bubbles representing negative values The bubble color (CSS format). <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bubble(s => s.x, s => s.y, s => s.size) .NegativeValues(n => n .Visible(true) .Color("#ff0000") ); ) .Render(); %> Sets the visibility for bubbles representing negative values The visibility for bubbles representing negative values. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bubble(s => s.x, s => s.y, s => s.size) .NegativeValues(n => n .Visible(true) ); ) .Render(); %> Defines the fluent interface for configuring bar series. The type of the data item Initializes a new instance of the class. The series. Sets the aggregate function for date series. This function is used when a category (an year, month, etc.) contains two or more points. Open aggregate name. High aggregate name. Low aggregate name. Close aggregate name. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.OHLC(s => s.Sales).Aggregate(ChartSeriesAggregate.Avg)) %> Set distance between category clusters. A value of 1 means that there is a total of 1 point width between categories. The distance is distributed evenly on each side. The default value is 1 <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.OHLC(s => s.Sales).Gap(1.5)) %> Sets a value indicating the distance between points in the same category. Value of 1 means that the distance between points in the same category. The default value is 0.3 <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => series.Spacing(s => s.Sales).Spacing(1)) %> Sets the points border The points border width. The points border color (CSS syntax). The points border dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.OHLC(s => s.Sales).Border("1", "#000", ChartDashType.Dot)) .Render(); %> Configures the ohlc chart lines. The lines width. The lines color. The lines dashType. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .OHLC(s => s.Sales) .Line(2, "red", ChartDashType.Dot) ) .Render(); %> Configures the ohlc line width. The lines width. Configures the ohlc lines. The lines width. The lines color. Configures the ohlc chart lines. The configuration action. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Area(s => s.Sales) .Line(line => line.Opacity(0.2)) ) .Render(); %> Configures the series highlight The configuration action. Defines the fluent interface for configuring candlestick series. The type of the data item Initializes a new instance of the class. The series. Sets the bar effects overlay The candlestick effects overlay. The default is ChartBarSeriesOverlay.Glass <% Html.Kendo().Chart() .Name("Chart") .Series(series => series.Candlestick(s => s.Sales).Overlay(ChartBarSeriesOverlay.None)) .Render(); %> Configures the series highlight The configuration action. Gets or sets the series. The series. Aggregates function for date series. The distance between category clusters. The data used for binding. The ohlc chart line configuration. The type of the chart. Space between points. Gets or sets the point border. Gets the model color member name. The model color member name. Gets the model data category member name. The model data category member name. Gets the model note text member name. The model note text member name. Gets the model lower member name. The model lower member name. Gets the model q1 member name. The model q1 member name. Gets the model median member name. The model median member name. Gets the model close member name. The model close member name. Gets the model upper member name. The model upper member name. Gets the model mean member name. The model mean member name. Gets the model outliers member name. The model outliers member name. Gets or sets outliers. Gets or sets extremes. Initializes a new instance of the class. The lower expression. The q1 expression. The median expression. The q3 expression. The upper expression. The mean expression. The outliers expression. The expression used to extract the point category from the chart model. The color expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. Gets the series type. Gets the model lower member name. The model lower member name. Gets the model q1 member name. The model q1 member name. Gets the model median member name. The model median member name. Gets the model model q3 member name. The model q3 member name. Gets the model upper member name. The model upper member name. Gets the model mean member name. The model mean member name. Gets the model outliers member name. The model outliers member name. Gets or sets outliers. Gets or sets outliers. Gets the model data color member name. The model data color member name. Gets the model data category member name. The model data category member name. Gets a function which returns the category of the property to which the column is bound to. Gets the model data note text member name. The model data note text member name. Gets or sets the point border The ohlc chart data configuration. Aggregates function for date series. The distance between category clusters. A value of 1 means that there is a total of 1 point width between categories. The distance is distributed evenly on each side. Space between points. Value of 1 means that the distance between points is equal to their width. The ohlc chart line configuration. Initializes a new instance of the class. Gets or sets the markers size. Gets or sets the markers background. Gets or sets the markers type. Gets or sets the markers visibility. Gets or sets the markers border. Gets or sets the markers rotation angle. Defines the fluent interface for configuring the chart data labels. Initializes a new instance of the class. The data labels configuration. Sets the labels position The labels position. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Labels(labels => labels .Position(ChartPointLabelsPosition.Above) .Visible(true) ); ) .Render(); %> Defines the fluent interface for configuring the chart data labels. Initializes a new instance of the class. The line chart markers configuration. Sets the markers shape type. The markers shape type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Markers(markers => markers .Type(ChartMarkerShape.Triangle) ); ) .Render(); %> Sets the markers size. The markers size. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Markers(markers => markers .Size(10) ); ) .Render(); %> Sets the markers visibility The markers visibility. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Markers(markers => markers .Visible(true) ); ) .Render(); %> Sets the markers border The markers border width. The markers border color (CSS syntax). The markers border dash type. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Markers(markers => markers .Border(1, "Red", ChartDashType.Dot) ); ) .Render(); %> Configures the markers border The border configuration action The background color of the current series markers. The background color of the current series markers. The background color is series color. <%= Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Markers(markers => markers .Background("Red"); ); ) .Render(); %> Sets the markers rotation angle. The markers rotation angle. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Line(s => s.Sales) .Markers(markers => markers .Type(ChartMarkerShape.Triangle) .Rotation(10) ); ) .Render(); %> Defines the fluent interface for configuring the . Initializes a new instance of the class. The plot area. Sets the Plot area background color The background color. <% Html.Kendo().Chart() .Name("Chart") .PlotArea(plotArea => plotArea.Background("Red")) .Render(); %> Sets the Plot area margin The plot area top margin. The plot area right margin. The plot area bottom margin. The plot area left margin. <% Html.Kendo().Chart() .Name("Chart") .PlotArea(plotArea => plotArea.Margin(0, 5, 5, 0)) .Render(); %> Sets the Plot area margin The plot area margin. <% Html.Kendo().Chart() .Name("Chart") .PlotArea(plotArea => plotArea.Margin(5)) .Render(); %> Sets the Plot area border The border width. The border color (CSS syntax). The border dash type. <% Html.Kendo().Chart() .Name("Chart") .PlotArea(plotArea => plotArea.Border(1, "#000", ChartDashType.Dot)) .Render(); %> Configures the plot area border The border configuration action Sets the plot area opacity. The plot area opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <%= Html.Kendo().Chart(Model) .Name("Chart") .PlotArea(p => p.Background("green").Opacity(0.5)) %> Initializes a new instance of the class. Gets or sets the plot area background. The plot area background. Gets or sets the plot area opacity. A value between 0 (transparent) and 1 (opaque). Gets or sets the plot area border. The plot area border. Gets or sets the plot area margin. The plot area margin. Defines the fluent interface for configuring the chart data labels. Initializes a new instance of the class. The data labels configuration. Sets the labels position The labels position. <% Html.Kendo().Chart() .Name("Chart") .Series(series => series .Bar(s => s.Sales) .Labels(labels => labels .Position(ChartBarLabelsPosition.InsideEnd) .Visible(true) ); ) .Render(); %> Defines the fluent interface for configuring the . Initializes a new instance of the class. The chart area. Sets the chart area background color. The background color. <% Html.Kendo().Chart() .Name("Chart") .ChartArea(chartArea => chartArea.Background("Red")) .Render(); %> Sets the chart area margin. The chart area top margin. The chart area right margin. The chart area bottom margin. The chart area left margin. <% Html.Kendo().Chart() .Name("Chart") .ChartArea(chartArea => chartArea.Margin(0, 5, 5, 0)) .Render(); %> Sets the chart area margin. The chart area margin. <% Html.Kendo().Chart() .Name("Chart") .ChartArea(chartArea => chartArea.Margin(5)) .Render(); %> Sets the chart area border. The border width. The border color (CSS syntax). The border dash type. <% Html.Kendo().Chart() .Name("Chart") .ChartArea(chartArea => chartArea.Border(1, "#000", ChartDashType.Dot)) .Render(); %> Configures the plot area border The border configuration action Sets the height of the chart area. The chart area height. Sets the width of the chart area. The chart area width. Defines the fluent API for configuring the chart series defaults. Defines the default settings for bar series. Defines the default settings for column series. Defines the default settings for line series. Defines the default settings for vertical line series. Defines the default settings for area series. Defines the default settings for vertical area series. Defines the default settings for pie series. Defines the default settings for donut series. Defines the default settings for funnel series. Defines the default settings for scatter series. Defines the default settings for scatter line series. Defines the default settings for ohlc series. Defines the default settings for bullet series. Defines the default settings for vertical bullet series. Defines the default settings for radar area series. Defines the default settings for radar column series. Defines the default settings for radar line series. Defines the default settings for polar line series. Defines the default settings for polar area series. Defines the default settings for polar scatter series. Initializes a new instance of the class. Gets or sets the label position. The default value is for clustered series and for stacked series. Creates value axis for the . The type of the data item to which the chart is bound to Initializes a new instance of the class. The container. The chart axes. Defines a numeric value axis. Defines a numeric value axis. Defines a date value axis. Defines a date value axis. Defines the fluent interface for configuring numeric axis. Initializes a new instance of the class. The axis. Sets the axis minimum value. The axis minimum value. <%= Html.Kendo().Chart(Model) .Name("Chart") .ValueAxis(a => a.Numeric().Min(4)) %> Sets the axis maximum value. The axis maximum value. <%= Html.Kendo().Chart(Model) .Name("Chart") .ValueAxis(a => a.Numeric().Max(4)) %> Sets the interval between major divisions. The interval between major divisions. <%= Html.Kendo().Chart(Model) .Name("Chart") .ValueAxis(a => a.Numeric().MajorUnit(4)) %> Sets the interval between minor divisions. It defaults to MajorUnit / 5. The interval between minor divisions. <%= Html.Kendo().Chart(Model) .Name("Chart") .ValueAxis(a => a.Numeric() .MajorUnit(4) .MinorUnit(2) .MinorTicks(mt => mt.Visible(true)) ) %> Sets value at which the first perpendicular axis crosses this axis. The value at which the first perpendicular axis crosses this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .ValueAxis(axis => axis.AxisCrossingValue(4)) %> Sets value at which perpendicular axes cross this axis. The values at which perpendicular axes cross this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .XAxis(axis => axis.Numeric().AxisCrossingValue(0, 10)) .YAxis(axis => axis.Numeric().Title("Axis 1")) .YAxis(axis => axis.Numeric("secondary").Title("Axis 2")) %> Sets value at which perpendicular axes cross this axis. The values at which perpendicular axes cross this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .XAxis(axis => axis.Numeric().AxisCrossingValue(new double[] { 0, 10 })) .YAxis(axis => axis.Numeric().Title("Axis 1")) .YAxis(axis => axis.Numeric("secondary").Title("Axis 2")) %> Defines the fluent interface for configuring the . Initializes a new instance of the class. The chart title. Sets the title text The text title. <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Text("Chart")) .Render(); %> Sets the title font The title font (CSS format). <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Font("16px Arial,Helvetica,sans-serif")) .Render(); %> Sets the title color The title color (CSS format). <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Color("#ff0000").Text("Title")) .Render(); %> Sets the title background color The background color. <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Background("red")) .Render(); %> Sets the title position The title position. <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Position(ChartTitlePosition.Bottom)) .Render(); %> Sets the title alignment The title alignment. <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Align(ChartTextAlignment.Left)) .Render(); %> Sets the title visibility The title visibility. <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Visible(false)) .Render(); %> Sets the title margin The title top margin. The title right margin. The title bottom margin. The title left margin. <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Margin(20)) .Render(); %> Sets the title margin The title margin. <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Margin(20)) .Render(); %> Sets the title padding The title top padding. The title right padding. The title bottom padding. The title left padding. <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Padding(20)) .Render(); %> Sets the title padding The title padding. <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Padding(20)) .Render(); %> Sets the title border The title border width. The title border color. The title dash type. <% Html.Kendo().Chart() .Name("Chart") .Title(title => title.Border(1, "#000", ChartDashType.Dot)) .Render(); %> Configures the plot area border The border configuration action Defines the fluent interface for configuring the . Initializes a new instance of the class. The chart legend. Sets the legend labels font The legend labels font (CSS format). <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Font("16px Arial,Helvetica,sans-serif")) .Render(); %> Sets the legend labels color The labels color (CSS format). <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Color("red")) .Render(); %> Sets the legend background color The background color. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Background("red")) .Render(); %> Sets the legend position The legend position. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Position(ChartLegendPosition.Bottom)) .Render(); %> Sets the legend visibility The legend visibility. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Visible(false)) .Render(); %> Sets the legend X and Y offset from its position The legend X offset from its position. The legend Y offset from its position. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Offset(10, 50)) .Render(); %> Sets the legend margin The legend top margin. The legend right margin. The legend bottom margin. The legend top margin. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Margin(0, 5, 5, 0)) .Render(); %> Sets the legend margin The legend margin. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Margin(20)) .Render(); %> Sets the legend padding The legend top padding. The legend right padding. The legend bottom padding. The legend left padding. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Padding(0, 5, 5, 0)) .Render(); %> Sets the legend padding The legend padding. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Padding(20)) .Render(); %> Sets the legend border The legend border width. The legend border color (CSS syntax). The legend border dash type. <% Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Border(1, "#000", ChartDashType.Dot)) .Render(); %> Configures the legend border The border configuration action Configures the legend labels The labels configuration action Defines the fluent interface for configuring the . Initializes a new instance of the class. The client events. Defines the inline handler of the DataBound client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.DataBound( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the DataBound client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.DataBound("onDataBound")) %> Defines the inline handler of the SeriesClick client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.SeriesClick( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the SeriesClick client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.SeriesClick("onSeriesClick")) %> Defines the inline handler of the SeriesHover client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.SeriesHover( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the SeriesHover client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.SeriesHover("onSeriesHover")) %> Defines the inline handler of the AxisLabelClick client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.AxisLabelClick( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the AxisLabelClick client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.AxisLabelClick("onAxisLabelClick")) %> Defines the inline handler of the LegendItemClick client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.LegendItemClick( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the LegendItemClick client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.LegendItemClick("onLegendItemClick")) %> Defines the inline handler of the LegendItemHover client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.LegendItemHover( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the LegendItemHover client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.LegendItemHover("onLegendItemHover")) %> Defines the name of the JavaScript function that will handle the the DragStart client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.DragStart("onDragStart")) %> Defines the inline handler of the DragStart client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.DragStart( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Drag client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.Drag("onDrag")) %> Defines the inline handler of the Drag client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.Drag( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the DragEnd client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.DragEnd("onDragEnd")) %> Defines the inline handler of the DragEnd client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.DragEnd( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the inline handler of the PlotAreaClick client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.PlotAreaClick( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the PlotAreaClick client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.PlotAreaClick("onPlotAreaClick")) %> Defines the name of the JavaScript function that will handle the the ZoomStart client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.ZoomStart("onZoomStart")) %> Defines the inline handler of the ZoomStart client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.ZoomStart( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Zoom client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.Zoom("onZoom")) %> Defines the inline handler of the Zoom client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.Zoom( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the ZoomEnd client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.ZoomEnd("onZoomEnd")) %> Defines the inline handler of the ZoomEnd client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.ZoomEnd( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the SelectStart client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.SelectStart("onSelectStart")) %> Defines the inline handler of the SelectStart client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.SelectStart( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Select client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.Select("onSelect")) %> Defines the inline handler of the Select client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.Select( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the SelectEnd client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events.SelectEnd("onSelectEnd")) %> Defines the inline handler of the SelectEnd client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Chart() .Name("Chart") .Events(events => events.SelectEnd( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Configures the client-side events. The client events configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Events(events => events .OnLoad("onLoad") ) %> Sets the preferred rendering engine. If it is not supported by the browser, the Chart will switch to the first available mode. The preferred rendering engine. Sets the theme of the chart. The Chart theme. <%= Html.Kendo().Chart() .Name("Chart") .Theme("Telerik") %> Sets the Chart area. The Chart area. <%= Html.Kendo().Chart() .Name("Chart") .ChartArea(chartArea => chartArea.margin(20)) %> Sets the Plot area. The Plot area. <%= Html.Kendo().Chart() .Name("Chart") .PlotArea(plotArea => plotArea.margin(20)) %> Sets the title of the chart. The Chart title. <%= Html.Kendo().Chart() .Name("Chart") .Title("Yearly sales") %> Defines the title of the chart. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Title(title => title.Text("Yearly sales")) %> Sets the legend visibility. A value indicating whether to show the legend. <%= Html.Kendo().Chart() .Name("Chart") .Legend(false) %> Configures the legend. The configuration action. <%= Html.Kendo().Chart() .Name("Chart") .Legend(legend => legend.Visible(true).Position(ChartLegendPosition.Bottom)) %> Defines the chart series. The add action. <%= Html.Kendo().Chart(Model) .Name("Chart") .Series(series => { series.Bar(s => s.SalesAmount); }) %> Defines the options for all chart series of the specified type. The configurator. <%= Html.Kendo().Chart(Model) .Name("Chart") .SeriesDefaults(series => series.Bar().Stack(true)) %> Defines the chart panes. The add action. <%= Html.Kendo().Chart(Model) .Name("Chart") .Panes(panes => { panes.Add("volume"); }) %> Defines the options for all chart axes of the specified type. The configurator. <%= Html.Kendo().Chart(Model) .Name("Chart") .AxisDefaults(axisDefaults => axisDefaults.MinorTickSize(5)) %> Configures the category axis The configurator <%= Html.Kendo().Chart(Model) .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) ) %> Defines value axis options The configurator <%= Html.Kendo().Chart(Model) .Name("Chart") .ValueAxis(a => a.Numeric().TickSize(4)) %> Defines X-axis options for scatter charts The configurator <%= Html.Kendo().Chart(Model) .Name("Chart") .XAxis(a => a.Numeric().Max(4)) %> Configures Y-axis options for scatter charts. The configurator <%= Html.Kendo().Chart(Model) .Name("Chart") .YAxis(a => a.Numeric().Max(4)) %> Data Source configuration Use the configurator to set different data binding options. <%= Html.Kendo().Chart() .Name("Chart") .DataSource(ds => { ds.Ajax().Read(r => r.Action("SalesData", "Chart")); }) %> Enables or disables automatic binding. Gets or sets a value indicating if the chart should be data bound during initialization. The default value is true. <%= Html.Kendo().Chart() .Name("Chart") .DataSource(ds => { ds.Ajax().Read(r => r.Action("SalesData", "Chart")); }) .AutoBind(false) %> Sets the series colors. A list of the series colors. <%= Html.Kendo().Chart() .Name("Chart") .SeriesColors(new string[] { "#f00", "#0f0", "#00f" }) %> Sets the series colors. The series colors. <%= Html.Kendo().Chart() .Name("Chart") .SeriesColors("#f00", "#0f0", "#00f") %> Use it to configure the data point tooltip. Use the configurator to set data tooltip options. <%= Html.Kendo().Chart() .Name("Chart") .Tooltip(tooltip => { tooltip.Visible(true).Format("{0:C}"); }) %> Sets the data point tooltip visibility. A value indicating if the data point tooltip should be displayed. The tooltip is not visible by default. <%= Html.Kendo().Chart() .Name("Chart") .Tooltip(true) %> Enables or disabled animated transitions on initial load and refresh. A value indicating if transition animations should be played. <%= Html.Kendo().Chart() .Name("Chart") .Transitions(false) %> Creates series for the . The type of the data item to which the chart is bound to Initializes a new instance of the class. The container. Defines bound bar series. The expression used to extract the point value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point category from the chart model The expression used to extract the point note text from the chart model Defines bound bar series. The expression used to extract the point value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point note text from the chart model Defines bound bar series. The name of the value member. The name of the color member. The name of the category member. The name of the note text member. Defines bound bar series. The type of the value member. The name of the value member. The name of the color member. The name of the category member. The name of the note text member. Defines bar series bound to inline data. The data to bind to. Defines bound column series. The expression used to extract the point value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point category from the chart model The expression used to extract the point note text from the chart model Defines bound column series. The expression used to extract the point value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point note text from the chart model Defines bound column series. The name of the value member. The name of the color member. The name of the category member. The name of the note text member. Defines bound column series. The type of the value member. The name of the value member. The name of the color member. The name of the category member. The name of the note text member. Defines column series bound to inline data. The data to bind to Defines bound line series. The expression used to extract the value from the chart model. The expression used to extract the category from the chart model. The expression used to extract the note text from the chart model. Defines bound line series. The expression used to extract the value from the chart model. The expression used to extract the note text from the chart model. Defines bound line series. The name of the value member. The name of the category member. The name of the note text member. Defines bound line series. The type of the value member. The name of the value member. The name of the category member. The name of the note text member. Defines line series bound to inline data. The data to bind to Defines bound vertical line series. The expression used to extract the value from the chart model. The expression used to extract the category from the chart model. The expression used to extract the note text from the chart model. Defines bound vertical line series. The expression used to extract the value from the chart model. The expression used to extract the note text from the chart model. Defines bound vertical line series. The name of the value member. The name of the category member. The name of the note text member. Defines bound vertical line series. The type of the value member. The name of the value member. The name of the category member. The name of the note text member. Defines vertical line series bound to inline data. The data to bind to Defines bound area series. The expression used to extract the value from the chart model. The expression used to extract the note text from the chart model. Defines bound area series. The expression used to extract the value from the chart model. The expression used to extract the category from the chart model. The expression used to extract the note text from the chart model. Defines bound area series. The name of the value member. The name of the category member. The name of the note text member. Defines bound area series. The type of the value member. The name of the value member. The name of the category member. The name of the note text member. Defines area series bound to inline data. The data to bind to Defines bound vertical area series. The expression used to extract the value from the chart model. The expression used to extract the category from the chart model. The expression used to extract the note text from the chart model. Defines bound vertical area series. The expression used to extract the value from the chart model. The expression used to extract the note text from the chart model. Defines bound vertical area series. The name of the value member. The name of the category member. The name of the note text member. Defines bound vertical area series. The type of the value member. The name of the value member. The name of the category member. The name of the note text member. Defines vertical area series bound to inline data. The data to bind to Defines bound scatter series. The expression used to extract the X value from the chart model The expression used to extract the Y value from the chart model The expression used to extract the note text from the chart model Defines bound scatter series. The name of the X value member. The name of the Y value member. The name of the note text member. Defines bound scatter series. The type of the value members. The name of the X value member. The name of the Y value member. The name of the note text member. Defines scatter series bound to inline data. The data to bind to Defines bound scatter line series. The expression used to extract the X value from the chart model The expression used to extract the Y value from the chart model The expression used to extract the Y value from the chart model Defines bound scatter line series. The name of the X value member. The name of the Y value member. The name of the Y value member. Defines bound scatter line series. The type of the value members. The name of the X value member. The name of the Y value member. The name of the Y value member. Defines scatter line series bound to inline data. The data to bind to Defines bound bubble series. Defines bound bubble series. Defines bound bubble series. Defines bubble series bound to inline data. The data to bind to Defines bound pie series. Defines bound pie series. Defines bound pie series. Defines pie series bound to inline data. The data to bind to Defines bound funnel series. Defines bound funnel series. Defines bound funnel series. Defines funnel series bound to inline data. The data to bind to Defines bound Donut series. Defines bound donut series. Defines bound donut series. Defines donut series bound to inline data. The data to bind to Defines bound ohlc series. Defines bound ohlc series. Defines bound ohlc series. Defines bound ohlc series. Defines ohlc series bound to inline data. The data to bind to Defines bound candlestick series. Defines bound candlestick series. Defines bound candlestick series. Defines bound candlestick series. Defines candlestick series bound to inline data. The data to bind to Defines bound bullet series. The expression used to extract the point current value from the chart model The expression used to extract the point target value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point category from the chart model The expression used to extract the point note text from the chart model Defines bound bullet series. The expression used to extract the point current value from the chart model The expression used to extract the point target value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point note text from the chart model Defines bound bar series. The name of the current value member. The name of the target value member. The name of the color member. The name of the note text member. Defines bound bullet series. The type of the current value member. The name of the target value member. The name of the color member. The name of the note text member. Defines bar series bound to inline data. The data to bind to. Defines bound verticalBullet series. The expression used to extract the point current value from the chart model The expression used to extract the point target value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point note text from the chart model Defines bound verticalBullet series. The expression used to extract the point current value from the chart model The expression used to extract the point target value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point note text from the chart model Defines bound verticalBullet series. The name of the current value member. The name of the target value member. The name of the color member. The name of the color member. Defines bound verticalBullet series. The type of the current value member. The name of the target value member. The name of the color member. The name of the color member. Defines bar series bound to inline data. The data to bind to Defines bound radar area series. The expression used to extract the point value from the chart model Defines bound radar area series. The expression used to extract the point value from the chart model The expression used to extract the point category from the chart model The expression used to extract the point note text from the chart model Defines bound radar area series. The name of the value member. The name of the category member. The name of the note text member. Defines bound radar area series. The type of the value member. The name of the value member. The name of the category member. The name of the note text member. Defines radar area series bound to inline data. The data to bind to. Defines bound radar column series. The expression used to extract the point value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point category from the chart model The expression used to extract the point note text from the chart model Defines bound radar column series. The expression used to extract the point value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point note text from the chart model Defines bound radar column series. The name of the value member. The name of the color member. The name of the category member. The name of the note text member. Defines bound radar column series. The type of the value member. The name of the value member. The name of the color member. The name of the category member. The name of the note text member. Defines radar column series bound to inline data. The data to bind to. Defines bound radar line series. The expression used to extract the point value from the chart model Defines bound radar line series. The expression used to extract the point value from the chart model The expression used to extract the point category from the chart model The expression used to extract the point note text from the chart model Defines bound radar line series. The expression used to extract the point value from the chart model The expression used to extract the point note text from the chart model Defines bound radar line series. The name of the value member. The name of the category member. The name of the category member. Defines bound radar line series. The type of the value member. The name of the value member. The name of the category member. The name of the note text member. Defines radar line series bound to inline data. The data to bind to. Defines bound polar area series. The expression used to extract the X value from the chart model The expression used to extract the Y value from the chart model The expression used to extract the note text from the chart model Defines bound polar area series. The name of the X value member. The name of the Y value member. The name of the note text member. Defines bound polar area series. The type of the value members. The name of the X value member. The name of the Y value member. The name of the note text member. Defines polar area series bound to inline data. The data to bind to Defines bound polar line series. The expression used to extract the X value from the chart model The expression used to extract the Y value from the chart model The expression used to extract the note text from the chart model Defines bound polar line series. The name of the X value member. The name of the Y value member. The name of the note text member. Defines bound polar line series. The type of the value members. The name of the X value member. The name of the Y value member. Defines polar line series bound to inline data. The data to bind to Defines bound polar scatter series. The expression used to extract the X value from the chart model The expression used to extract the Y value from the chart model The expression used to extract the note text from the chart model Defines bound polar scatter series. The name of the X value member. The name of the Y value member. The name of the note text member. Defines bound polar scatter series. The type of the value members. The name of the X value member. The name of the Y value member. The name of the note text member. Defines polar scatter series bound to inline data. The data to bind to Defines bound box plot series. Defines bound box plot series. Defines bound box plot series. Defines bound box plot series. Defines box plot series bound to inline data. The data to bind to The parent Chart Configures the category axis for the . The type of the data item to which the chart is bound to Initializes a new instance of the class. The chart. Defines bound categories. The expression used to extract the categories value from the chart model Overrides the category axis type. The axis type. The default is determined by the category items type. Defines categories. The list of categories Defines categories. The list of categories Sets value at which the first perpendicular axis crosses this axis. The value at which the first perpendicular axis crosses this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .CategoryAxis(axis => axis.AxisCrossingValue(4)) .ValueAxis(axis => axis.Numeric().Title("Axis 1")) .ValueAxis(axis => axis.Numeric("secondary").Title("Axis 2")) %> Sets value at which perpendicular axes cross this axis. The values at which perpendicular axes cross this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .CategoryAxis(axis => axis.AxisCrossingValue(0, 10)) .ValueAxis(axis => axis.Numeric().Title("Axis 1")) .ValueAxis(axis => axis.Numeric("secondary").Title("Axis 2")) %> Sets value at which perpendicular axes cross this axis. The values at which perpendicular axes cross this axis. <%= Html.Kendo().Chart(Model) .Name("Chart") .CategoryAxis(axis => axis.AxisCrossingValue(new double[] { 0, 10 })) .ValueAxis(axis => axis.Numeric().Title("Axis 1")) .ValueAxis(axis => axis.Numeric("secondary").Title("Axis 2")) %> Positions categories and series points on major ticks. This removes the empty space before and after the series. This option will be ignored if either Bar, Column, OHLC or Candlestick series are plotted on the axis. A boolean value that indicates if the empty space before and after the series should be removed. The default value is false. Positions categories and series points on major ticks. This removes the empty space before and after the series. This option will be ignored if either Bar, Column, OHLC or Candlestick series are plotted on the axis. Sets the selection range The selection range start. The selection range end. *Note*: The category with the specified index is not included in the selected range unless the axis is justified. In order to select all categories specify a value larger than the last category index. <%= Html.Kendo().StockChart(Model) .Name("StockChart") .CategoryAxis(axis => axis.Select(0, 3)) %> Configures the selection The configuration action. <%= Html.Kendo().StockChart(Model) .Name("StockChart") .CategoryAxis(axis => axis.Select(select => select.Mousewheel(mw => mw.Reverse()) )) %> The parent Chart Initializes a new instance of the class. The Chart component. Creates the chart top-level div. Builds the Chart component markup. Initializes a new instance of the class. Defines the width of the line. Defines the color of the line. Defines the padding of the line. Initializes a new instance of the class. Defines the alignment of the pie labels. Defines the distance between the pie chart and labels. Defines the position of the pie labels. Gets the series type. Gets the data explode member of the series. Gets the data visibleInLegend member of the series. Gets the data color member of the series. Gets the pie chart data labels configuration Gets or sets the pie's border Gets or sets the effects overlay Gets or sets the padding of the pie chart Gets or sets the start angle of the first pie segment Gets the pie chart connectors configuration Initializes a new instance of the class. The value expression. The category expression. The color expression. The explode expression. The visibleInLegend expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. Gets the series type. Gets the model data member name. The model data member name. Gets the model data category member name. The model data category member name. Gets the model data explode member name. The model data explode member name. Gets the model data color member name. The model data color member name. Gets the model data visibleInLegend member name. The model data visibleInLegend member name. Gets the model data note text member name. The model data note text member name. Gets a function which returns the category of the property to which the column is bound to. Gets a function which returns the explode of the property to which the column is bound to. Gets a function which returns the visibleInLegend of the property to which the column is bound to. Gets a function which returns the color of the property to which the column is bound to. Gets the pie chart data labels configuration Gets or sets the pie border The pie chart data configuration. Gets or sets the effects overlay. Gets or sets the padding of the chart. Gets or sets the start angle of the first pie segment. Gets the pie chart connectors configuration Initializes a new instance of the class. The expression used to extract the point value from the chart model. Initializes a new instance of the class. The series data. Initializes a new instance of the class. Defines the possible series orientation. The series are horizontal (bar chart, line chart, etc.) The series are vertical (column chart, vertical line chart, etc.) The default settings for all bar series The default settings for all column series The default settings for all line series The default settings for all vertical line series The default settings for all area series The default settings for all vertical area series The default settings for all pie series The default settings for all donut series The default settings for all funnel series The default settings for all scatter series The default settings for all scatter line series The default settings for all ohlc series The default settings for all bullet series. The default settings for all vertical bullet series. The default settings for all radar area series. The default settings for all radar column series. The default settings for all radar line series. The default settings for all polar area series. The default settings for all polar line series. The default settings for all polar scatter series. Initializes a new instance of the class. The default settings for all bar series. The default settings for all column series. The default settings for all area series. The default settings for all vertical area series. The default settings for all line series. The default settings for all vertical line series. The default settings for all pie series. The default settings for all donut series. The default settings for all scatter series. The default settings for all scatter line series. The default settings for all ohlc series. The default settings for all bullet series. The default settings for all vertical bullet series. The default settings for all radar area series. The default settings for all radar column series. The default settings for all radar line series. The default settings for all polar area series. The default settings for all polar line series. The default settings for all polar scatter series. Initializes a new instance of the class. Gets or sets the label position. The default value is for clustered series and for stacked series. Defines the available bar series effects overlays The bars have no effect overlay The bars have glass effect overlay Gets or sets the margin of the donut series. Gets or sets the size of the donut hole. Gets or sets the size of the donut series. Initializes a new instance of the class. The value expression. The category expression. The color expression. The explode expression. The visibleInLegend expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. Gets or sets the margin of the donut series. Gets or sets the the size of the donut hole. Gets or sets the the size of the donut series. Gets the Size data member of the series. Gets the Category data member of the series. Gets the Color data member of the series. Gets the VisibleInLegend data member of the series. Gets the minimum bubble size of the series. Gets the maximum bubble size of the series. Gets the negative value bubbles options. Gets or sets the bubble border. Initializes a new instance of the class. The X expression. The Y expression. The Size expression. The Category expression. The Color expression. The VisibleInLegend expression. The note text expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. Gets the Size data member of the series. Gets the Category data member of the series. Gets the Color data member of the series. Gets the VisibleInLegend data member of the series. Gets the minimum bubble size of the series. Gets the maximum bubble size of the series. Gets the negative value bubbles options. Gets or sets the bubble border. Initializes a new instance of the class. Gets or sets the negative value bubbles color. Gets or sets the markers visibility. Aggregates function for date series. The distance between category clusters. The data used for binding. The ohlc chart line configuration. The type of the chart. Space between points. Gets or sets the point border. Gets the model color member name. The model color member name. Gets the model data category member name. The model data category member name. Gets the model note text member name. The model note text member name. Gets the model open member name. The model open member name. Gets the model high member name. The model high member name. Gets the model low member name. The model low member name. Gets the model close member name. The model close member name. Initializes a new instance of the class. The open expression. The high expression. The low expression. The close expression. The expression used to extract the point category from the chart model. The color expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. Gets the series type. Gets the model data open member name. The model data open member name. Gets the model data high member name. The model data high member name. Gets the model data low member name. The model data low member name. Gets the model data close member name. The model data close member name. Gets the model data color member name. The model data color member name. Gets the model data category member name. The model data category member name. Gets a function which returns the category of the property to which the column is bound to. Gets the model data note text member name. The model data note text member name. Gets or sets the point border The ohlc chart data configuration. Aggregates function for date series. The distance between category clusters. A value of 1 means that there is a total of 1 point width between categories. The distance is distributed evenly on each side. Space between points. Value of 1 means that the distance between points is equal to their width. The ohlc chart line configuration. Initializes a new instance of the class. The open aggregate. The high aggregate. The low aggregate. The close aggregate. Initializes a new instance of the class. Gets or sets the open aggregate. Gets or sets the high aggregate. Gets or sets the low aggregate. Gets or sets the close aggregate. Gets the model down color member name. The model down color member name. Gets or sets the effects overlay. Initializes a new instance of the class. The open expression. The high expression. The low expression. The close expression. The color expression. The down color expression. The expression used to extract the point category from the chart model. The expression used to extract the point category from the chart model. The down color expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. Gets the model data down color member name. The model data down color member name. Gets or sets the effects overlay Initializes a new instance of the class. Gets or sets the highlight opacity Gets or sets the highlight opacity Gets or sets the highlight border. Gets or sets the highlight line configuration Gets or sets a value indicating if the highlight is visible The data used for binding. The distance between category clusters. Space between bullets. The orientation of the bullets. Gets or sets the bullet's border Gets or sets the bullet's target Gets or sets the effects overlay Gets the model color member name. The model color member name. Gets the model data category member name. The model data category member name. Gets the model note text member name. The model note text member name. Gets the model current member name. The model current member name. Gets the model target member name. The model target member name. Initializes a new instance of the class. The expression used to extract the point target from the chart model. The expression used to extract the point current from the chart model. The expression used to extract the point color from the chart model. The expression used to extract the point category from the chart model. The expression used to extract the point note text from the chart model. Initializes a new instance of the class. The data to bind to. Initializes a new instance of the class. Gets or sets the series opacity. A value between 0 (transparent) and 1 (opaque). Gets or sets the series base color. Gets or sets a value indicating if the series is visible Gets or sets the series color function Gets or sets the data point tooltip options. Gets or sets the data point target. Gets or sets the axis name to use for this series. The axis name. Gets or sets the title of the series. The title. The distance between category clusters. A value of 1 means that there is a total of 1 column width / bar height between categories. The distance is distributed evenly on each side. Space between bars. Value of 1 means that the distance between bars is equal to their width. The orientation of the bullets. Can be either horizontal or vertical. The default value is horizontal. Gets or sets the bullet border. Gets or sets the effects overlay. Gets the model color member name. The model color member name. Gets the model note text member name. The model note text member name. Gets the model target member name. The model target member name. Gets the model current member name. The model current member name. The data used for binding. Name template for auto-generated series when binding to grouped data. Gets or sets the series highlight options Gets the model data category member name. The model data category member name. Gets a function which returns the category of the property to which the column is bound to. Gets or sets the series notes options Initializes a new instance of the class. Gets or sets the target width. Gets or sets the markers color. Gets or sets the markers border. Initializes a new instance of the class. Gets or sets the label position. Gets or sets the label text. Initializes a new instance of the class. The lower aggregate. The q1 aggregate. The median aggregate. The q3 aggregate. The upper aggregate. The mean aggregate. The outliers aggregate. Initializes a new instance of the class. Gets or sets the lower aggregate. Gets or sets the q1 aggregate. Gets or sets the median aggregate. Gets or sets the q3 aggregate. Gets or sets the upper aggregate. Gets or sets the mean aggregate. Gets or sets the outliers aggregate. Initializes a new instance of the class. Defines the alignment of the funnel labels. Defines the position of the funnel labels. Gets the series type. Gets the data visibleInLegend member of the series. Gets or sets the ratio top-base/bottom-base of the funnel chart. Gets or sets dynamicSlope option of the funnel chart. Gets or sets the dynamicHeight of the funnel chart. Gets or sets the space between the segments of the funnel chart. Gets the data color member of the series. Gets or sets the funnel chart data labels configuration Gets or sets the funnel segments border Initializes a new instance of the class. The value expression. The category expression. The color expression. The explode expression. The visibleInLegend expression. Initializes a new instance of the class. The data. Initializes a new instance of the class. Gets the series type. Gets the model data member name. The model data member name. Gets the model data category member name. The model data category member name. Gets the model data color member name. The model data color member name. Gets the model data visibleInLegend member name. The model data visibleInLegend member name. Gets the model data note text member name. The model data note text member name. Gets a function which returns the category of the property to which the column is bound to. Gets a function which returns the visibleInLegend of the property to which the column is bound to. Gets a function which returns the color of the property to which the column is bound to. Gets the funnel chart data labels configuration Gets or sets the funnel border The funnel chart data configuration. Get or set the funnel chart NeckRatio option Get or set the funnel chart DynamicSlope option Get or set the funnel chart DynamicHeight option Get or set the funnel chart SegmentSpacing option Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Configures the client-side events. The client events action. <%= Html.Kendo().ColorPalette() .Name("ColorPalette") .Events(events => events.Select("select").Change("change") ) %> Sets the value of the picker input The initially selected color <%= Html.Kendo().ColorPalette() .Name("ColorPalette") .Value("#ff0000") %> Sets the amount of columns that should be shown The initially selected color <%= Html.Kendo().ColorPalette() .Name("ColorPalette") .Columns(5) %> Sets the size of the palette tiles The tile size (for square tiles) <%= Html.Kendo().ColorPalette() .Name("ColorPalette") .TileSize(32) %> Sets the size of the palette tiles The tile size (for square tiles) <%= Html.Kendo().ColorPalette() .Name("ColorPalette") .TileSize(s => s.Width(20).Height(10)) %> Sets the range of colors that the user can pick from. A list of colors. <%= Html.Kendo().ColorPalette() .Name("ColorPalette") .Palette(new List<string> { "#ff0000", "#00ff00", "#0000ff" }) %> Sets the range of colors that the user can pick from. One of the preset palettes of colors <%= Html.Kendo().ColorPalette() .Name("ColorPalette") .Palette(ColorPickerPalette.WebSafe) %> Defines the fluent interface for configuring ColorPicker client events. Initializes a new instance of the class. The events bag. Defines the inline handler of the Change client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Change( @<text> function(e) { // event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Change("change")) ) Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Set the width of the tiles The tile width. Set the height of the tiles The tile height. Defines the palettes that can be used in the color picker Do not use a palette (allow selection of arbitrary colors) Use a palette of basic colors Use a palette of web-safe colors Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Configures the client-side events. The client events action. <%= Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Select("select").Change("change") ) %> Sets the value of the picker input Indicates whether the picker will allow transparent colors to be picked. Whether the user is allowed to change the color opacity. <%= Html.Kendo().ColorPicker() .Name("ColorPicker") .Opacity(true) %> Sets the range of colors that the user can pick from. A list of colors. <%= Html.Kendo().ColorPicker() .Name("ColorPicker") .Palette(new List<string> { "#ff0000", "#00ff00", "#0000ff" }) %> Sets the range of colors that the user can pick from. One of the preset palettes of colors <%= Html.Kendo().ColorPicker() .Name("ColorPicker") .Palette(ColorPickerPalette.WebSafe) %> Enables or disables the picker. Whether the picker is enabled <%= Html.Kendo().ColorPicker() .Name("ColorPicker") .Enable(false) %> Shows or hides the accept/cancel buttons. Whether the buttons should be shown <%= Html.Kendo().ColorPicker() .Name("ColorPicker") .Buttons(false) %> Shows a tool icon. The CSS class that will be used for styling <%= Html.Kendo().ColorPicker() .Name("ColorPicker") .ToolIcon("k-foreColor") %> Sets the size of the palette tiles The tile size (for square tiles) <%= Html.Kendo().ColorPalette() .Name("ColorPalette") .TileSize(32) %> Sets the size of the palette tiles The tile size (for square tiles) <%= Html.Kendo().ColorPalette() .Name("ColorPalette") .TileSize(s => s.Width(20).Height(10)) %> Defines the fluent interface for configuring ColorPicker client events. Initializes a new instance of the class. The events bag. Defines the inline handler of the Change client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Change( @<text> function(e) { // event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Change("change")) ) Defines the inline handler of the Select client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Select( @<text> function(e) { // event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Select client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Select("change")) ) Defines the inline handler of the Open client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Open( @<text> function(e) { // event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Open client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Open("open")) ) Defines the inline handler of the Close client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Close( @<text> function(e) { // event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Close client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().ColorPicker() .Name("ColorPicker") .Events(events => events.Close("close")) ) Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Controls whether to bind the widget to the DataSource on initialization. <%= Html.Kendo().ComboBox() .Name("ComboBox") .AutoBind(false) %> Sets the field of the data item that provides the value content of the list items. <%= Html.Kendo().DropDownList() .Name("DropDownList") .DataTextField("Text") .DataValueField("Value") %> Configures the client-side events. The client events action. <%= Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Change("change") ) %> Use it to enable filtering of items. <%= Html.Kendo().ComboBox() .Name("ComboBox") .Filter("startswith"); %> Use it to enable filtering of items. <%= Html.Kendo().ComboBox() .Name("ComboBox") .Filter(FilterType.Contains); %> Defines the items in the ComboBox The add action. <%= Html.Telerik().ComboBox() .Name("ComboBox") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Use it to enable highlighting of first matched item. <%= Html.Kendo().ComboBox() .Name("ComboBox") .HighlightFirst(true) %> Specifies the minimum number of characters that should be typed before the widget queries the dataSource. <%= Html.Kendo().ComboBox() .Name("ComboBox") .MinLength(3) %> Use it to set selected item index Item index. <%= Html.Kendo().ComboBox() .Name("ComboBox") .SelectedIndex(0); %> Controls whether the ComboBox should automatically auto-type the rest of text. <%= Html.Kendo().ComboBox() .Name("ComboBox") .Suggest(true) %> A string that appears in the textbox when it has no value. <%= Html.Kendo().ComboBox() .Name("ComboBox") .Placeholder("Select country...") %> Use it to set the Id of the parent ComboBox. <%= Html.Telerik().ComboBox() .Name("ComboBox2") .CascadeFrom("ComboBox1") %> Use it to set the field used to filter the data source. <%= Html.Telerik().ComboBox() .Name("ComboBox2") .CascadeFrom("ComboBox1") .CascadeFromField("ParentID") %> Define the text of the widget, when the autoBind is set to false. <%= Html.Telerik().ComboBox() .Name("ComboBox") .Text("Chai") .AutoBind(false) %> Represents a client-side event handler of a Kendo UI widget A Razor template delegate. The name of the JavaScript function which will be called as a handler. The fluent API for subscribing to Kendo UI ComboBox events. Initializes a new instance of the class. The client events. Defines the inline handler of the Select client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Select( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Select client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Select("select")) ) Defines the inline handler of the Change client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Change("change")) ) Defines the inline handler of the DataBound client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.DataBound( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the DataBound client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.DataBound("dataBound")) %> Defines the name of the JavaScript function that will handle the the Open client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Open("open")) ) Defines the inline handler of the Open client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Open( @<text> function(e) { //event handling code } </text> )) ) Defines the inline handler of the Close client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Close( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Close client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Close("close")) ) Defines the inline handler of the Cascade client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Cascade( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Cascade client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().ComboBox() .Name("ComboBox") .Events(events => events.Cascade("cascade")) ) Defines the fluent interface for configuring the AJAX create/update/destroy operation bindings. Defines the fluent interface for configuring the options. Configures the client-side events Configures the URL for Read operation. Sets controller and action for Read operation. Action name Controller Name Route values Sets controller, action and routeValues for Read operation. Action name Controller Name Sets the total number of records in the data source. Required during Custom binding. Number of records Sets the number of records displayed on a single page. Sets the operation mode of the DataSource. By default the DataSource will make a request to the server when data for paging, sorting, filtering or grouping is needed. If set to false all data will be requested through single request. Any other paging, sorting, filtering or grouping will be performed client-side. True(default) if server operation mode is enabled, otherwise false. Configures the initial sorting. Configures the initial grouping. Configures the initial aggregates. Configures the initial filter. Configures Model properties Configures the URL for Update operation. Sets controller and action for Update operation. Action name Controller Name Sets controller, action and routeValues for Update operation. Action name Controller Name Route values Configures the URL for Create operation. Sets controller and action for Create operation. Action name Controller Name Sets controller, action and routeValues for Create operation. Action name Controller Name Route values Configures the URL for Destroy operation. Sets controller and action for Destroy operation. Action name Controller Name Sets controller, action and routeValues for Destroy operation. Action name Controller Name Route values Determines if modifications will be sent to the server in batches or as individually requests. If true changes will be batched, otherwise false. Determines if data source would automatically sync any changes to its data items. By default changes are not automatically sync-ed. If true changes will be automatically synced, otherwise false. Defines the fluent API for configuring a readon-only AJAX data source. Defines the fluent interface for configuring the Model definition. Type of the model Defines the fluent interface for configuring the Model definition. Type of the model Specify the member used to identify an unique Model instance. Type of the field Member access expression which describes the member Specify the member used to identify an unique Model instance. The member name. Describes a Model field Field type Member access expression which describes the field Describes a Model field Field name Field type Describes a Model field Field type Member name Specify the member used for recurrenceId. Type of the field Member access expression which describes the member Specify the member used for recurrenceId. The member name. Defines the fluent interface for configuring the options for server binding. Sets the route values for the operation. Route values Sets the action, contoller and route values for the operation. Action name Controller name Route values Sets the action, contoller and route values for the operation. Action name Controller name Route values Sets the action and contoller values for the operation. Action name Controller name Sets the route name and values for the operation. Route name Route values Sets the route name and values for the operation. Route name Route values Sets the route name for the operation. Configures the URL for Read operation. Sets controller and action for Read operation. Action name Controller Name Route values Sets controller, action and routeValues for Read operation. Action name Controller Name Sets the total number of records in the data source. Required during Custom binding. Number of records Configures the URL for Update operation. Sets controller and action for Update operation. Action name Controller Name Route values Sets controller, action and routeValues for Update operation. Action name Controller Name Configures the URL for Create operation. Sets controller and action for Create operation. Action name Controller Name Route values Sets controller, action and routeValues for Create operation. Action name Controller Name Configures the URL for Destroy operation. Sets controller and action for Destroy operation. Action name Controller Name Route values Sets controller, action and routeValues for Destroy operation. Action name Controller Name Sets the number of records displayed on a single page. Configures the initial sorting. Configures the initial grouping. Configures the initial aggregates. Configures the initial filter. Configures Model properties Defines the fluent interface for configuring the component client-side events. Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. Defines the inline handler of the Change client-side event. The handler code wrapped in a text tag (Razor syntax). Defines the name of the JavaScript function that will handle the Sync client-side event. The name of the JavaScript function that will handle the event. Defines the inline handler of the Sync client-side event. The handler code wrapped in a text tag (Razor syntax). Defines the name of the JavaScript function that will handle the RequestStart client-side event. The name of the JavaScript function that will handle the event. Defines the inline handler of the RequestStart client-side event. The handler code wrapped in a text tag (Razor syntax). Defines the name of the JavaScript function that will handle the RequestEnd client-side event. The name of the JavaScript function that will handle the event. Defines the inline handler of the RequestEnd client-side event. The handler code wrapped in a text tag (Razor syntax). Defines the name of the JavaScript function that will handle the Error client-side event. The name of the JavaScript function that will handle the event. Defines the inline handler of the Error client-side event. The handler code wrapped in a text tag (Razor syntax). Defines the fluent interface for configuring the . Sets the value which will be used to populate the field when new non-existing model is created. The value Sets the value which will be used to populate the field when new non-existing model is created. The value Specifies if the field should be editable. Specifies if the field should be editable. True is the field should be editable, otherwise false Defines the fluent interface for configuring the . Specifies member on which aggregates to be calculated. Specifies member on which aggregates to be calculated. Defines the fluent interface for configuring the options. Sets the route values for the operation. Route values Sets the action, contoller and route values for the operation. Action name Controller name Route values Sets the action, contoller and route values for the operation. Action name Controller name Route values Sets the action and contoller values for the operation. Action name Controller name Sets the route name and values for the operation. Route name Route values Sets the route name and values for the operation. Route name Route values Sets the route name for the operation. Sets JavaScript function which to return additional parameters which to be sent the server. Sets JavaScript function which to return additional parameters which to be sent the server. JavaScript function name Specifies an absolute or relative URL for the operation. Absolute or relative URL for the operation Specifies the HTTP verb of the request. The HTTP verb Defines the fluent interface for configuring the when in read-only mode. Configures the URL for Read operation. Sets controller and action for Read operation. Action name Controller Name Route values Sets controller, action and routeValues for Read operation. Action name Controller Name Specifies if filtering should be handled by the server. Specifies if filtering should be handled by the server. Configures the client-side events Defines the fluent interface for configuring the component. Use it to configure Ajax binding. Use it to configure Server binding. Represents available types of calendar views. Shows the days of the current month Shows the months of the current year Shows the years of the current decade Shows the decades of the current century Defines the fluent interface for configuring datepicker client events. Defines the inline handler of the Change client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().DatePicker() .Name("DatePicker") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().DatePicker() .Name("DatePicker") .Events(events => events.Change("change")) ) Defines the inline handler of the Open client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().DatePicker() .Name("DatePicker") .Events(events => events.Open( @<text> %> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the Open client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().DatePicker() .Name("DatePicker") .Events(events => events.Open("open")) ) Defines the inline handler of the Close client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().DatePicker() .Name("DatePicker") .Events(events => events.Close( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the Close client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().DatePicker() .Name("DatePicker") .Events(events => events.Close("close")) ) The fluent API for subscribing to Kendo UI DropDownList events. Initializes a new instance of the class. The client events. Defines the inline handler of the Select client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Select( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Select client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Select("select")) ) Defines the inline handler of the Change client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Change("change")) ) Defines the inline handler of the DataBound client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.DataBound( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the DataBound client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.DataBound("dataBound")) %> Defines the name of the JavaScript function that will handle the the Open client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Open("open")) ) Defines the inline handler of the Open client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Open( @<text> function(e) { //event handling code } </text> )) ) Defines the inline handler of the Close client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Close( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Close client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Close("close")) ) Defines the inline handler of the Cascade client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Cascade( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Cascade client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Cascade("cascade")) ) Sets the route values for the operation. Route values Sets the action, contoller and route values for the operation. Action name Controller name Route values Sets the action, contoller and route values for the operation. Action name Controller name Route values Sets the action and contoller values for the operation. Action name Controller name Sets the route name and values for the operation. Route name Route values Sets the route name and values for the operation. Route name Route values Sets the route name for the operation. Specifies an absolute or relative URL for the operation. Absolute or relative URL for the operation Defines the fluent interface for configuring the Editor stylesheets. Determines if content of a given path can be browsed. The path which will be browsed. true if browsing is allowed, otherwise false. Serves an image's thumbnail by given path. The path to the image. Thumbnail of an image. Throws 403 Forbidden if the is outside of the valid paths. Throws 404 File Not Found if the refers to a non existant image. Deletes a entry. The path to the entry. The entry. An empty . Forbidden Determines if a file can be deleted. The path to the file. true if file can be deleted, otherwise false. Determines if a folder can be deleted. The path to the folder. true if folder can be deleted, otherwise false. Determines if a folder can be created. The path to the parent folder in which the folder should be created. Name of the folder. true if folder can be created, otherwise false. Creates a folder with a given entry. The path to the parent folder in which the folder should be created. The entry. An empty . Forbidden Determines if a file can be uploaded to a given path. The path to which the file should be uploaded. The file which should be uploaded. true if the upload is allowed, otherwise false. Uploads a file to a given path. The path to which the file should be uploaded. The file which should be uploaded. A containing the uploaded file's size and name. Forbidden Gets the base path from which content will be served. Gets the valid file extensions by which served files will be filtered. Defines the fluent API for configuring the object. Defines the fluent API for configuring the object. Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Configures the client-side events. The client events action. <%= Html.Kendo().FlatColorPicker() .Name("FlatColorPicker") .Events(events => events.Select("select").Change("change") ) %> Sets the value of the picker input The initially selected color <%= Html.Kendo().FlatColorPicker() .Name("FlatColorPicker") .Value("#ff0000") %> Indicates whether the picker will allow transparent colors to be picked. Whether the user is allowed to change the color opacity. <%= Html.Kendo().FlatColorPicker() .Name("FlatColorPicker") .Opacity(true) %> Indicates whether the picker will show an input for entering colors. Whether the input field should be shown. <%= Html.Kendo().FlatColorPicker() .Name("FlatColorPicker") .Input(false) %> Indicates whether the picker will show a preview of the selected color. Whether the preview area should be shown. <%= Html.Kendo().FlatColorPicker() .Name("FlatColorPicker") .Preview(false) %> Indicates whether the picker will show apply / cancel buttons. Whether the buttons should be shown. <%= Html.Kendo().FlatColorPicker() .Name("FlatColorPicker") .Buttons(false) %> Defines the position of the radial gauge labels. The labels are positioned inside. The labels are positioned outside. Defines the fluent interface for configuring . Initializes a new instance of the class. The chart line. Sets the line visibility The line visibility. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale.Line(line => line.Color("#f00"))) .Render(); %> Defines the fluent interface for configuring the linear gauge labels. Defines the fluent interface for configuring the gauge labels. Initializes a new instance of the class. The labels configuration. Sets the labels font The labels font (CSS format). <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Font("14px Arial,Helvetica,sans-serif") ) ) %> Sets the labels visibility The labels visibility. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Visible(false) ) ) %> Sets the labels background color The labels background color. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Background("Red") ) ) %> Sets the labels text color The labels text color. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Color("Red") ) ) %> Sets the labels margin The labels top margin. The labels right margin. The labels bottom margin. The labels left margin. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Margin(0, 5, 5, 0) ) ) %>els Sets the labels margin The labels margin. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Margin(20) ) ) %> Sets the labels padding The labels top padding. The labels right padding. The labels bottom padding. The labels left padding. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Padding(0, 5, 5, 0) ) ) %> Sets the labels padding The labels padding. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Padding(20) ) ) %> Sets the labels border The labels border width. The labels border color (CSS syntax). The labels border dash type. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Border(1, "Red", ChartDashType.Dot) ) ) %> Configures the label border The border configuration action Sets the labels format. The labels format. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Format("{0:C}") ) ) %> Sets the labels template. The labels template. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Template("#= value #") ) ) %> Sets the labels opacity. The series opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Opacity(0.5) ) ) %> Initializes a new instance of the class. The labels configuration. Defines the fluent interface for configuring the radial gauge labels. Initializes a new instance of the class. The labels configuration. Sets the labels position The labels position. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Position(GaugeRadialScaleLabelsPosition.Inside) ) ) %> Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Sets the theme of the linear gauge. The linear gauge theme. <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Theme("Black") %> Sets the preferred rendering engine. If it is not supported by the browser, the Chart will switch to the first available mode. The preferred rendering engine. Sets the linear gauge area. The linear gauge area. <%= Html.Kendo().RadialGauge() .Name("radialGauge") .ChartArea(chartArea => chartArea.margin(20)) %> Configures the scale The configurator <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Scale(scale => scale .Min(10) ) %> Configures the pointer The configurator <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Pointer(pointer => pointer .Value(10) ) %> Enables or disabled animated transitions on initial load and refresh. A value indicating if transition animations should be played. <%= Html.Kendo().RadialGauge() .Name("radialScale") .Transitions(false) %> Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Sets the theme of the radial gauge. The radial gauge theme. <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Theme("Black") %> Sets the preferred rendering engine. If it is not supported by the browser, the Chart will switch to the first available mode. The preferred rendering engine. Sets the radial gauge area. The radial gauge area. <%= Html.Kendo().RadialGauge() .Name("radialGauge") .ChartArea(chartArea => chartArea.margin(20)) %> Configures the scale The configurator <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Scale(scale => scale .Min(10) ) %> Configures the pointer The configurator <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Pointer(pointer => pointer .Value(10) ) %> Enables or disabled animated transitions on initial load and refresh. A value indicating if transition animations should be played. <%= Html.Kendo().RadialGauge() .Name("radialScale") .Transitions(false) %> Defines the fluent interface for configuring the gauge scale. Defines the fluent interface for configuring scale. The type of the series builder. Initializes a new instance of the class. The scale. Configures the minor ticks. The configuration action. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .MinorTicks(ticks => ticks .Visible(false) ) ) %> Configures the major ticks. The configuration action. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .MajorTicks(ticks => ticks .Visible(false) ) ) %> Defines the ranges items. The add action. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Ranges.Add() .From(1) .To(2) ) %> Sets the scale major unit. The major unit. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => sclae.MajorUnit(5)) %> Sets the scale minor unit. The minor unit. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => sclae.MinorUnit(5)) %> Sets the scale min value. The min. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => sclae.Min(-20)) %> Sets the scale max value. The max. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => sclae.Max(20)) %> Sets the scale reverse. The scale reverse. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => sclae.reverse(true)) %> Configures the major ticks. The configuration action. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Line(line => line .Visible(false) ) ) %> Gets or sets the scale. The scale. Initializes a new instance of the class. The gauge component. Sets the mirror of the gauge The mirror. <%= Html.Kendo().LinearGauge() .Name("LinearGauge") .Scale(scale => scale .Mirror(true) ) %> Sets the orientation of the gauge The vertical. <%= Html.Kendo().LinearGauge() .Name("LinearGauge") .Scale(scale => scale .Vertical(false) ) %> Configures the labels. The configuration action. <%= Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Labels(labels => labels .Visible(false) ) ) %> The parent Guage Defines the fluent interface for configuring the gauge scale. Sets the end angle of the gauge The end angle. <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Scale(scale => scale .EndAngle(10) ) %> Sets the start angle of the gauge The start Angle. <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Scale(scale => scale .StartAngle(220) ) %> Configures the labels. The configuration action. <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Scale(scale => scale .Labels(labels => labels .Visible(false) ) ) %> Sets the width of the range indicators. The width of the range indicators. <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Scale(scale => scale .RangeSize(4) ) %> Sets the distance from the range indicators to the ticks. The distance from the range indicators to the ticks. <%= Html.Kendo().RadialGauge() .Name("radialGauge") .Scale(scale => scale .RangeDistance(4) ) %> The parent Guage Initializes a new instance of the class. Initializes a new instance of the class. The radila scale lables position. Initializes a new instance of the class. The scale ranges. The scale major unit. The scale major unit. The scale major ticks configuration. The scale minor ticks configuration. The scale min value. The scale max value. The scale reverse. The line. The scale end angle.s The scale start angle. The width of the range indicators The distance from the range indicators to the ticks The scale labels. Initializes a new instance of the class. The scale major ticks configuration. The scale minor ticks configuration. The scale ranges. The scale major unit. The scale minor unit. The scale min value. The scale max value. The scale reverse. The line reverse. The scale mirror. The scale vertical. The scale labels. Initializes a new instance of the class. The linear gauge. Gets or sets the linear gauge. The linear gauge. The scale mirror. The scale orientation. The scale labels. Initializes a new instance of the class. The radial gauge. Gets or sets the radial gauge. The radial gauge. The scale end angle. The scale start angle. The width of the range indicators The distance from the range indicators to the ticks The scale labels. Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Use to enable or disable animation of the popup element. The boolean value. <%= Html.Kendo().DatePicker() .Name("DatePicker") .Animation(false) //toggle effect %> Configures the animation effects of the widget. The action which configures the animation effects. <%= Html.Kendo().DatePicker() .Name("DatePicker") .Animation(animation => { animation.Open(open => { open.SlideIn(SlideDirection.Down); }) }) %> Specifies the culture info used by the widget. <%= Html.Kendo().DatePicker() .Name("DatePicker") .Culture("de-DE") %> Configures the client-side events. The client events action. <%= Html.Kendo().DatePicker() .Name("DatePicker") .Events(events => events.Open("open").Change("change") ) %> Sets the date format, which will be used to parse and format the machine date. Specifies the formats, which are used to parse the value set with value() method or by direct input. Enables or disables the picker. Sets the minimal date, which can be selected in picker. Sets the maximal date, which can be selected in picker. Sets the value of the picker input Sets the value of the picker input Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Specifies a template used to populate aria-label attribute. The string template. <%= Html.Kendo().DateTimePicker() .Name("DateTimePicker") .ARIATemplate("Date: #=kendo.toString(data.current, 'd')#") %> Sets the interval between hours. Enables/disables footer of the calendar popup. <%= Html.Kendo().DateTimePicker() .Name("DateTimePicker") .Footer(false) %> Footer template to be used for rendering the footer of the Calendar. <%= Html.Kendo().DateTimePicker() .Name("DateTimePicker") .Footer("#= kendo.toString(data, "G") #") %> FooterId to be used for rendering the footer of the Calendar. <%= Html.Kendo().DateTimePicker() .Name("DateTimePicker") .FooterId("widgetFooterId") %> Specifies the navigation depth. <%= Html.Kendo().DateTimePicker() .Name("DateTimePicker") .Depth(CalendarView.Month) %> Specifies the start view. <%= Html.Kendo().DateTimePicker() .Name("DateTimePicker") .Start(CalendarView.Month) %> MonthTemplateId to be used for rendering the cells of the Calendar. <%= Html.Kendo().DateTimePicker() .Name("DateTimePicker") .MonthTemplateId("widgetMonthTemplateId") %> Templates for the cells rendered in the "month" view. <%= Html.Kendo().DateTimePicker() .Name("DateTimePicker") .MonthTemplate("#= data.value #") %> Configures the content of cells of the Calendar. <%= Html.Kendo().DateTimePicker() .Name("DateTimePicker") .MonthTemplate(month => month.Content("#= data.value #")) %> Sets the minimal date, which can be selected in DatePicker. Sets the maximal date, which can be selected in DatePicker. Specifies the format, which is used to format the values in the time drop-down list. Defines the fluent interface for configuring the component. Sets the field of the data item that provides the value content of the list items. <%= Html.Kendo().DropDownList() .Name("DropDownList") .DataTextField("Text") .DataValueField("Value") %> Configures the client-side events. The client events action. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Events(events => events.Change("change") ) %> Defines the items in the DropDownList The add action. <%= Html.Telerik().DropDownList() .Name("DropDownList") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Define the text of the default empty item. If the value is an object, then the widget will use it directly. <%= Html.Kendo().DropDownList() .Name("DropDownList") .OptionLabel("Select country...") %> Use it to set selected item index Item index. <%= Html.Kendo().DropDownList() .Name("DropDownList") .SelectedIndex(0); %> Use it to set the Id of the parent DropDownList. <%= Html.Telerik().DropDownList() .Name("DropDownList2") .CascadeFrom("DropDownList1") %> Use it to set the field used to filter the data source. <%= Html.Telerik().DropDownList() .Name("DropDownList2") .CascadeFrom("DropDownList1") .CascadeFromField("ParentID") %> Define the text of the widget, when the autoBind is set to false. <%= Html.Telerik().DropDownList() .Name("DropDownList") .Text("Chai") .AutoBind(false) %> Defines the fluent interface for configuring child DropDonwList items. Initializes a new instance of the class. The item. Sets the value for the item. The value. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Items(items => items.Add().Text("First item.")) %> Sets the value for the item. The value. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Items(items => items.Add().Value("1")) %> Define when the item will be expanded on intial render. If true the item will be selected. <%= Html.Kendo().DropDownList() .Name("DropDownList") .Items(items => { items.Add().Text("First Item").Selected(true); }) %> Creates items for the . Initializes a new instance of the class. The settings. Defines a item. Sets the range of colors that the user can pick from. A list of colors. <%= Html.Kendo().ColorPicker() .Name("ColorPicker") .Palette(new List<string> { "#ff0000", "#00ff00", "#0000ff" }) %> Sets the range of colors that the user can pick from. One of the preset palettes of colors <%= Html.Kendo().ColorPicker() .Name("ColorPicker") .Palette(ColorPickerPalette.WebSafe) %> Defines the fluent interface for configuring the Editor events. Sets the HTML content that will show initially in the editor. The action which renders the HTML content. <% Html.Kendo().Editor() .Name("Editor") .Value(() => { %> <blockquote> According to Deep Thought, the answer to the ultimate question of life, the universe and everything is <strong>42</strong>. </blockquote> <% }) .Render(); %> Sets the HTML content that will show initially in the editor. The predicate which renders the HTML content. <% Html.Kendo().Editor() .Name("Editor") .Value(@<blockquote> According to Deep Thought, the answer to the ultimate question of life, the universe and everything is <strong>42</strong>. </blockquote>) .Render(); %> Sets the HTML content which the item should display as a string. An HTML string. <%= Html.Kendo().Editor() .Name("Editor") .Value("<blockquote>A towel has <strong>immense</strong> psychological value</blockquote>") %> Configure the client events. An action that configures the events. <%= Html.Kendo().Editor() .Name("Editor") .Events(events => events .Change("onChange") ) %> Configure the available tools in the toolbar. An action that configures the tools. <%= Html.Kendo().Editor() .Name("Editor") .Tools(tools => tools .Clear() .Bold() .Italic() .Underline() ) %> Allow rendering of contentEditable elements instead of the default textarea editor. Note: contentEditable elements are not posted to the server. The tag that will be rendered as contentEditable <%= Html.Kendo().Editor() .Name("Editor") .Tag("div") %> Encode HTML content. <%= Html.Kendo().Editor() .Name("Editor") .Value("<blockquote>A towel has <strong>immense</strong> psychological value</blockquote>") .Encode(true) %> Sets the CSS files that will be registered in the Editor's iframe <%= Html.Kendo().Editor() .Name("Editor") .StyleSheets(styleSheets => styleSheets.Add("editorStyles.css")) %> Configure the image browser dialog. An action that configures the dialog. <%= Html.Kendo().Editor() .Name("Editor") .ImageBrowser(imageBrowser => imageBrowser .Image("~/Content/UserFiles/Images/{0}") .Read("Read", "ImageBrowser") .Create("Create", "ImageBrowser") .Destroy("Destroy", "ImageBrowser") .Upload("Upload", "ImageBrowser") .Thumbnail("Thumbnail", "ImageBrowser")) ) %> Defines the shape of the liner gauge pointer. Specifies a filling bar indicator. Specifies a arrow shape. Creates scale ranges for the . Initializes a new instance of the class. The scale. Defines a item. Defines a item. The gauge scale Defines the fluent interface for configuring ranges. Initializes a new instance of the class. The scale ranges. Sets the ranges start position. The ranges start position. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Ranges(ranges => ranges .Add().From(1).Color("Red"); ) ) .Render(); %> Sets the ranges end position. The ranges end position. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Ranges(ranges => ranges .Add().To(2).Color("Red"); ) ) .Render(); %> Sets the ranges color The ranges color. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Ranges(ranges => ranges .Add().Color("Red"); ) ) .Render(); %> Sets the ranges opacity The ranges opacity. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale .Ranges(ranges => ranges .Add().Opacity(0.5); ) ) .Render(); %> Defines the fluent interface for configuring the . Initializes a new instance of the class. The gauge area. Sets the chart area background color. The background color. <% Html.Kendo().LinearGauge() .Name("linearGauge") .GaugeArea(gaugeArea => gaugeArea.Background("red")) .Render(); %> Sets the gauge area margin. The gauge area top margin. The gauge area right margin. The gauge area bottom margin. The gauge area left margin. <% Html.Kendo().LinearGauge() .Name("linearGauge") .GaugeArea(gaugeArea => gaugeArea.Margin(0, 5, 5, 0)) .Render(); %> Sets the gauge area margin. The gauge area margin. <% Html.Kendo().LinearGauge() .Name("linearGauge") .GaugeArea(gaugeArea => gaugeArea.Margin(5)) .Render(); %> Sets the gauge area border. The border width. The border color (CSS syntax). The border dash type. <% Html.Kendo().LinearGauge() .Name("linearGauge") .GaugeArea(gaugeArea => gaugeArea.Border(1, "#000", ChartDashType.Dot)) .Render(); %> Configures the gauge area border The border configuration action Defines the fluent interface for configuring the linear gauge track. Initializes a new instance of the class. The linear gauge track. Sets the track color. The track color. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Track(track => track.Color("red")) ) .Render(); %> Sets the track size. The track size. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Track(track => track.Size(8)) ) .Render(); %> Sets the track visibility. The track visibility. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Track(track => track.Visible(true)) ) .Render(); %> Sets the track border. The pointer border width. The pointer border color. The pointer dash type. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Track(track => track.Border(1, "#000", ChartDashType.Dot)) ) .Render(); %> Configures the track border The border configuration action Defines the fluent interface for configuring the . Initializes a new instance of the class. The gauge pointer. Sets the pointer color. The pointer color. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Color("red") ) .Render(); %> Sets the pointer shape. The pointer shape. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Shape(LinearGaugePointerShape.Arrow) ) .Render(); %> Sets the pointer margin. The pointer top margin. The pointer right margin. The pointer bottom margin. The pointer left margin. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Margin(20, 20, 20, 20) ) .Render(); %> Sets the pointer margin. The pointer margin. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Margin(20) ) .Render(); %> Sets the pointer border The pointer border width. The pointer border color. The pointer dash type. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Border(1, "#000", ChartDashType.Dot) ) .Render(); %> Configures the pointer border The border configuration action Sets the pointer opacity. The pointer opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Opacity(0.5) ) .Render(); %> Sets the pointer size. The pointer size. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Size(8) ) .Render(); %> Sets the pointer value. The pointer value. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Value(25) ) .Render(); %> Configures the pointer track. The configuration action. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Pointer(pointer => pointer .Track(track => track.Visible(true)) ) .Render(); %> Defines the fluent interface for configuring the . Initializes a new instance of the class. The gauge cap. Sets the cap color. The cap color. <% Html.Kendo().RadialGauge() .Name("radialGauge") .Pointer(pointer => pointer .Cap(cap => cap.Color("red")) ) .Render(); %> Sets the cap opacity. The cap opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <% Html.Kendo().RadialGauge() .Name("radialGauge") .Pointer(pointer => pointer .Cap(cap => cap.Opacity(0.5)) ) .Render(); %> Sets the cap size in percents. The cap size in percents. <% Html.Kendo().RadialGauge() .Name("radialGauge") .Pointer(pointer => pointer .Cap(cap => cap.Size(8)) ) .Render(); %> Defines the fluent interface for configuring the . Initializes a new instance of the class. The gauge pointer. Sets the pointer color. The pointer color. <% Html.Kendo().RadialGauge() .Name("radialGauge") .Pointer(pointer => pointer .Color("red") ) .Render(); %> Sets the pointer opacity. The pointer opacity in the range from 0 (transparent) to 1 (opaque). The default value is 1. <% Html.Kendo().RadialGauge() .Name("radialGauge") .Pointer(pointer => pointer .Opacity(0.5) ) .Render(); %> Sets the pointer value. The pointer value. <% Html.Kendo().RadialGauge() .Name("radialGauge") .Pointer(pointer => pointer .Value(25) ) .Render(); %> Configures the pointer cap. The configuration action. <% Html.Kendo().RadialGauge() .Name("radialGauge") .Pointer(pointer => pointer .Cap(cap => cap.Color("red")) ) .Render(); %> Initializes a new instance of the class. Gets or sets cap color Gets or sets the cap opacity The cap opacity Gets or sets the cap size in percents The cap size in percents Initializes a new instance of the class. Gets or sets pointer color Gets or sets the pointer opacity The pointer opacity Gets or sets the pointer value The pointer value Gets or sets the pointer value The pointer value Initializes a new instance of the class. Gets or sets track color Gets or sets the track border Gets or sets the track size The track size Gets or sets the visibility of the track The track visibility Gets or sets the track opacity The track opacity Initializes a new instance of the class. Gets or sets the pointer margin Gets or sets pointer color Gets or sets the pointer border Gets or sets the pointer opacity The pointer opacity Gets or sets the pointer shape The pointer shape Gets or sets the pointer size The pointer size Gets or sets the pointer value The pointer value Gets or sets the pointer position The pointer position The component UrlGenerator The component view context Initializes a new instance of the class. The view context. The javascript initializer. The URL Generator. Gets or sets the URL generator. The URL generator. Gets or sets the Gauge area. The Gauge area. Gets or sets the Gauge transitions. The Gauge Transitions. Gets or sets the Gauge theme. The Gauge theme. Gets or sets the render type. The render type. Initializes a new instance of the class. The view context. The javascript initializer. The URL Generator. Configuration for the default scale (if any) Configuration for the default pointer (if any) Initializes a new instance of the class. The view context. The javascript initializer. The URL Generator. Configuration for the default scale (if any) Configuration for the default pointer (if any) Initializes a new instance of the class. Creates a serializer Gets or sets the gauge area background. The gauge area background. Gets or sets the gauge area border. The gauge area border. Gets or sets the gauge area margin. The gauge area margin. Initializes a new instance of the class. The Gauge component. Creates the chart top-level div. Builds the Gauge component markup. Defines the fluent interface for configuring . Initializes a new instance of the class. The gauge scale ticks. Sets the ticks color The ticks color (CSS format). <% Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale.MajorTicks(ticks => ticks.Color("#f00"))) .Render(); %> Sets the ticks width The ticks width. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale.MajorTicks(ticks => ticks.Width(2))) .Render(); %> Sets the ticks size The ticks size. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale.MajorTicks(ticks => ticks.Size(2))) .Render(); %> Sets the ticks dashType The ticks dashType. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale.MajorTicks(ticks => ticks.DashType(ChartDashType.Dot))) .Render(); %> Sets the ticks visibility The ticks visibility. <% Html.Kendo().LinearGauge() .Name("linearGauge") .Scale(scale => scale.MajorTicks(ticks => ticks.Visible(false))) .Render(); %> Initializes a new instance of the class. Gets or sets the ticks size. Gets or sets the ticks width. Gets or sets the ticks color. Gets or sets the ticks dash type. Gets or sets the ticks visibility. Initializes a new instance of the class. The base class for all columns in Kendo Grid for ASP.NET MVC. Gets or sets the grid. The grid. Gets the member of the column. The member. Gets the template of the column. Gets the header template of the column. Gets the footer template of the column. Gets or sets the title of the column. The title. Gets or sets the width of the column. The width. Gets or sets a value indicating whether this column is hidden. true if hidden; otherwise, false. Hidden columns are output as HTML but are not visible by the end-user. Gets the header HTML attributes. The header HTML attributes. Gets the footer HTML attributes. The footer HTML attributes. Gets or sets a value indicating whether this column is visible. true if visible; otherwise, false. The default value is true. Invisible columns are not output in the HTML. Gets the HTML attributes of the cell rendered for the column The HTML attributes. Initializes a new instance of the class. Gets type of the property to which the column is bound to. Gets or sets a value indicating whether this column is groupable. true if groupable; otherwise, false. Gets a function which returns the value of the property to which the column is bound to. Gets or sets a value indicating whether this is sortable. true if sortable; otherwise, false. The default value is true. Gets or sets a value indicating whether this is filterable. true if filterable; otherwise, false. The default value is true. Defines the fluent interface for configuring bound columns filterable options The type of the data item Initializes a new instance of the class. The settings. Enables or disables filtering <%= Html.Kendo().Grid(Model) .Name("Grid") .Filterable(filtering => filtering.Enabled((bool)ViewData["enableFiltering"])) %> The Enabled method is useful when you need to enable filtering based on certain conditions. Configures the Filter menu operators. Configures Filter menu messages. Specify if the extra input fields should be visible within the filter menu. Default is true. True to show the extra inputs, otherwise false Initializes a new instance of the class. The column. Sets the type of the input element of the filter menu <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderDate) .Filterable(filterable => filterable.UI(GridFilterUIRole.DatePicker) ) ) %> Sets JavaScript function which to modify the UI of the filter input. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderDate) .Filterable(filterable => filterable.UI(@<text> JavaScript function goes here </text>) ) ) %> Sets JavaScript function which to modify the UI of the filter input. JavaScript function name Defines the fluent interface for configuring the column menu messages. Sets the text displayed for filter menu option. The message Sets the text displayed for columns menu option. The message Sets the text displayed for sort ascending menu option. The message Sets the text displayed for sort descending menu option. The message Sets the text displayed for done menu button. The message Sets the text displayed for menu header. The message Defines the fluent interface for configuring . Initializes a new instance of the class. The settings. Enables/disables header column menu. <%= Html.Kendo().Grid(Model) .Name("Grid") .ColumnMenu(menu => menu.Enabled((bool)ViewData["enableColumnMenu"])) %> The Enabled method is useful when you need to enable column menu based on certain conditions. Enables/disables sort section in header column menu. <%= Html.Kendo().Grid(Model) .Name("Grid") .ColumnMenu(menu => menu.Sortable((bool)ViewData["enableSort"])) %> The Enabled method is useful when you need to enable/disable sort section in column menu based on certain conditions. Enables/disables filter section in header column menu. <%= Html.Kendo().Grid(Model) .Name("Grid") .ColumnMenu(menu => menu.Filterable((bool)ViewData["enableFilter"])) %> The Enabled method is useful when you need to enable/disable filter section in column menu based on certain conditions. Enables/disables columns section in header column menu. <%= Html.Kendo().Grid(Model) .Name("Grid") .ColumnMenu(menu => menu.Columns((bool)ViewData["enableColumns"])) %> The Enabled method is useful when you need to enable/disable columns section in column menu based on certain conditions. Enables you to define custom messages in grid column menu. <%= Html.Kendo().Grid(Model) .Name("Grid") .ColumnMenu(menu => menu.Messages(msg => msg.Filter("Custom filter message"))) %> Defines the fluent interface for configuring the Filter menu DropDownList options. Clears the options. Supported only in conjunction with custom messages. Sets the text for IsEqualTo operator filter menu item. The message Sets the text for IsNotEqualTo operator filter menu item. The message Defines the fluent interface for configuring the Filter menu DropDownList options. Clears the options. Supported only in conjunction with custom messages. Sets the text for IsEqualTo operator filter menu item. The message Sets the text for IsNotEqualTo operator filter menu item. The message Sets the text for IsGreaterThanOrEqualTo operator filter menu item. The message Sets the text for IsGreaterThan operator filter menu item. The message Sets the text for IsLessThanOrEqualTo operator filter menu item. The message Sets the text for IsLessThan operator filter menu item. The message Defines the fluent interface for configuring the Filter menu DropDownList options. Clears the options. Supported only in conjunction with custom messages. Sets the text for IsEqualTo operator filter menu item. The message Sets the text for IsNotEqualTo operator filter menu item. The message Sets the text for IsGreaterThanOrEqualTo operator filter menu item. The message Sets the text for IsGreaterThan operator filter menu item. The message Sets the text for IsLessThanOrEqualTo operator filter menu item. The message Sets the text for IsLessThan operator filter menu item. The message Defines the fluent interface for configuring the Filter menu options. Sets the info part of the filter menu The message Sets the text for And option. The text Sets the text for Or option. The text Sets the text for Boolean IsTrue option value. The message Sets the text for Boolean IsFalse option value. The message Sets the text for Filter button. The message Sets the text for SelectValue option. The message Sets the text for Clear button. The message Sets the text for Operator label. The message Sets the text for Value label. The message Sets the text for Cancel button. The message Defines the fluent interface for configuring the Filter menu . Configures messages for string operators. Configures messages for number operators. Configures messages for date operators. Configures messages for enums operators. Defines the fluent interface for configuring the Filter menu DropDownList options. Clears the options. Supported only in conjunction with custom messages. Sets the text for IsEqualTo operator filter menu item. The message Sets the text for IsNotEqualTo operator filter menu item. The message Sets the text for StartsWith operator filter menu item. The message Sets the text for EndsWith operator filter menu item. The message Sets the text for Contains operator filter menu item. The message Sets the text for DoesNotContain operator filter menu item. The message Defines the fluent interface for configuring Initializes a new instance of the class. The settings. Enables or disables keyboard navigation. <%= Html.Kendo().Grid(Model) .Name("Grid") .Navigatable(setting => setting.Enabled((bool)ViewData["enableKeyBoardNavigation"])) %> The Enabled method is useful when you need to enable keyboard navigation based on certain conditions. Defines the fluent interface for configuring toolbar save command. The type of the model Defines the fluent interface for configuring toolbar command. The type of the model The type of the command. The type of the builder. Sets the HTML attributes. The HTML attributes. Sets the HTML attributes. The HTML attributes. Sets the text displayed by the "save changes" button. If not set a default value is used. The text which should be displayed Sets the text displayed by the "cancel changes" button. If not set a default value is used. The text which should be displayed Defines the fluent interface for configuring command. The type of the command. The type of the builder. Initializes a new instance of the class. The command. Sets the text displayed by the command. If not set a default value is used. The text which should be displayed Sets the HTML attributes. The HTML attributes. Sets the HTML attributes. The HTML attributes. Defines the fluent interface for configuring messages. Sets the text of the group panel when grid is not grouped. The message Represents an aggregate result. Defines the fluent interface for configuring aggregates for a given field. Applies the Min aggregate function. Applies the Max aggregate function. Applies the Count aggregate function. Applies the Average aggregate function. Applies the Sum aggregate function. Represents the aggregate result when grouping is enabled Represents the selection modes supported by Kendo UI Grid for ASP.NET MVC Represents the selection types supported by Kendo UI Grid for ASP.NET MVC Defines the fluent interface for configuring the . Configures the URL for Read operation. Sets controller, action and routeValues for Read operation. Action name Controller Name Route values Sets controller and action for Read operation. Action name Controller Name Configures the client-side events Configures the model Specifies if filtering should be handled by the server. Specifies if filtering should be handled by the server. Defines the fluent interface for configuring the . Specify the model id member name. The member name. Specify the model children member name. The member name. Specify the member name used to determine if the model has children. The member name. Describes a Model field Field name Field type Configures the URL for Read operation. Sets controller and action for Read operation. Action name Controller Name Route values Sets controller, action and routeValues for Read operation. Action name Controller Name Represents the menu item opening direction. Bottom direction Left direction Right direction Top direction Defines the fluent API for configuring the MobileListViewLinkItem settings. Defines the base fluent API for configuring the MobileListViewItem. Sets the text of the item. Sets the text of the item. Sets the HTML attributes. The HTML attributes. Sets the HTML attributes. The HTML attributes. Sets the HTML content which the item should display. The action which renders the item content. <% Html.Kendo().MobileListViewView() .Name("View") .Items(items => { items.Add().Content(() => { %> <strong> Item Content </strong> <% }); }) .Render(); %> Sets the HTML content which the item should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileListView() .Name("View") .Items(items => { items.Add().Content( @<text> Some text <strong> Item Content </strong> </text> ) }) ) The icon of the link item. It can be either one of the built-in icons, or a custom one. The value that configures the icon. Sets the HTML attributes of the link. The HTML attributes of the link. Sets the HTML attributes of the link. The HTML attributes of the link. Specifies the id of target Pane or `_top` for application level Pane The value that configures the target. This value will be available when the action callback of ActionSheet item is executed The value that configures the actionsheetcontext. Specifies the widget to be open when is tapped (the href must be set too) The value that configures the rel. Specifies the url for remote view or id of the view to be loaded (prefixed with #, like an anchor) The value that configures the url. Specifies the url for remote view to be loaded Sets controller and action from where the remove view to be loaded. Action name Controller Name Route values Sets controller, action and routeValues from where the remove view to be loaded. Action name Controller Name Defines the fluent API for configuring the MobileListViewItem settings. Builds nested MobileListView items. Action for declaratively building MobileListView items. <% Html.Kendo().MobileListViewView() .Name("View") .Items(items => { items.Add().Text("Master Item") .Items(masterItem => { masterItem.Add().Text("Inner Item 1"); masterItem.Add().Text("Inner Item 2"); }); }) .Render(); %> Defines the fluent API for adding items to Kendo MobileListView for ASP.NET MVC Gets or sets the T object that is the parent of the current node. The parent. Gets the previous T object on the same level as the current one, relative to the T.ParentNode object (if one exists). The previous sibling. Gets the next T node on the same hierarchical level as the current one, relative to the T.ParentNode property (if one exists). The next sibling. Mode of adaptive rendering Disables the mobile adaptive rendering Autodetect if rendered by a mobile browser Force mobile phone rendering Force mobile tablet rendering Defines the fluent interface for configuring the options. Sets the route values for the settings. Route values Sets the action, contoller and route values for the settings. Action name Controller name Route values Sets the action, contoller and route values for the settings. Action name Controller name Route values Sets the action and contoller values for the settings. Action name Controller name Sets the route name and values for the settings. Route name Route values Sets the route name and values for the settings. Route name Route values Sets the route name for the settings. Specifies an absolute or relative URL for the settings. Absolute or relative URL for the settings Defines the fluent API for configuring the Kendo MobileSplitViewPane for ASP.NET MVC events. Triggered when pane navigates to a view. The name of the JavaScript function that will handle the navigate event. Triggered after the pane displays a view. The name of the JavaScript function that will handle the viewShow event. The fluent API for subscribing to Kendo UI MultiSelect events. Initializes a new instance of the class. The client events. Defines the inline handler of the Select client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.Select( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Select client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.Select("select")) ) Defines the inline handler of the Change client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.Change("change")) ) Defines the inline handler of the DataBound client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.DataBound( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the DataBound client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.DataBound("dataBound")) %> Defines the name of the JavaScript function that will handle the the Open client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.Open("open")) ) Defines the inline handler of the Open client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.Open( @<text> function(e) { //event handling code } </text> )) ) Defines the inline handler of the Close client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.Close( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Close client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.Close("close")) ) Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Controls whether to bind the widget to the DataSource on initialization. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .AutoBind(false) %> Controls whether to close the widget suggestion list on item selection. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .AutoClose(false) %> Sets the field of the data item that provides the value content of the list items. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .DataTextField("Text") .DataValueField("Value") %> Configures the client-side events. The client events action. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .Events(events => events.Change("change") ) %> Use it to enable filtering of items. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .Filter("startswith"); %> Use it to enable filtering of items. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .Filter(FilterType.Contains); %> Defines the items in the MultiSelect The add action. <%= Html.Telerik().MultiSelect() .Name("MultiSelect") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Use it to enable highlighting of first matched item. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .HighlightFirst(true) %> Specifies the limit of the selected items. If set to null widget will not limit number of the selected items. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .MinLength(3) %> Specifies the minimum number of characters that should be typed before the widget queries the dataSource. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .MinLength(3) %> A string that appears in the textbox when it has no value. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .Placeholder("Select country...") %> Template to be used for rendering the items in the list. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .ItemTemplate("#= data #") %> TemplateId to be used for rendering the items in the list. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .ItemTemplateId("widgetTemplateId") %> Template to be used for rendering the tags of the selected items. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .TagTemplate("#= data #") %> TemplateId to be used for rendering the tags of the selected items. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .TagTemplateId("widgetTemplateId") %> Sets the value of the widget. <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .Value(new string[] { "1" }) %> Defines the fluent interface for configuring Enables or disables column reordering. True to enable column reordering, otherwise false Defines the fluent interface for configuring filter operator. Includes only values which are less then the given value. The value which the result should be less then Includes only values which are less or equal to the given value. The value which the result should be less or equal to Includes only values which are greater then or equal to the given value. The value which the result should be greater then or equal to Includes only values which are greater then the given value. The value which the result should be greater then Defines the fluent interface for configuring filter. Specifies the member on which the filter should be applied. Member access expression which describes the member Specifies the member on which the filter should be applied. Member access expression which describes the member Specifies the member on which the filter should be applied. Member type Member access expression which describes the member Specifies the member on which the filter should be applied. Member access expression which describes the member Defines the fluent interface for configuring filter string operator. Includes only values which are starting with the given string. The string with which the result should start Includes only values which end with the given string. The string with which the result should end Includes only values which contain the given string. The string which the result should contain Includes only values which does not contain the given string. The string which the result should not contain Defines the fluent interface for configuring grid editing. Initializes a new instance of the class. The settings. Enables or disables grid editing. <%= Html.Kendo().Grid<Order>() .Name("Orders") .Editable(settings => settings.Enabled(true)) %> The Enabled method is useful when you need to enable grid editing on certain conditions. Specify an editor template which to be used for InForm or PopUp modes name of the editor template This settings is applicable only when Mode is Provides additional view data in the editor template. The additional view data will be provided if the editing mode is set to in-form or popup. For other editing modes use An anonymous object which contains the additional data <%= Html.Kendo().Grid(Model) .Name("Grid") .Editable(editing => editing.AdditionalViewData(new { customers = Model.Customers })) %> Enables or disables delete confirmation. <%= Html.Kendo().Grid<Order>() .Name("Orders") .Editable(settings => settings.DisplayDeleteConfirmation(true)) %> Change default text for confirm delete button. Note: Available only on mobile devices. Available only on mobile devices. <%= Html.Kendo().Grid<Order>() .Name("Orders") .Editable(settings => settings.ConfirmDelete("Yes")) %> Change default text for cancel delete button. Note: Available only on mobile devices. Available only on mobile devices. <%= Html.Kendo().Grid<Order>() .Name("Orders") .Editable(settings => settings.ConfirmDelete("No")) %> Sets insert row position. <%= Html.Kendo().Grid<Order>() .Name("Orders") .Editable(settings => settings.CreateAt(GridInsertRowPosition.Bottom)) %> Defines the fluent interface for configuring Enables or disables column resizing. True to enable column resizing, otherwise false Defines the fluent interface for configuring template columns Defines the fluent interface for configuring columns. The type of the column builder. Initializes a new instance of the class. The column. Sets the title displayed in the header of the column. The text. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).Title("ID")) %> Sets the HTML attributes applied to the header cell of the column. The attributes. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).HeaderHtmlAttributes(new {@class="order-header"})) %> Sets the HTML attributes applied to the header cell of the column. The attributes. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).HeaderHtmlAttributes(new {@class="order-header"})) %> Sets the HTML attributes applied to the footer cell of the column. The attributes. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).FooterHtmlAttributes(new {@class="order-footer"})) %> Sets the HTML attributes applied to the footer cell of the column. The attributes. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).FooterHtmlAttributes(new {@class="order-footer"})) %> Sets the HTML attributes applied to the content cell of the column. The attributes. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).HtmlAttributes(new {@class="order-cell"})) %> Sets the HTML attributes applied to the content cell of the column. The attributes. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).HtmlAttributes(new {@class="order-cell"})) %> Sets the width of the column in pixels. The width in pixels. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).Width(100)) %> Sets the width of the column using CSS syntax. The width to set. <% Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => { %> <%= Html.ActionLink("Edit", "Home", new { id = o.OrderID}) %> <% })) .Width("30px") .Render(); %> Makes the column visible or not. By default all columns are visible. Invisible columns are not rendered in the output HTML. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).Visible((bool)ViewData["visible"])) %> Makes the column hidden or not. By default all columns are not hidden. Hidden columns are rendered in the output HTML but are hidden. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).Hidden((bool)ViewData["hidden"])) %> Hides a column. By default all columns are not hidden. Hidden columns are rendered in the output HTML but are hidden. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).Hidden()) %> Specifys whether the columns should be included in column header menu. By default all columns are included. The column also need to have a Title set in order to be included in the menu. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderID).IncludeInMenu((bool)ViewData["hidden"])) %> Sets the header template for the column. The action defining the template. Sets the header template for the column. The string defining the template. Sets the header template for the column. The action defining the template. Sets the footer template for the column. The action defining the template. Sets the footer template for the column. The string defining the template. Sets the footer template for the column. The action defining the template. Gets or sets the column. The column. Represents the editing modes supported by Kendo UI Grid for ASP.NET MVC Defines the fluent interface for configuring toolbar custom command. The type of the model Sets command route. The route name Sets command route and route values. The route name The route values Sets command route and route values. The route name The route values Sets command action. The route values Sets command action and controller. The action name The controller name Sets command action and controller. The action name The controller name The route values Sets command action and controller. The action name The controller name The route values Sets command absolute URL. The URL Sets the command name. The name of the command Defines the fluent interface for configuring group. Specifies the member by which the data should be grouped. Member access expression which describes the member Specifies the member by which the data should be grouped. Member type Member name Specifies the member by which the data should be grouped. Member name Member type Specifies the member by which the data should be grouped. Member name Member type Sort order Specifies the member by which the data should be grouped. Member type Member type Sort order Specifies the member by which the data should be sorted in descending order and grouped. Member type Member access expression which describes the member Specifies the member by which the data should be sorted in descending order and grouped. Member type Member name Specifies the member by which the data should be sorted in descending order and grouped. Member name /// Member type Defines the fluent interface for configuring . Configures messages. Enables or disables filtering Defines the fluent interface for configuring toolbar command. The type of the model Defines a create command. Defines a save command. Defines a custom command. Sets toolbar template. The action defining the template. Sets toolbar template. The template Sets the toolbar template. The action defining the template. Sets the toolbar template. The action defining the template. Gets or sets a value indicating whether member access expression used by this builder should be lifted to null. The default value is true; true if member access should be lifted to null; otherwise, false. Provided expression should have string type ArgumentException. ArgumentException. Provided 's is not Provided type is not Provided 's is not Provided 's is not ArgumentException. did not implement . Invalid name for property or field; or indexer with the specified arguments. InvalidOperationException. InvalidCastException. Child element with name specified by does not exists. Represents a filtering descriptor which serves as a container for one or more child filtering descriptors. Base class for all used for handling the logic for property changed notifications. Represents a filtering abstraction that knows how to create predicate filtering expression. Creates a predicate filter expression used for collection filtering. The instance expression, which will be used for filtering. A predicate filter expression. Creates a filter expression by delegating its creation to , if is , otherwise throws The instance expression, which will be used for filtering. A predicate filter expression. Parameter should be of type Creates a predicate filter expression used for collection filtering. The parameter expression, which will be used for filtering. A predicate filter expression. Creates a predicate filter expression combining expressions with . The parameter expression, which will be used for filtering. A predicate filter expression. Gets or sets the logical operator used for composing of . The logical operator used for composition. Gets or sets the filter descriptors that will be used for composition. The filter descriptors used for composition. Logical operator used for filter descriptor composition. Combines filters with logical AND. Combines filters with logical OR. The method checks whether the passed parameter satisfies filter criteria. Creates a predicate filter expression that calls . The parameter expression, which parameter will be passed to method. If false will not execute. Represents declarative filtering. Initializes a new instance of the class. Initializes a new instance of the class. The member. The filter operator. The filter value. Creates a predicate filter expression. The parameter expression, which will be used for filtering. A predicate filter expression. Determines whether the specified descriptor is equal to the current one. The other filter descriptor. True if all members of the current descriptor are equal to the ones of , otherwise false. Determines whether the specified is equal to the current descriptor. Serves as a hash function for a particular type. A hash code for the current filter descriptor. Gets or sets the member name which will be used for filtering. The member that will be used for filtering. Gets or sets the type of the member that is used for filtering. Set this property if the member type cannot be resolved automatically. Such cases are: items with ICustomTypeDescriptor, XmlNode or DataRow. Changing this property did not raise The type of the member used for filtering. Gets or sets the filter operator. The filter operator. Gets or sets the target filter value. The filter value. Represents collection of . Operator used in Left operand must be smaller than the right one. Left operand must be smaller than or equal to the right one. Left operand must be equal to the right one. Left operand must be different from the right one. Left operand must be larger than the right one. Left operand must be larger than or equal to the right one. Left operand must start with the right one. Left operand must end with the right one. Left operand must contain the right one. Left operand must be contained in the right one. Left operand must not contain the right one. InvalidOperationException. Defines the fluent interface for configuring ListView editing. Initializes a new instance of the class. The settings. Specify an editor template which to be used. name of the editor template Defines the fluent API for configuring the Kendo ListView for ASP.NET MVC events. Defines the fluent interface for configuring Enables or disables selection. <%= Html.Kendo().ListView(Model) .Name("ListView") .Selectable(selection => selection.Enabled((bool)ViewData["enableSelection"])) %> Specifies whether multiple or single selection is allowed. <%= Html.Kendo().ListView(Model) .Name("ListView") .Selectable(selection => selection.Mode((bool)ViewData["selectionMode"])) %> The Mode method is useful to switch between different selection modes. Defines the fluent interface for configuring the . Initializes a new instance of the class. The component. Binds the ListView to a list of objects The type of the data item The data source. <%= Html.Kendo().ListView<Order>() .Name("Orders") .BindTo((IEnumerable<Order>)ViewData["Orders"]); %> Binds the ListView to a list of objects The type of the data item The data source. <%= Html.Kendo().ListView<Order>() .Name("Orders") .BindTo((IEnumerable)ViewData["Orders"]); %> Specifies ListView item template. The Id of the element which contains the template. <%= Html.Kendo().ListView<Order>() .Name("Orders") .ClientTemplateId("listViewTemplate"); %> Allows paging of the data. <%= Html.Kendo().ListView() .Name("ListView") .Ajax(ajax => ajax.Action("Orders", "ListView")) .Pageable(); %> Allows paging of the data. Use builder to define paging settings. <%= Html.Kendo().ListView() .Name("Grid") .Ajax(ajax => ajax.Action("Orders", "ListView")) .Pageable(paging => paging.Enabled(true)) %> Enables keyboard navigation. <%= Html.Kendo().ListView() .Name("ListView") .Ajax(ajax => ajax.Action("Orders", "ListView")) .Navigatable(); %> Enables single item selection. <%= Html.Kendo().ListView() .Name("ListView") .Selectable() %> Enables item selection. Use builder to define the selection mode. <%= Html.Kendo().ListView() .Name("ListView") .Selectable(selection => { selection.Enabled(true); selection.Mode(ListViewSelectionMode.Multiple); }) %> Specifies if the ListView should be automatically bound on initial load. This is only possible if AJAX binding is used, and widget is not initialy populated on the server. If true ListView will be automatically data bound, otherwise false Specifies ListView wrapper element tag name. <%= Html.Kendo().ListView() .Name("ListView") .TagName("div") %> Configures the ListView editing settings. <%= Html.Kendo().ListView() .Name("ListView") .Editable(settings => settings.Enabled(true)) %> Enables ListView editing. <%= Html.Kendo().ListView() .Name("ListView") .Editable() %> Configures the client-side events. The client events action. <%= Html.Kendo().ListView() .Name("ListView") .Events(events => events .DataBound("onDataBound") ) %> Represents the selection modes supported by Kendo UI ListView for ASP.NET MVC Initializes a new instance of the class. The ListView component. Builds the ListView component markup. Gets the key for this group. The key for this group. Gets the items in this groups. The items in this group. Gets a value indicating whether this instance has sub groups. true if this instance has sub groups; otherwise, false. Gets the count. The count. Gets the subgroups, if is true, otherwise empty collection. The subgroups. Gets a value indicating whether this instance has any sub groups. true if this instance has sub groups; otherwise, false. Gets the number of items in this group. The items count. Gets the subgroups, if is true, otherwise empty collection. The subgroups. Gets the items in this groups. The items in this group. Gets the key for this group. The key for this group. Gets the aggregate results generated for the given aggregate functions. The aggregate results for the provided aggregate functions. functions is null. Gets or sets the aggregate functions projection for this group. This projection is used to generate aggregate functions results for this group. The aggregate functions projection. Represents an aggregate function. Creates the aggregate expression that is used for constructing expression tree that will calculate the aggregate result. The grouping expression. Generates default name for this function using this type's name. Function name generated with the following pattern: {.}_{} Gets or sets the informative message to display as an illustration of the aggregate function. The caption to display as an illustration of the aggregate function. Gets or sets the name of the field, of the item from the set of items, which value is used as the argument of the aggregate function. The name of the field to get the argument value from. Gets or sets the name of the aggregate function, which appears as a property of the group record on which records the function works. The name of the function as visible from the group record. Gets or sets a string that is used to format the result value. The format string. Gets the with the specified function name. First with the specified function name if any, otherwise null. Initializes a new instance of the class. The value of the result. The number of arguments used for the calculation of the result. Function that generated the result. function is null. Initializes a new instance of the class. that generated the result. function is null. Initializes a new instance of the class. The value of the result. that generated the result. Returns a that represents the current . A that represents the current . Gets or sets the value of the result. The value of the result. Gets the formatted value of the result. The formatted value of the result. Gets or sets the number of arguments used for the calulation of the result. The number of arguments used for the calulation of the result. Gets or sets the text which serves as a caption for the result in a user interface.. The text which serves as a caption for the result in a user interface. Gets the name of the function. The name of the function. Gets the first which is equal to . The for the specified function if any, otherwise null. Gets the type of the extension methods that holds the extension methods for aggregation. For example or . The type of that holds the extension methods. The default value is . Creates the aggregate expression using . The grouping expression. Initializes a new instance of the class. Gets the the Average method name. Average. Creates the aggregate expression using . The grouping expression. Initializes a new instance of the class. Gets the the Count method name. Count. Gets the the First method name. First. Initializes a new instance of the class. Gets the the Last method name. Last. Initializes a new instance of the class. Gets the the Max method name. Max. Initializes a new instance of the class. Gets the the Min method name. Min. Initializes a new instance of the class. Gets the the Min method name. Min. Represents grouping criteria. Represents declarative sorting. Gets or sets the member name which will be used for sorting. The member that will be used for sorting. Gets or sets the sort direction for this sort descriptor. If the value is null no sorting will be applied. The sort direction. The default value is null. Changes the to the next logical value. Gets or sets the type of the member that is used for grouping. Set this property if the member type cannot be resolved automatically. Such cases are: items with ICustomTypeDescriptor, XmlNode or DataRow. The type of the member used for grouping. Gets or sets the content which will be used from UI. The content that will be used from UI. Gets or sets the aggregate functions used when grouping is executed. The aggregate functions that will be used in grouping. Calculates unique int for given group in a group sequence, taking into account groups order, each group key and groups' count. Defines the fluent API for configuring the object. Enables or disables the progress animation The boolean value <%= Html.Kendo().ProgressBar() .Name("progressBar") .Animation(a => a.Enable(false)) %> Specifies the duration of the progress animation The boolean value <%= Html.Kendo().ProgressBar() .Name("progressBar") .Animation(a => a.Duration(200)) %> Define the fluent interface for configuring the component. Initializes a new instance of the class. The component. Use to enable or disable the animation. The boolean value. <%= Html.Kendo().ProgressBar() .Name("progressBar") .Animation(false) %> Configures the animation effects. The action which configures the animation effects. <%= Html.Kendo().ProgressBar() .Name("progressBar") .Animation(a => a.Duration(200)) %> Sets the number of chunks to which the ProgressBar will be divided (applies only when type is "chunk") The number of chunks <%= Html.Kendo().ProgressBar() .Name("progressBar") .Type(ProgressBarType.Chunk) .ChunkCount(10) %> Enables or disables the component true if the component should be enabled, false otherwise; the default is true. <%= Html.Kendo().ProgressBar() .Name("progressBar") .Enable(false) %> Configures the client-side events The client events configuration action. <%= Html.Kendo().ProgressBar() .Name("progressBar") .Events(events => events .Change("onChange")) %> Sets the maximum value of the ProgressBar Number specifying the maximum value <%= Html.Kendo().ProgressBar() .Name("progressBar") .Max(200) %> Sets the minimum value of the ProgressBar Number specifying the minimum value <%= Html.Kendo().ProgressBar() .Name("progressBar") .Min(50) %> Sets the orientation of the ProgressBar ProgressBarOrientation enumeration specifying the orientation <%= Html.Kendo().ProgressBar() .Name("progressBar") .Orientation(ProgressBarOrientation.Vertical) %> Specifies if the ProgressBar direction will be reversed The boolean value <%= Html.Kendo().ProgressBar() .Name("progressBar") .Reverse(true) %> Specifies if the Progress status will be displayed The boolean value <%= Html.Kendo().ProgressBar() .Name("progressBar") .ShowStatus(false) %> Specifies the type of the ProgressBar ProgressBarType enumeration specifying the type <%= Html.Kendo().ProgressBar() .Name("progressBar") .Type(ProgressBarType.Percent) %> Sets the initial value of the ProgressBar Number specifying the value <%= Html.Kendo().ProgressBar() .Name("progressBar") .Min(100) .Max(200) .Value(100) %> Sets the initial value of the ProgressBar Pass false to set indeterminate value <%= Html.Kendo().ProgressBar() .Name("progressBar") .Min(100) .Max(200) .Value(false) %> Initializes a new instance of teh class The client events. Defines the inline handler of the Change client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().ProgressBar() .Name("progressBar") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().ProgressBar() .Name("progressBar") .Events(events => events.Change("onChange")) %> Defines the inline handler of the Complete client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().ProgressBar() .Name("progressBar") .Events(events => events.Complete( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Complete client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().ProgressBar() .Name("progressBar") .Events(events => events.Complete("onComplete")) %> Initializes a new instance of the class. The view context. The javascript initializer. Writes the initialization script The writer object. Writes the ProgressBar HTML. The writer object. Defines the ProgressBar animation Gets or sets the number of chunks when the type of the Progressbar is set to "chunk" Gets or sets a value indicating whether the component is enabled true if the component should be enabled, false otherwise; the default is true. Gets or sets the maximum value of the ProgressBar Gets or sets the minimum value of the ProgressBar Gets or sets the orientation of the ProgressBar Specifies if the progress direction should be reversed Specifies if the progress status should be displayed Gets or sets the current value of the ProgressBar Gets or sets the type of the ProgressBar Represents the orientation supported by Kendo UI ProgressBar for ASP.NET MVC Represents the progress types supported by Kendo UI ProgressBar for ASP.NET MVC Initializes a new instance of the class. The QRCode component. Creates the QRCode top-level div. Builds the QRCode component markup. Specifies a QR code encoding mode. Specifies the default encoding - ISO/IEC 8859-1. Specifies a UTF-8 encoding. Specifies a QR code error correction level. Specifies a Low error correction level. Approximately 7% of the codewords can be restored. Specifies a Medium error correction level. Approximately 15% of the codewords can be restored. Specifies a Quartile error correction level. Approximately 25% of the codewords can be restored. Specifies a High error correction level. Approximately 30% of the codewords can be restored. Defines the fluent interface for configuring . Initializes a new instance of the class. The qr code border. Sets the border width. The border width. @(Html.Kendo().QRCode() .Name("qrCode") .Border(border => border.Width(5)) ) <%:Html.Kendo().QRCode() .Name("qrCode") .Border(border => border.Width(5)) %> Sets the border color. The border color. @(Html.Kendo().QRCode() .Name("qrCode") .Border(border => border.Color("black")) ) <%:Html.Kendo().QRCode() .Name("qrCode") .Border(border => border.Color("black")) %> Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Sets the background color of the QR code. The QR code background color. @(Html.Kendo().QRCode() .Name("qrCode") .Background("red") ) <%:Html.Kendo().QRCode() .Name("qrCode") .Background("red") %> Sets the border width and color of the QR code. The QR code border color. The QR code border width. @(Html.Kendo().QRCode() .Name("qrCode") .Border("black", 5) ) <%:Html.Kendo().QRCode() .Name("qrCode") .Border("black", 5) %> Sets the border configuration of the QRCode. The lambda which configures the border. @(Html.Kendo().QRCode() .Name("qrCode") .Border(border => // configure the border border .Color("black") .Width(5) ) ) <%:Html.Kendo().QRCode() .Name("qrCode") .Border(border => // configure the border border .Color("black") .Width(5) ) %> Sets the color of the QR code. The QR code color. @(Html.Kendo().QRCode() .Name("qrCode") .Color("blue") ) <%:Html.Kendo().QRCode() .Name("qrCode") .Color("blue") %> Sets the encoding of the QR code. The QR code encoding. @(Html.Kendo().QRCode() .Name("qrCode") .Encoding(QREncoding.UTF_8) ) <%:Html.Kendo().QRCode() .Name("qrCode") .Encoding(QREncoding.UTF_8) %> Sets the error correction level of the QR code. The QR code error correction level. @(Html.Kendo().QRCode() .Name("qrCode") .ErrorCorrection(QRErrorCorrectionLevel.Q) ) <%:Html.Kendo().QRCode() .Name("qrCode") .ErrorCorrection(QRErrorCorrectionLevel.Q) %> Sets the size of the QR code. The QR code size. @(Html.Kendo().QRCode() .Name("qrCode") .Size(170) ) <%:Html.Kendo().QRCode() .Name("qrCode") .Size(170) %> Sets the value of the QR code. The QR value. @(Html.Kendo().QRCode() .Name("qrCode") .Value("Hello world") ) <%:Html.Kendo().QRCode() .Name("qrCode") .Value("Hello world") %> Sets the preferred rendering engine. If it is not supported by the browser, the Chart will switch to the first available mode. The preferred rendering engine. Gets or sets the color of the border. Gets or sets the width of the border. The server side wrapper for the Kendo UI QRCode. Gets or sets the QRCode value. The QRCode value. Gets or sets the render type. The render type. Gets the border configuration. Gets or sets the QRCode size. The QRCode size. Gets or sets the QRCode color. The QRCode color. Gets or sets the QRCode background. The QRCode background. Gets or sets the QRCode error correction level. The QRCode error correction level. Gets or sets the QRCode encoding. The QRCode encoding. Defines the fluent interface for configuring the . Initializes a new instance of the class. The component. The current start of the RecurrenceEditor. Used to determine the start day. The minimum date available in the "Until" DatePicker. The start @(Html.Kendo().RecurrenceEditor() .Name("recurrenceEditor") .Start(new DateTime(2013, 6, 13)) ) The first week day (by index) of the RecurrenceEditor. Default is 0. The firstWeekDay @(Html.Kendo().RecurrenceEditor() .Name("recurrenceEditor") .FirstWeekDay(6) ) The timezone of the RecurrenceEditor. The timezone @(Html.Kendo().RecurrenceEditor() .Name("recurrenceEditor") .Timezone("Etc/UTC") ) The value of the RecurrenceEditor. Must be valid recurrence rule. The value @(Html.Kendo().RecurrenceEditor() .Name("recurrenceEditor") .Value("FREQ=WEEKLY;BYDAY=TU,TH") ) The Frequencies of the RecurrenceEditor. The addFrequencyAction @(Html.Kendo().RecurrenceEditor() .Name("recurrenceEditor") .Frequency(frequency => frequency .Add(RecurrenceEditorFrequency.Never) .Add(RecurrenceEditorFrequency.Daily) .Add(RecurrenceEditorFrequency.Weekly) ) ) The IEnumerable collection of frequencies for the RecurrenceEditor. The frequencies @(Html.Kendo().RecurrenceEditor() .Name("recurrenceEditor") .Frequency(new List<RecurrenceEditorFrequency>() { RecurrenceEditorFrequency.Never, RecurrenceEditorFrequency.Daily, RecurrenceEditorFrequency.Weekly, })) Sets the messages of the recurrenceEditor. The lambda which configures the scheduler messages Sets the events configuration of the recurrenceEditor. The lambda which configures the recurrenceEditor events <%= Html.Kendo().RecurrenceEditor() .Name("RecurrenceEditor") .Events(events => events.Change("change") ) %> The fluent API for subscribing to Kendo UI RecurrenceEditor events. Initializes a new instance of the class. The events. Defines the inline handler of the change event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().RecurrenceEditor() .Name("RecurrenceEditor") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the change event. The name of the JavaScript function that will handle the event. @(Html.Kendo().RecurrenceEditor() .Name("RecurrenceEditor") .Events(events => events.Change("change")) ) Creates views for the class. Initializes a new instance of the class. The container. Adds RecurrenceEditorFrequency to the RecurrenceEditor. The frequency Represents the frequency types supported by Kendo UI RecurrenceEditor for ASP.NET MVC Configures the initial filter. Configures Model properties Defines the fluent interface for configuring the . Defines the fluent interface for configuring the . Initializes a new instance of the class. The resource The user-friendly title of the view displayed by the scheduler. The title @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(dayView => { dayView.Title("Day"); }); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Sets the editing configuration of the current scheduler view. The lambda which configures the editing If set to true the user would be able to create new scheduler events and modify or delete existing ones. Default value is true. The isEditable @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(dayView => { dayView.Title("Day"); dayView.Editable(false); }); views.AgendaView(); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) The template used by the view to render the scheduler events. The eventTemplate. The Id of the template used by the view to render the scheduler events. The eventTemplateId The format used to display the selected date. Uses kendo.format. Contains two placeholders - "{0}" and "{1}" which represent the start and end date displayed by the view. The selectedDateFormat. @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(dayView => { dayView.Title("Day"); dayView.Editable(false); dayView.SelectedDateFormat("{0:dd-MM-yyyy}"); }); views.AgendaView(); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) If set to true the view will be initially selected by the scheduler widget. Default value is false. The isSelected @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(dayView => { dayView.Title("Day"); dayView.Editable(false); dayView.SelectedDateFormat("{0:dd-MM-yyyy}"); dayView.Selected(true); }); views.AgendaView(); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Sets the orientation of the group headers The orientation Creates resources grouping for the class. Initializes a new instance of the class. The container Sets the resources by which the scheduler will be grouped. The names of the resources The orientation of the group headers. The orientation Defines the fluent interface for configuring the . Initializes a new instance of the class. The editorMessages. Defines the fluent interface for configuring the . Initializes a new instance of the class. The messages. Sets the View messages of the scheduler. The lambda which configures the scheduler view messages Sets the Recurrence messages of the scheduler. The lambda which configures the scheduler recurrence messages Sets the Editor messages of the scheduler. The lambda which configures the scheduler editor messages Sets the Editor messages of the scheduler. The lambda which configures the scheduler editor messages Defines the fluent interface for configuring the . Initializes a new instance of the class. The editorMessages. Defines the fluent interface for configuring the . Initializes a new instance of the class. The editorMessages. Defines the fluent interface for configuring the . Initializes a new instance of the class. The editorMessages. Defines the fluent interface for configuring the . Initializes a new instance of the class. The editorMessages. Sets the Recurrence Editor Frequencies messages of the scheduler. The lambda which configures the scheduler recurrence editor frequencies messages Sets the Recurrence Editor Daily messages of the scheduler. The lambda which configures the scheduler recurrence editor daily messages Sets the Recurrence Editor Weekly messages of the scheduler. The lambda which configures the scheduler recurrence editor weekly messages Sets the Recurrence Editor Montly messages of the scheduler. The lambda which configures the scheduler recurrence editor montly messages Sets the Recurrence Editor Yearly messages of the scheduler. The lambda which configures the scheduler recurrence editor yearly messages Sets the Recurrence Editor End messages of the scheduler. The lambda which configures the scheduler recurrence editor end messages Sets the Recurrence Editor OffsetPositions messages of the scheduler. The lambda which configures the scheduler recurrence editor offsetPositions messages Sets the Recurrence Editor Weekdays messages of the scheduler. The lambda which configures the scheduler recurrence editor weekdays messages Defines the fluent interface for configuring the . Initializes a new instance of the class. The editorMessages. Defines the fluent interface for configuring the . Initializes a new instance of the class. The editorMessages. Defines the fluent interface for configuring the . Initializes a new instance of the class. The editorMessages. Defines the fluent interface for configuring the . Initializes a new instance of the class. The editorMessages. Defines the fluent interface for configuring the . Initializes a new instance of the class. The editorMessages. Defines the fluent interface for configuring the . Initializes a new instance of the class. The recurrenceMessages. Defines the fluent interface for configuring the . The template used by the agenda view to render the date of the scheduler events. The eventDateTemplate The Id of the template used by the agenda view to render the date of the scheduler events. The eventDateTemplateId The template used by the agenda view to render the time of the scheduler events. The eventTimeTemplate The Id of the template used by the agenda view to render the time of the scheduler events. The eventTimeTemplateId Defines the fluent interface for configuring the . Defines the fluent interface for configuring the . The template used to render the "all day" scheduler events. The allDayEventTemplate The Id of the template used to render the "all day" scheduler events. The allDayEventTemplateId If set to true the scheduler will display a slot for "all day" events. Default value is true. The allDaySlot The template used to render the date header cells. The dateHeaderTemplate The Id of the template used to render the date header cells. The dateHeaderTemplateId The number of minutes represented by a major tick. The majorTick The template used to render the all day slot content The slotTemplate The Id of the template used to render the all day slot content. The id of template The template used to render the slot content The slotTemplate The Id of the template used to render the slot content. The id of template The template used to render the major ticks. The majorTimeHeaderTemplate The Id of the template used to render the major ticks. The majorTimeHeaderTemplateId The number of time slots to display per major tick. The minorTickCount The template used to render the minor ticks. The minorTimeHeaderTemplate The Id of the template used to render the minor ticks. The minorTimeHeaderTemplateId The start time of the view. The scheduler will display events starting after the startTime. The startTime @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(dayView => { dayView.Title("Day"); dayView.StartTime(new DateTime(2013, 6, 13, 10, 00, 00)); dayView.EndTime(new DateTime(2013, 6, 13, 23, 00, 00)); }); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) The start time of the view. The scheduler will display events starting after the startTime. The hours The minutes The seconds @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(dayView => { dayView.Title("Day"); dayView.StartTime(10,0,0); dayView.EndTime(new DateTime(2013, 6, 13, 23, 00, 00)); }); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) The end time of the view. The scheduler will display events ending before the endTime. The endTime @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(dayView => { dayView.Title("Day"); dayView.StartTime(new DateTime(2013, 6, 13, 10, 00, 00)); dayView.EndTime(new DateTime(2013, 6, 13, 23, 00, 00)); }); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) The end time of the view. The scheduler will display events ending before the endTime. The hours The minutes The seconds @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(dayView => { dayView.Title("Day"); dayView.StartTime(new DateTime(2013, 6, 13, 10, 00, 00)); dayView.EndTime(23,0,0); }); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) The start time of the business hours. The scheduler will display events after the workDayStart if "WorkDayCommand" button is clicked. The WorkDayStart The start time of the business hours. The scheduler will display events after the workDayStart if "WorkDayCommand" button is clicked. The hours The minutes The seconds The end time of the business hours. The scheduler will display events before the workDayEnd if "WorkDayCommand" button is clicked. The WorkDayEnd The end time of the business hours. The scheduler will display events before the workDayEnd if "WorkDayCommand" button is clicked. The hours The minutes The seconds If set to false the scheduler will not display the "WorkDayCommand" button. Default value is true. The showWorkDayCommand If set to true the view will be initially shown in business hours mode. If set the view will be initially shown in business hours mode. If set to false the scheduler will not display the "footer" area. Default value is true. The footer Sets the start day of work week by index. The workWeekStartDay Sets the end day of work week by index. The workWeekEndDay Defines the fluent interface for configuring the . Initializes a new instance of the class. The container. If set to true the user can create new events. Creating is enabled by default. The create If set to true the user can delete events from the view by clicking the "destroy" button. Deleting is enabled by default. The destroy If set to true the user can update events. Updating is enabled by default. The update The template which renders the editor. The template The Id of the template which renders the editor. The templateId The EditorTemplate which to be rendered as editor. The name of the EditorTemplate The text which the scheduler will display in a confirmation dialog when the user clicks the "destroy" button. The message If set to false the resizing of the events will be disabled. Resizing is enabled by default. The resize option If set to true the scheduler will display a confirmation dialog when the user clicks the "destroy" button. Confirmation dialog is enabled by default. The confirmation Defines the fluent interface for configuring the . Initializes a new instance of the class. The viewMessages. Defines the fluent interface for configuring the . The template used to render the day slots in month view. The dayTemplate The Id of the template used to render the day slots in month view. The dayTemplateId The height of the scheduler event rendered in month view. The eventHeight Defines the fluent interface for configuring the . Initializes a new instance of the class. The container. If set to true the user can create new events. Creating is enabled by default. The create If set to true the user can delete events from the view by clicking the "destroy" button. Deleting is enabled by default. The destroy If set to true the user can update events. Updating is enabled by default. The update Defines the fluent interface for configuring the . Defines the fluent interface for configuring the . Defines the fluent interface for configuring the . Initializes a new instance of the class. The component. The current date of the scheduler. Used to determine the period which is displayed by the widget. The Date @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .BindTo(Model) ) Enables the adaptive rendering when viewed on mobile browser Used to determine if adaptive rendering should be used when viewed on mobile browser The start time of the week and day views. The scheduler will display events starting after the startTime. The startTime. @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .StartTime(new DateTime(2013, 6, 13, 10, 00, 00)) .BindTo(Model) ) The start time of the week and day views. The scheduler will display events starting after the startTime. The hours The minutes The seconds @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .StartTime(10, 0, 0) .BindTo(Model) ) The end time of the week and day views. The scheduler will display events ending before the endTime. The endTime. @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .EndTime(new DateTime(2013, 6, 13, 23, 00, 00)) .BindTo(Model) ) The end time of the week and day views. The scheduler will display events ending before the endTime. The hours The minutes The seconds @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .EndTime(10,0,0) .BindTo(Model) ) The start time of the business day. The scheduler will display events starting after the workDayStart when the "Show Business Hours" button is pressed. The workDayStart. @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .WorkDayStart(new DateTime(2013, 6, 13, 10, 00, 00)) .BindTo(Model) ) The start time of the business day. The scheduler will display events starting after the workDayStart when the "Show Business Hours" button is pressed. The hours The minutes The seconds @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .WorkDayStart(10, 0, 0) .BindTo(Model) ) The end time of the business day. The scheduler will display events ending before the workDayEnd when the "Show Business Hours" button is pressed. The workDayEnd. @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .WorkDayEnd(new DateTime(2013, 6, 13, 10, 00, 00)) .BindTo(Model) ) The end time of the business day. The scheduler will display events ending before the workDayEnd when the "Show Business Hours" button is pressed. The hours The minutes The seconds @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .WorkDayEnd(16,0,0) .BindTo(Model) ) The height of the widget. The height. @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Height(600) .BindTo(Model) ) The template used to render the scheduler events. The eventTemplate. @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .StartTime(new DateTime(2013, 6, 13, 10, 00, 00)) .EndTime(new DateTime(2013, 6, 13, 23, 00, 00)) .Height(600) .EventTemplate( "<div style='color:white'>" + "<img src='" + Url.Content("~/Content/web/scheduler/") + "#= Image #' style='float:left'>" + "<p>" + "#: kendo.toString(Start, 'hh:mm') # - #: kendo.toString(End, 'hh:mm') #" + "</p>" + "<h3>#: title #</h3>" + "<a href='#= Imdb #' style='color:white'>Movie in IMDB</a>" + "</div>") .Views(views => { views.DayView(); views.AgendaView(); }) .BindTo(Model) ) The Id of the template used to render the scheduler events. The eventTemplateId @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .StartTime(new DateTime(2013, 6, 13, 10, 00, 00)) .EndTime(new DateTime(2013, 6, 13, 23, 00, 00)) .Height(600) .EventTemplateId("customEventTemplate") .Views(views => { views.DayView(); views.AgendaView(); }) .BindTo(Model) ) The template used to render the "all day" scheduler events. The allDayEventTemplate The Id of the template used to render the "all day" scheduler events. The allDayEventTemplateId If set to true the scheduler will display a slot for "all day" events. The allDaySlot. If set to true day and week views will be initially shown in business hours mode. This options is applicable only to work week, week and day views If set day and week views will be initially shown in business hours mode. This options is applicable only to work week, week and day views If set to true the scheduler will enable the selection The selectable. The template used to render the date header cells. The dateHeaderTemplate The Id of the template used to render the date header cells. The dateHeaderTemplateId @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .StartTime(new DateTime(2013, 6, 13, 10, 00, 00)) .EndTime(new DateTime(2013, 6, 13, 23, 00, 00)) .Height(600) .AllDayEventTemplateId("customAllDayTemplate") .Views(views => { views.DayView(); views.AgendaView(); }) .BindTo(Model) ) The number of minutes represented by a major tick. The majorTick @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Height(600) .MajorTick(120) .BindTo(Model) ) The template used to render the major ticks. The majorTimeHeaderTemplate The Id of the template used to render the major ticks. The majorTimeHeaderTemplateId The number of time slots to display per major tick. The minorTickCount @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Screening>() .Name("scheduler") .Date(new DateTime(2013, 7, 23)) .Height(400) .MinorTickCount(1) .BindTo(Model) ) The template used to render the minor ticks. The minorTimeHeaderTemplate The Id of the template used to render the minor ticks. The minorTimeHeaderTemplateId The timezone which the scheduler will use to display the scheduler appointment dates. By default the current system timezone is used. This is an acceptable default when the scheduler widget is bound to local array of events. It is advisable to specify a timezone if the scheduler is bound to a remote service. That way all users would see the same dates and times no matter their configured system timezone. The complete list of the supported timezones is available in the List of IANA time zones Wikipedia page. The timezone @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Timezone("Europe/London") .Height(600) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) The width of the widget. The width @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Width(800) .Height(600) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) If set to false the events would not snap events to the nearest slot during dragging (resizing or moving). Set it to false to allow free moving and resizing of events. The isSnapable @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Snap(false) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) If set to false the initial binding will be prevented. The autoBind @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .AutoBind(false) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") ) ) Sets the start day of work week by index. The workWeekStartDay @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .WorkWeekStart(2) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") ) ) Sets the end day of work week by index. The workWeekEndDay @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .WorkWeekEnd(2) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") ) ) Sets the editing configuration of the scheduler. The lambda which configures the editing @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Editable(editable => { editable.Confirmation(false); editable.TemplateId("customEditTemplate"); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) If set to false the user would not be able to create new scheduler events and modify or delete existing ones. The isEditable @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Editable(false) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") ) ) Constraints the minimum date which can be selected via the scheduler navigation. The min date Constraints the maximum date which can be selected via the scheduler navigation. The max date Sets the resources grouping configuration of the scheduler. The lambda which configures the scheduler grouping @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Resources(resource => { resource.Add(m => m.TaskID) .Title("Color") .Multiple(true) .DataTextField("Text") .DataValueField("Value") .DataSource(d => d.Read("Attendies", "Scheduler")); }) .DataSource(dataSource => dataSource .Model(m => m.Id(f => f.TaskID)) )) Sets the resources configuration of the scheduler. The lambda which configures the scheduler resources @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Resources(resource => { resource.Add(m => m.TaskID) .Title("Color") .Multiple(true) .DataTextField("Text") .DataValueField("Value") .DataSource(d => d.Read("Attendies", "Scheduler")); }) .DataSource(dataSource => dataSource .Model(m => m.Id(f => f.TaskID)) )) Sets the views configuration of the scheduler. The lambda which configures the scheduler views @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(); views.AgendaView(); }) .BindTo(Model) ) Sets the messages of the scheduler. The lambda which configures the scheduler messages Sets the events configuration of the scheduler. The lambda which configures the scheduler events <%= Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.Remove("remove") ) .BindTo(Model) %> Binds the scheduler to a list of objects The data source. @model IEnumerable<Task> <%@Page Inherits="System.Web.Mvc.ViewPage<IEnumerable<Task>>" %> <: Html.Kendo().Scheduler<Task>() .Name("Scheduler") .BindTo(Model) .DataSource(dataSource => dataSource .Model(m => m.Id(f => f.TaskID)) )> @model IEnumerable<Task> @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .BindTo(Model) .DataSource(dataSource => dataSource .Model(m => m.Id(f => f.TaskID)) )) Configures the DataSource options. The DataSource configurator action. <%= Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(source => { source.Read(read => { read.Action("Read", "Scheduler"); }); }) %> The fluent API for subscribing to Kendo UI Scheduler events. Initializes a new instance of the class. The events. Defines the inline handler of the remove event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.Remove( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the remove event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler() .Name("Scheduler") .Events(events => events.Remove("remove")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the add event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.Add( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the add event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.Add("add")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the edit event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.Edit( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the edit event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.Edit("edit")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the cancel event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.Cancel( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the cancel event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.Cancel("cancel")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the change event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the change event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.Change("change")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the save event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.Save( @<text> function(e) { //event handling code } </text> )) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the name of the JavaScript function that will handle the the save event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.Save("save")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the dataBound event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.DataBound( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the dataBound event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.DataBound("dataBound")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the dataBinding event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.DataBinding( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the dataBinding event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.DataBinding("dataBinding")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the moveStart event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.MoveStart( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the moveStart event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.MoveStart("moveStart")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the move event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.Move( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the move event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.Move("move")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the moveEnd event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.MoveEnd( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the moveEnd event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.MoveEnd("moveEnd")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the resizeStart event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.ResizeStart( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the resizeStart event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.ResizeStart("resizeStart")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the resize event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.Resize( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the resize event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.Resize("resize")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the resizeEnd event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.ResizeEnd( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the resizeEnd event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.ResizeEnd("resizeEnd")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the inline handler of the navigate event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) .Events(events => events.Navigate( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the navigate event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Scheduler<Task>() .Name("Scheduler") .Events(events => events.Navigate("navigate")) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Defines the fluent interface for configuring the . Initializes a new instance of the class. The resource The viewContext The resource The user friendly title of the resource displayed in the scheduler edit form. If not set the value of the field option is used. The title If set to true the scheduler event can be assigned multiple instances of the resource. The scheduler event field specified via the field option will contain an array of resources. By default only one resource instance can be assigned to an event. The isMultiple The name of the resource. Binds the scheduler resource to a list of objects The dataSource @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(); views.AgendaView(); }) .Resources(resource => { resource.Add(m => m.OwnerID) .Title("Owner") .Multiple(true) .DataTextField("Text") .DataValueField("Value") .BindTo(new[] { new { Text = "Alex", Value = 1, color = "red" } , new { Text = "Bob", Value = 1, color = "green" } , new { Text = "Charlie", Value = 1, color = "blue" } }); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) The field of the resource data item which represents the resource value. The resource value is used to link a scheduler event with a resource. The field The field of the resource data item which represents the resource text. The field The field of the resource data item which contains the resource color. The field Set to false if the scheduler event field specified via the field option contains a resource data item. By default the scheduler expects that field to contain a primitive value (string, number) which corresponds to the "value" of the resource (specified via dataValueField). The valuePrimitive Configures the DataSource options. The DataSource configurator action. @(Html.Kendo().Scheduler<Kendo.Mvc.Examples.Models.Scheduler.Task>() .Name("scheduler") .Date(new DateTime(2013, 6, 13)) .Views(views => { views.DayView(); views.AgendaView(); }) .Resources(resource => { resource.Add(m => m.OwnerID) .Title("Owner") .Multiple(true) .DataTextField("Text") .DataValueField("Value") .DataSource(d => d.Read("Attendies", "Scheduler")); }) .DataSource(d => d .Model(m => m.Id(f => f.TaskID)) .Read("Read", "Scheduler") .Create("Create", "Scheduler") .Destroy("Destroy", "Scheduler") .Update("Update", "Scheduler") ) ) Creates resources for the class. Initializes a new instance of the class. The container Defines a Scheduler resource. Creates views for the class. Initializes a new instance of the class. The container. Defines a Scheduler day view. Enables a Scheduler day view. Defines a custom view The JavaScript type name Defines a custom view The JavaScript type name The action for configuring the custom view Defines a Scheduler workWeek view. Enables a Scheduler workWeek view. Defines a Scheduler week view. Enables a Scheduler week view. Defines a Scheduler month view. Enables a Scheduler month view. Defines a Scheduler agenda view. Enables a Scheduler agenda view. The server side wrapper for Kendo UI Scheduler Represents the view types supported by Kendo UI Scheduler for ASP.NET MVC Defines the fluent interface for configuring the SecurityTrimming info. Enables or disables security trimming The Enabled method is useful when you need to enable security trimming based on certain conditions. Enables or disables whether to hide parent item which does not have accessible childrens Defines the fluent API for configuring the Kendo Slider for ASP.NET MVC tooltip Gets or sets the format for displaying the value in the tooltip. The value. <%= Html.Kendo().Slider() .Name("Slider") .Tooltip(tooltip => tooltip.Format("{0:P}")) %> Display tooltip while drag. The value. <%= Html.Kendo().Slider() .Name("Slider") .Tooltip(tooltip => tooltip.Enable(false)) %> Gets or sets the template for displaying the value in the tooltip. The template. <%= Html.Kendo().Slider() .Name("Slider") .Tooltip(tooltip => tooltip.template("${value}")) %> Defines the fluent interface for configuring the . Defines the inline handler of the Change client-side event The action defining the inline handler. <% Html.Kendo().RangeSlider() .Name("RangeSlider") .Events(events => events.Change(() => { %> function(e) { //event handling code } <% })) .Render(); %> Defines the name of the JavaScript function that will handle the the Kendo client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().RangeSlider() .Name("RangeSlider") .Events(events => events.Change("change")) %> Defines the inline handler of the Slide client-side event. The action defining the inline handler. <% Html.Kendo().RangeSlider() .Name("RangeSlider") .Events(events => events.Slide(() => { %> function(e) { //event handling code } <% })) .Render(); %> Defines the name of the JavaScript function that will handle the the Slide client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().RangeSlider() .Name("RangeSlider") .Events(events => events.Slide("slide")) %> Defines the fluent interface for configuring the . Defines the inline handler of the Change client-side event The action defining the inline handler. <% Html.Kendo().Slider() .Name("Slider") .Events(events => events.Change(() => { %> function(e) { //event handling code } <% })) .Render(); %> Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Slider() .Name("Slider") .Events(events => events.Change("change")) %> Defines the inline handler of the Slide client-side event. The action defining the inline handler. <% Html.Kendo().Slider() .Name("Slider") .Events(events => events.Slide(() => { %> function(e) { //event handling code } <% })) .Render(); %> Defines the name of the JavaScript function that will handle the the Slide client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Slider() .Name("Slider") .Events(events => events.Slide("slide")) %> Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Sets the value of the range slider. Sets the value of the range slider. Sets orientation of the range slider. Sets a value indicating how to display the tick marks on the range slider. Sets the minimum value of the range slider. Sets the maximum value of the range slider. Sets the step with which the range slider value will change. Sets the delta with which the value will change when user click on the track. Display tooltip while drag. Use it to configure tooltip while drag. Use builder to set different tooltip options. <%= Html.Kendo().Slider() .Name("Slider") .Tooltip(tooltip => tooltip .Enable(true) .Format("{0:P}") ); %> Configures the client-side events. The client events action. <%= Html.Kendo().RangeSlider() .Name("RangeSlider") .Events(events => events.OnChange("onChange")) %> Sets the title of the slider draghandle. Sets the title of the slider draghandle. Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Sets the value of the slider. Sets the title of the slider draghandle. Sets the title of the slider increase button. Sets whether slider to be rendered with increase/decrease button. Sets the title of the slider decrease button. Sets orientation of the slider. Sets a value indicating how to display the tick marks on the slider. Sets the minimum value of the slider. Sets the maximum value of the slider. Sets the step with which the slider value will change. Sets the delta with which the value will change when user click on the slider. Display tooltip while drag. Use it to configure tooltip. Use builder to set different tooltip options. <%= Html.Kendo().Slider() .Name("Slider") .Tooltip(tooltip => tooltip .Enable(true) .Format("{0:P}") ); %> Configures the client-side events. The client events action. <%= Html.Kendo().Slider() .Name("Slider") .Events(events => events.OnChange("onChange")) %> Specifies the general layout of the slider. The slider is oriented horizontally. The slider is oriented vertically. Specifies the location of tick marks in a component. No tick marks appear in the component. Tick marks are located on the top of a horizontal component or on the left of a vertical component. Tick marks are located on the bottom of a horizontal component or on the right side of a vertical component. Tick marks are located on both sides of the component. Defines the possible series orientation. Line series (default) Area series Bar Series (synonym for Column in sparklines) Column Series Bullet series Pie series Defines the fluent API for configuring the sparkline series defaults. Defines the default settings for bar series. Defines the default settings for column series. Defines the default settings for line series. Defines the default settings for area series. Defines the default settings for pie series. Creates series for the . The type of the data item to which the chart is bound to Initializes a new instance of the class. The container. Defines bound bar series. The expression used to extract the point value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point category from the chart model Defines bound bar series. The expression used to extract the point value from the chart model The expression used to extract the point color from the chart model Defines bound bar series. The name of the value member. The name of the color member. The name of the category member. The name of the note text member. Defines bound bar series. The type of the value member. The name of the value member. The name of the color member. The name of the category member. The name of the note text member. Defines bar series bound to inline data. The data to bind to. Defines bound column series. The expression used to extract the point value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point category from the chart model The expression used to extract the point note text from the chart model Defines bound column series. The expression used to extract the point value from the chart model The expression used to extract the point color from the chart model Defines bound bar series. The name of the value member. The name of the color member. The name of the category member. The name of the note text member. Defines bound bar series. The type of the value member. The name of the value member. The name of the color member. The name of the category member. Defines bar series bound to inline data. The data to bind to Defines bound line series. The expression used to extract the value from the chart model. The expression used to extract the category from the chart model. The expression used to extract the note text from the chart model. Defines bound line series. The expression used to extract the series value from the chart model Defines bound line series. The name of the value member. The name of the category member. Defines bound line series. The type of the value member. The name of the value member. The name of the category member. Defines line series bound to inline data. The data to bind to Defines bound area series. The expression used to extract the value from the chart model. Defines bound area series. The expression used to extract the value from the chart model. The expression used to extract the category from the chart model. The expression used to extract the note text from the chart model. Defines bound area series. The name of the value member. The name of the category member. Defines bound area series. The type of the value member. The name of the value member. The name of the category member. Defines area series bound to inline data. The data to bind to Defines bound pie series. Defines bound pie series. Defines bound pie series. Defines pie series bound to inline data. The data to bind to Defines bound bullet series. The expression used to extract the point current value from the chart model The expression used to extract the point target value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point note text from the chart model Defines bound bullet series. The expression used to extract the point current value from the chart model The expression used to extract the point target value from the chart model The expression used to extract the point color from the chart model The expression used to extract the point note text from the chart model Defines bound bar series. The name of the current value member. The name of the target value member. The name of the color member. The name of the note text member. Defines bound bullet series. The type of the current value member. The name of the target value member. The name of the color member. The name of the note text member. The parent Sparkline Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Sets the Sparkline data. The data for the default Sparkline series. <%= Html.Kendo().Sparkline() .Name("Sparkline") .Data(new int[] { 1, 2 }) %> Sets the Sparkline data. The data for the default Sparkline series. <%= Html.Kendo().Sparkline() .Name("Sparkline") .Data(new int[] { 1, 2 }) %> Sets the type of the sparkline. The Sparkline type. <%= Html.Kendo().Sparkline() .Name("Sparkline") .Type(SparklineType.Area) %> Sets the per-point width of the sparkline. The Sparkline per-point width. <%= Html.Kendo().Sparkline() .Name("Sparkline") .PointWidth(2) %> Configures the client-side events. The client events configuration action. <%= Html.Kendo().Sparkline() .Name("Sparkline") .Events(events => events .OnLoad("onLoad") ) %> Sets the theme of the chart. The Sparkline theme. <%= Html.Kendo().Sparkline() .Name("Sparkline") .Theme("Telerik") %> Sets the preferred rendering engine. If it is not supported by the browser, the Chart will switch to the first available mode. The preferred rendering engine. Sets the Chart area. The Chart area. <%= Html.Kendo().Sparkline() .Name("Sparkline") .ChartArea(chartArea => chartArea.margin(20)) %> Sets the Plot area. The Plot area. <%= Html.Kendo().Sparkline() .Name("Sparkline") .PlotArea(plotArea => plotArea.margin(20)) %> Defines the chart series. The add action. <%= Html.Kendo().Sparkline(Model) .Name("Sparkline") .Series(series => { series.Bar(s => s.SalesAmount); }) %> Defines the options for all chart series of the specified type. The configurator. <%= Html.Kendo().Sparkline(Model) .Name("Sparkline") .SeriesDefaults(series => series.Bar().Stack(true)) %> Defines the options for all chart axes of the specified type. The configurator. <%= Html.Kendo().Sparkline(Model) .Name("Sparkline") .AxisDefaults(axisDefaults => axisDefaults.MinorTickSize(5)) %> Configures the category axis The configurator <%= Html.Kendo().Sparkline(Model) .Name("Sparkline") .CategoryAxis(axis => axis .Categories(s => s.DateString) ) %> Defines value axis options The configurator <%= Html.Kendo().Sparkline(Model) .Name("Sparkline") .ValueAxis(a => a.Numeric().TickSize(4)) %> Data Source configuration Use the configurator to set different data binding options. <%= Html.Kendo().Sparkline() .Name("Sparkline") .DataSource(ds => { ds.Ajax().Read(r => r.Action("SalesData", "Sparkline")); }) %> Enables or disables automatic binding. Gets or sets a value indicating if the chart should be data bound during initialization. The default value is true. <%= Html.Kendo().Sparkline() .Name("Sparkline") .DataSource(ds => { ds.Ajax().Read(r => r.Action("SalesData", "Sparkline")); }) .AutoBind(false) %> Sets the series colors. A list of the series colors. <%= Html.Kendo().Sparkline() .Name("Sparkline") .SeriesColors(new string[] { "#f00", "#0f0", "#00f" }) %> Sets the series colors. The series colors. <%= Html.Kendo().Sparkline() .Name("Sparkline") .SeriesColors("#f00", "#0f0", "#00f") %> Use it to configure the data point tooltip. Use the configurator to set data tooltip options. <%= Html.Kendo().Sparkline() .Name("Sparkline") .Tooltip(tooltip => { tooltip.Visible(true).Format("{0:C}"); }) %> Sets the data point tooltip visibility. A value indicating if the data point tooltip should be displayed. The tooltip is not visible by default. <%= Html.Kendo().Sparkline() .Name("Sparkline") .Tooltip(true) %> Enables or disabled animated transitions on initial load and refresh. A value indicating if transition animations should be played. <%= Html.Kendo().Sparkline() .Name("Sparkline") .Transitions(false) %> Initializes a new instance of the class. The Sparkline component. Creates the chart top-level div. Builds the Sparkline component markup. Gets or sets the default series data Gets or sets the default series type. The default value is SparklineType.Line. The default series type. Gets or sets the width to allocate for each point. The default value is 5. The width to allocate for each point. Sets the pane size. The desired size. Only sizes in pixels and percentages are allowed. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add().Size("220px"); }) %> Sets the minimum pane size. The desired minimum size. Only sizes in pixels and percentages are allowed. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add().MinSize("220px"); }) %> Sets the maximum pane size. The desired maximum size. Only sizes in pixels and percentages are allowed. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add().MaxSize("220px"); }) %> Sets whether the pane shows a scrollbar when its content overflows. Whether the pane will be scrollable. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add().Scrollable(false); }) %> Sets whether the pane can be resized by the user. Whether the pane will be resizable. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add().Resizable(true); }) %> Sets whether the pane is initially collapsed. Whether the pane will be initially collapsed. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add().Collapsed(true); }) %> Sets whether the pane can be collapsed by the user. Whether the pane can be collapsed by the user. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add().Collapsible(true); }) %> Sets the HTML attributes applied to the outer HTML element rendered for the item The attributes. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add().HtmlAttributes(new { style = "background: red" }); }) %> Sets the HTML attributes applied to the outer HTML element rendered for the item The attributes. Sets the HTML content of the pane. The action which renders the HTML content. <% Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add() .Content(() => { >% <p>Content</p> %<}); }) .Render(); %> Sets the HTML content of the pane. The Razor template for the HTML content. @(Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add() .Content(@<p>Content</p>); }) .Render();) Sets the HTML content of the pane. The HTML content. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add() .Content("<p>Content</p>"); }) %> Sets the Url which will be requested to return the pane content. The route values of the Action method. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add() .LoadContentFrom(MVC.Home.Index().GetRouteValueDictionary()); }) %> Sets the Url, which will be requested to return the pane content. The action name. The controller name. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add() .LoadContentFrom("AjaxView_OpenSource", "Splitter"); }) %> Sets the Url, which will be requested to return the content. The action name. The controller name. Route values. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add() .LoadContentFrom("AjaxView_OpenSource", "Splitter", new { id = 10 }); }) %> Sets the Url, which will be requested to return the pane content. The url. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add() .LoadContentFrom(Url.Action("AjaxView_OpenSource", "Splitter")); }) %> Defines the fluent interface for configuring the . Defines the fluent API for configuring the Kendo Splitter for ASP.NET MVC events Defines the inline handler of the Resize client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Splitter() .Name("Splitter") .Events(events => events.Resize( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Resize client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Splitter() .Name("Splitter") .Events(events => events.Resize("onResize")) %> Defines the inline handler of the Expand client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Splitter() .Name("Splitter") .Events(events => events.Expand( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Expand client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Splitter() .Name("Splitter") .Events(events => events.Expand("onExpand")) %> Defines the inline handler of the Collapse client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Splitter() .Name("Splitter") .Events(events => events.Collapse( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Collapse client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Splitter() .Name("Splitter") .Events(events => events.Collapse("onCollapse")) %> Defines the inline handler of the ContentLoad client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Splitter() .Name("Splitter") .Events(events => events.ContentLoad( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the ContentLoad client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Splitter() .Name("Splitter") .Events(events => events.ContentLoad("onContentLoad")) %> Specifies the orientation in which the splitter panes will be ordered Panes are oredered horizontally Panes are oredered vertically Defines the fluent interface for configuring the component. Sets the splitter orientation. The desired orientation. <%= Html.Kendo().Splitter() .Name("Splitter") .Orientation(SplitterOrientation.Vertical) %> Defines the panes in the splitter. The action that configures the panes. <%= Html.Kendo().Splitter() .Name("Splitter") .Panes(panes => { panes.Add().LoadContentFrom("Navigation", "Shared"); panes.Add().LoadContentFrom("Index", "Home"); }) %> Configures the client events for the splitter. The action that configures the client events. <%= Html.Kendo().Splitter() .Name("Splitter") .Events(events => events .OnLoad("onLoad") ) %> Url, which will be used as a destination for the Ajax request. Specifies the size of the pane Specifies the minimum size of the pane Specifies the maximum size of the pane Specifies whether the pane is initially collapsed Specifies whether the pane can be collapsed by the user Specifies whether the pane can be resized by the user Specifies whether the pane shows a scrollbar when its content overflows Specifies URL from which to load the pane content Specifies HTML attributes for the pane Specifies the pane contents Initializes a new instance of the class. The parent widget Gets the navigator series. Gets or sets a value indicating if the navigator is visible. Gets or sets the navigator selection. Gets or sets the navigator hint. Gets or sets the view context to rendering a view. The view context. Gets or sets the URL generator. The URL generator. Gets the data source configuration. Gets or sets a value indicating if the chart should be data bound during initialization. Gets or sets the date field. The date field. Configuration for the navigator category axes Configuration for the navigator pane Initializes a new instance of the class. The lower boundary of the range. The upper boundary of the range. Defines the fluent interface for configuring . Initializes a new instance of the class. The navigator hint. Sets the border color. The border color (CSS format). <%= Html.Kendo().StockChart(Model) .Name("Chart") .Navigator(nav => nav .Series(series => { series.Bar(s => s.SalesAmount); }) .Hint(hint => hint .Format("{0:d} | {1:d}") ) ) %> Sets the border opacity The border opacity (CSS format). <%= Html.Kendo().StockChart(Model) .Name("Chart") .Navigator(nav => nav .Series(series => { series.Bar(s => s.SalesAmount); }) .Hint(hint => hint .Template("From: #= from # To: #= to #") ) ) %> Sets the hint visibility. The hint visibility. <%= Html.Kendo().StockChart(Model) .Name("Chart") .Navigator(nav => nav .Series(series => { series.Bar(s => s.SalesAmount); }) .Hint(hint => hint .Visible(false) ) ) %> Defines the fluent interface for configuring the . Initializes a new instance of the class. The stock chart navigator. Sets the selection range The selection range start. The selection range end. <%= Html.Kendo().StockChart(Model) .Name("StockChart") .Navigator(nav => nav.Select(DateTime.Today.AddMonths(-1), DateTime.Today)) %> Defines the navigator series. At least one series should be configured. The add action. <%= Html.Kendo().StockChart(Model) .Name("Chart") .Navigator(nav => nav.Series(series => { series.Bar(s => s.SalesAmount); }) ) %> Sets the navigator visibility The navigator visibility. <%= Html.Kendo().StockChart(Model) .Name("Chart") .Navigator(nav => nav .Series(series => { series.Bar(s => s.SalesAmount); }) .Visible(false) ) %> Defines the navigator hint. The add action. <%= Html.Kendo().StockChart(Model) .Name("Chart") .Navigator(nav => nav.Series(series => { series.Bar(s => s.SalesAmount); }) ) %> Data Source configuration for the Navigator. When configured, the Navigator will filter the main StockChart data source to the selected range. Use the configurator to set different data binding options. <%= Html.Kendo().StockChart() .Name("Chart") .Navigator(navi => navi .DataSource(ds => { ds.Ajax().Read(r => r.Action("SalesData", "Chart")); }) ) %> Sets the field used by the navigator date axes. The date field. <%= Html.Kendo().StockChart(Model) .Name("Chart") .Navigator(navi => navi .DateField("Date") ) %> Enables or disables automatic binding. Gets or sets a value indicating if the navigator should be data bound during initialization. The default value is true. <%= Html.Kendo().StockChart() .Name("Chart") .Navigator(navi => navi .DataSource(ds => { ds.Ajax().Read(r => r.Action("SalesData", "Chart")); }) .AutoBind(false) ) %> Configures the navigator category axis The configurator Configures the a navigator pane. Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Sets the field used by all date axes (including the navigator). The date field. <%= Html.Kendo().StockChart(Model) .Name("Chart") .DateField("Date") %> Enables or disables automatic binding. Gets or sets a value indicating if the chart should be data bound during initialization. The default value is true. <%= Html.Kendo().StockChart() .Name("Chart") .DataSource(ds => { ds.Ajax().Read(r => r.Action("SalesData", "Chart")); }) .AutoBind(false) %> Configures the stock chart navigator. The navigator configuration action. <%= Html.Kendo().StockChart(Model) .Name("StockChart") .Navigator(nav => nav .Series(series => { series.Line(s => s.Volume); }) ) %> Configures the client-side events. The client events configuration action. <%= Html.Kendo().StockChart() .Name("Chart") .Events(events => events .OnLoad("onLoad") ) %> Sets the theme of the chart. The Chart theme. <%= Html.Kendo().StockChart() .Name("Chart") .Theme("Telerik") %> Sets the preferred rendering engine. If it is not supported by the browser, the Chart will switch to the first available mode. The preferred rendering engine. Sets the Chart area. The Chart area. <%= Html.Kendo().StockChart() .Name("Chart") .ChartArea(chartArea => chartArea.margin(20)) %> Sets the Plot area. The Plot area. <%= Html.Kendo().StockChart() .Name("Chart") .PlotArea(plotArea => plotArea.margin(20)) %> Sets the title of the chart. The Chart title. <%= Html.Kendo().StockChart() .Name("Chart") .Title("Yearly sales") %> Defines the title of the chart. The configuration action. <%= Html.Kendo().StockChart() .Name("Chart") .Title(title => title.Text("Yearly sales")) %> Sets the legend visibility. A value indicating whether to show the legend. <%= Html.Kendo().StockChart() .Name("Chart") .Legend(false) %> Configures the legend. The configuration action. <%= Html.Kendo().StockChart() .Name("Chart") .Legend(legend => legend.Visible(true).Position(ChartLegendPosition.Bottom)) %> Defines the chart series. The add action. <%= Html.Kendo().StockChart(Model) .Name("Chart") .Series(series => { series.Bar(s => s.SalesAmount); }) %> Defines the options for all chart series of the specified type. The configurator. <%= Html.Kendo().StockChart(Model) .Name("Chart") .SeriesDefaults(series => series.Bar().Stack(true)) %> Defines the chart panes. The add action. <%= Html.Kendo().StockChart(Model) .Name("Chart") .Panes(panes => { panes.Add("volume"); }) %> Defines the options for all chart axes of the specified type. The configurator. <%= Html.Kendo().StockChart(Model) .Name("Chart") .AxisDefaults(axisDefaults => axisDefaults.MinorTickSize(5)) %> Configures the category axis The configurator <%= Html.Kendo().StockChart(Model) .Name("Chart") .CategoryAxis(axis => axis .Categories(s => s.DateString) ) %> Defines value axis options The configurator <%= Html.Kendo().StockChart(Model) .Name("Chart") .ValueAxis(a => a.Numeric().TickSize(4)) %> Defines X-axis options for scatter charts The configurator <%= Html.Kendo().StockChart(Model) .Name("Chart") .XAxis(a => a.Numeric().Max(4)) %> Configures Y-axis options for scatter charts. The configurator <%= Html.Kendo().StockChart(Model) .Name("Chart") .YAxis(a => a.Numeric().Max(4)) %> Data Source configuration Use the configurator to set different data binding options. <%= Html.Kendo().StockChart() .Name("Chart") .DataSource(ds => { ds.Ajax().Read(r => r.Action("SalesData", "Chart")); }) %> Sets the series colors. A list of the series colors. <%= Html.Kendo().StockChart() .Name("Chart") .SeriesColors(new string[] { "#f00", "#0f0", "#00f" }) %> Sets the series colors. The series colors. <%= Html.Kendo().StockChart() .Name("Chart") .SeriesColors("#f00", "#0f0", "#00f") %> Use it to configure the data point tooltip. Use the configurator to set data tooltip options. <%= Html.Kendo().StockChart() .Name("Chart") .Tooltip(tooltip => { tooltip.Visible(true).Format("{0:C}"); }) %> Sets the data point tooltip visibility. A value indicating if the data point tooltip should be displayed. The tooltip is not visible by default. <%= Html.Kendo().StockChart() .Name("Chart") .Tooltip(true) %> Enables or disabled animated transitions on initial load and refresh. A value indicating if transition animations should be played. <%= Html.Kendo().StockChart() .Name("Chart") .Transitions(false) %> Initializes a new instance of the class. Gets or sets the hint format. The hint format. Gets or sets the hint template. The hint template. Gets or sets a value indicating if the hint is visible Gets or sets the stock chart navigator settings. The Stock Chart navigator settings. Gets or sets the date field. The date field. Executes the provided delegate for each item. The instance. The action to be applied. index is out of range. Initializes a new instance of the class. The source. Provides extension methods to process DataSourceRequest. Sorts the elements of a sequence using the specified sort descriptors. A sequence of values to sort. The sort descriptors used for sorting. An whose elements are sorted according to a . Pages through the elements of a sequence until the specified using . A sequence of values to page. Index of the page. Size of the page. An whose elements are at the specified . Projects each element of a sequence into a new form. An whose elements are the result of invoking a projection selector on each element of . A sequence of values to project. A projection function to apply to each element. Groups the elements of a sequence according to a specified key selector function. An whose elements to group. A function to extract the key for each element. An with items, whose elements contains a sequence of objects and a key. Sorts the elements of a sequence in ascending order according to a key. An whose elements are sorted according to a key. A sequence of values to order. A function to extract a key from an element. Sorts the elements of a sequence in descending order according to a key. An whose elements are sorted in descending order according to a key. A sequence of values to order. A function to extract a key from an element. Calls or depending on the . The source. The key selector. The sort direction. An whose elements are sorted according to a key. Groups the elements of a sequence according to a specified . An whose elements to group. The group descriptors used for grouping. An with items, whose elements contains a sequence of objects and a key. Calculates the results of given aggregates functions on a sequence of elements. An whose elements will be used for aggregate calculation. The aggregate functions. Collection of s calculated for each function. Filters a sequence of values based on a predicate. An that contains elements from the input sequence that satisfy the condition specified by . An to filter. A function to test each element for a condition. Filters a sequence of values based on a collection of . The source. The filter descriptors. An that contains elements from the input sequence that satisfy the conditions specified by each filter descriptor in . Returns a specified number of contiguous elements from the start of a sequence. An that contains the specified number of elements from the start of . The sequence to return elements from. The number of elements to return. is null. Bypasses a specified number of elements in a sequence and then returns the remaining elements. An that contains elements that occur after the specified index in the input sequence. An to return elements from. The number of elements to skip before returning the remaining elements. is null. Returns the number of elements in a sequence. The number of elements in the input sequence. The that contains the elements to be counted. is null. Returns the element at a specified index in a sequence. The element at the specified position in . An to return an element from. The zero-based index of the element to retrieve. is null. is less than zero. Initializes a new instance of the class. The site maps. Initializes a new instance of the class. Called before an action result executes. The filter context. Called after an action result executes. The filter context. Gets or sets the default view data key. The default view data key. Gets or sets the name of the site map. The name of the site map. Gets or sets the view data key. The view data key. Gets or sets the site maps. The site maps. Initializes a new instance of the class. Performs an implicit conversion from to . The site map. The result of the conversion. Returns a new builder. Resets this instance. Gets or sets the default cache duration in minutes. The default cache duration in minutes. Gets or sets a value indicating whether [default compress]. true if [default compress]; otherwise, false. Gets or sets a value indicating whether [default generate search engine map]. true if [default generate search engine map]; otherwise, false. Gets or sets the root node. The root node. Gets or sets the cache duration in minutes. The cache duration in minutes. Gets or sets a value indicating whether this is compress. true if compress; otherwise, false. Gets or sets a value indicating whether [generate search engine map]. true if [generate search engine map]; otherwise, false. Initializes a new instance of the class. The site map. Performs an implicit conversion from to . The builder. The result of the conversion. Returns the internal sitemap. Caches the duration in minutes. The value. Compresses the specified value. if set to true [value]. Generates the search engine map. if set to true [value]. Gets the root node. The root node. Registers the specified name. The type of the site map. The name. The configure. Adds an item to the . The object to add to the . The is read-only. Adds an element with the provided key and value to the . The object to use as the key of the element to add. The object to use as the value of the element to add. is null. An element with the same key already exists in the . The is read-only. Removes all items from the . The is read-only. Determines whether the contains a specific value. The object to locate in the . true if is found in the ; otherwise, false. Determines whether the contains an element with the specified key. The key to locate in the . true if the contains an element with the key; otherwise, false. is null. Copies the elements of the to an , starting at a particular index. The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. The zero-based index in at which copying begins. is null. is less than 0. is multidimensional. -or- is equal to or greater than the length of . -or- The number of elements in the source is greater than the available space from to the end of the destination . -or- Type cannot be cast automatically to the type of the destination Returns an enumerator that iterates through the collection. A that can be used to iterate through the collection. Removes the first occurrence of a specific object from the . The object to remove from the . true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . The is read-only. Removes the element with the specified key from the . The key of the element to remove. true if the element is successfully removed; otherwise, false. This method also returns false if was not found in the original . is null. The is read-only. Gets the value associated with the specified key. The key whose value to get. When this method returns, the value associated with the specified key, if the key is found; otherwise, the default value for the type of the parameter. This parameter is passed uninitialized. true if the object that implements contains an element with the specified key; otherwise, false. is null. Returns an enumerator that iterates through a collection. An object that can be used to iterate through the collection. Gets or sets the default site map factory. The default site map factory. Gets or sets the default site map. The default site map. Gets the number of elements contained in the . The number of elements contained in the . Gets a value indicating whether the is read-only. true if the is read-only; otherwise, false. Gets an containing the keys of the . An containing the keys of the object that implements . Gets an containing the values in the . An containing the values in the object that implements . Gets or sets the with the specified key. Gets the site maps. The site maps. Initializes a new instance of the class. Performs an implicit conversion from to . The node. The result of the conversion. Gets or sets the title. The title. Gets or sets a value indicating whether this is visible. true if visible; otherwise, false. Gets or sets the last modified at. The last modified at. Gets or sets the name of the route. The name of the route. Gets or sets the name of the controller. The name of the controller. Gets or sets the name of the action. The name of the action. Gets or sets the route values. The route values. Gets or sets the URL. The URL. Gets or sets a value indicating whether [include in search engine index]. true if [include in search engine index]; otherwise, false. Gets or sets the attributes. The attributes. Gets or sets the child nodes. The child nodes. Initializes a new instance of the class. The site map node. Performs an implicit conversion from to . The builder. The result of the conversion. Returns the internal node. Sets the title. The value. Sets the visibility. if set to true [value]. Sets the Lasts the modified date.. The value. Sets the route. Name of the route. The route values. Sets the route. Name of the route. The route values. Sets the route. Name of the route. Sets the action to which the date should navigate The route values of the Action method. Sets the action, controller and route values. Name of the action. Name of the controller. The route values. Sets the action, controller and route values. Name of the action. Name of the controller. The route values. Sets the action and controller. Name of the action. Name of the controller. Expression based controllerAction. The type of the controller. The action. Sets the url. The value. Marks an item that it would be included in the search engine index. if set to true [value]. Sets the attributes The value. Sets the attributes The value. Executes the provided delegate to configure the child node. The add actions. Initializes a new instance of the class. The parent. Adds this instance. Initializes a new instance of the class. Loads from the default path. Loads from the specified path. The relative virtual path. Gets or sets the default path. The default path. Defines the fluent interface for configuring the . Initializes a new instance of the class. The component. Specifies the culture info used by the Calendar widget. <%= Html.Kendo().Calendar() .Name("calendar") .Culture("de-DE") %> Configures the client-side events. The client events action. <%= Html.Kendo().Calendar() .Name("Calendar") .Events(events => events.Select("onSelect") ) %> Sets the date format, which will be used to parse and format the machine date. FooterId to be used for rendering the footer of the Calendar. <%= Html.Kendo().Calendar() .Name("Calendar") .FooterId("widgetFooterId") %> Footer template to be used for rendering the footer of the Calendar. <%= Html.Kendo().Calendar() .Name("Calendar") .Footer("#= kendo.toString(data, "G") #") %> Enable/disable footer. <%= Html.Kendo().Calendar() .Name("Calendar") .Footer(false) %> Specifies the navigation depth. <%= Html.Kendo().Calendar() .Name("Calendar") .Depth(CalendarView.Month) %> Specifies the start view. <%= Html.Kendo().Calendar() .Name("Calendar") .Start(CalendarView.Month) %> MonthTemplateId to be used for rendering the cells of the Calendar. <%= Html.Kendo().Calendar() .Name("Calendar") .MonthTemplateId("widgetMonthTemplateId") %> Templates for the cells rendered in the "month" view. <%= Html.Kendo().Calendar() .Name("Calendar") .MonthTemplate("#= data.value #") %> Configures the content of cells of the Calendar. <%= Html.Kendo().Calendar() .Name("Calendar") .MonthTemplate(month => month.Content("#= data.value #")) %> Sets the minimal date, which can be selected in the calendar. Sets the maximal date, which can be selected in the calendar. Sets the minimal date, which can be selected in the calendar Sets the maximal date, which can be selected in the calendar Sets the value of the calendar Sets the value of the calendar Configures the selection settings of the calendar. SelectAction settings, which includes Action name and IEnumerable of DateTime objects. Defines the fluent interface for configuring delete action command. Initializes a new instance of the class. The command. Defines the fluent interface for configuring the edit action command. Initializes a new instance of the class. The command. Sets the text displayed by the "update" button. If not set a default value is used. The text which should be displayed Sets the text displayed by the "cancel" button. If not set a default value is used. The text which should be displayed Defines the fluent interface for configuring the data key. The type of the model Initializes a new instance of the class. The dataKey. Sets the RouteKey. The value. Creates data key for the . The type of the data item Initializes a new instance of the class. dataKeys Defines a data key. Child items collection. Defines the fluent interface for configuring the component. Sets the initial value of the NumericTextBox. Sets the step, used ti increment/decrement the value of the textbox. Sets the minimal possible value allowed to the user. Sets the maximal possible value allowed to the user. Sets the text which will be displayed if the textbox is empty. Enables or disables the spin buttons. Configures the client-side events. The client events action. <%= Html.Kendo().NumericTextBox() .Name("NumericTextBox") .Events(events => events.OnLoad("onLoad").OnChange("onChange") ) %> Enables or disables the textbox. Stes the format of the NumericTextBox. <%= Html.Kendo().NumericTextBox() .Name("NumericTextBox") .Format("c3") %> Specifies the culture info used by the NumericTextBox widget. <%= Html.Kendo().NumericTextBox() .Name("NumericTextBox") .Culture("de-DE") %> Specifies the number precision. If not set precision defined by current culture is used. <%= Html.Kendo().NumericTextBox() .Name("NumericTextBox") .Decimals(3) %> Sets the title of the NumericTextBox increase button. Sets the title of the NumericTextBox decrease button. Defines the fluent interface for configuring the NumericTextBox events. Defines the inline handler of the Change client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().NumericTextBox() .Name("NumericTextBox") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().NumericTextBox() .Name("NumericTextBox") .Events(events => events.Change("change")) ) Defines the inline handler of the Spin client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().NumericTextBox() .Name("NumericTextBox") .Events(events => events.Spin( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Spin client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().NumericTextBox() .Name("NumericTextBox") .Events(events => events.Spin("spin")) ) Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Sets the value of the timepicker input Sets the minimum time, which can be selected in timepicker Sets the minimum time, which can be selected in timepicker Sets the maximum time, which can be selected in timepicker Sets the maximum time, which can be selected in timepicker Sets the interval between hours. Defines the fluent interface for configuring the . Initializes a new instance of the class. The component. The value of the TimezoneEditor. Must be valid recurrence rule. The value @(Html.Kendo().TimezoneEditor() .Name("timezoneEditor") .Value("Etc/UTC") ) Sets the events configuration of the scheduler. The lambda which configures the timezoneEditor events <%= Html.Kendo().TimezoneEditor() .Name("TimezoneEditor") .Events(events => events.Change("change") ) %> The fluent API for subscribing to Kendo UI TimezoneEditor events. Initializes a new instance of the class. The events. Defines the inline handler of the change event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().TimezoneEditor() .Name("TimezoneEditor") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the change event. The name of the JavaScript function that will handle the event. @(Html.Kendo().TimezoneEditor() .Name("TimezoneEditor") .Events(events => events.Change("change")) ) Defines the fluent interface for configuring tooltip client events. Defines the inline handler of the Show client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Tooltip() .For("#element") .Events(events => events.Show( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Show client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Tooltip() .For("#element") .Events(events => events.Show("show")) ) Defines the inline handler of the Hide client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Tooltip() .For("#element") .Events(events => events.Hide( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Hide client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Tooltip() .For("#element") .Events(events => events.Hide("hide")) ) Defines the inline handler of the ContentLoad client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Tooltip() .For("#element") .Events(events => events.ContentLoad( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the ContentLoad client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Tooltip() .For("#element") .Events(events => events.ContentLoad("contentLoad")) ) Defines the inline handler of the Error client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Tooltip() .For("#element") .Events(events => events.Error( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Error client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Tooltip() .For("#element") .Events(events => events.Error("error")) ) Defines the inline handler of the RequestStart client-side event The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Tooltip() .For("#element") .Events(events => events.RequestStart( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the RequestStart client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Tooltip() .For("#element") .Events(events => events.RequestStart("requestStart")) ) Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. The selector which to match the DOM element to which the Tooltip widget will be instantiated jQuery selector The selector which to match target child elements for which the Tooltip will be shown jQuery selector The position (relative to the target) at which the Tooltip will be shown The position The inverval in milliseconds, after which the Tooltip will be shown Determines if callout should be visible Determines if tooltip should be automatically hidden, or a close button should be present Sets the Url, which will be requested to return the content. The route values of the Action method. <%= Html.Kendo().Tooltip() .For("#element") .LoadContentFrom(MVC.Home.Index().GetRouteValueDictionary()); %> Sets the Url, which will be requested to return the content. The action name. The controller name. <%= Html.Kendo().Tooltip() .For("#element") .LoadContentFrom("AjaxView_OpenSource", "Tooltip") %> Sets the Url, which will be requested to return the content. The action name. The controller name. Route values. <%= Html.Kendo().Tooltip() .For("#element") .LoadContentFrom("AjaxView_OpenSource", "Tooltip", new { id = 10}) %> Sets the Url, which will be requested to return the content. The url. <%= Html.Kendo().Tooltip() .For("#element") .LoadContentFrom(Url.Action("AjaxView_OpenSource", "Tooltip")) %> Sets the HTML content which the tooltip should display as a string. The action which renders the content. <%= Html.Kendo().Tooltip() .For("#element") .Content("<strong> First Item Content</strong>") %> Sets the id of kendo template which will be used as tooltip content. The id of the template <%= Html.Kendo().Tooltip() .For("#element") .Content("template") %> Sets JavaScript function which to return the content for the tooltip. Sets JavaScript function which to return the content for the tooltip. JavaScript function name Configures the animation effects of the window. Whether the component animation is enabled. <%= Html.Kendo().Tooltip() .For("#element") .Animation(false) Configures the animation effects of the panelbar. The action that configures the animation. <%= Html.Kendo().Tooltip() .For("#element") .Animation(animation => animation.Expand) Sets the width of the tooltip. Sets the height of the tooltip. Suppress initialization script rendering. Note that this options should be used in conjunction with Returns the internal view component. Renders the component. Represents the tooltip position Bottom position Top position Left position Right position Center position Defines the fluent interface for configuring child TreeView items. Initializes a new instance of the class. The checkbox settings. Enable/disable rendering of checkboxes in the treeview. Whether checkboxes should be rendered. <%= Html.Kendo().TreeView() .Name("TreeView") .Checkboxes(config => config .Enabled(true) ) %> Enable/disable checking of child checkboxes in the treeview. Whether checking of parent checkboxes should check child checkboxes. <%= Html.Kendo().TreeView() .Name("TreeView") .Checkboxes(config => config .CheckChildren(true) ) %> Client-side template to be used for rendering the items in the treeview. <%= Html.Kendo().TreeView() .Name("TreeView") .Checkboxes(config => config .Template("#= data #") ) %> Id of the element that holds the client-side template to be used for rendering the items in the treeview. <%= Html.Kendo().TreeView() .Name("TreeView") .Checkboxes(config => config .TemplateId("widgetTemplateId") ) %> The name attribute of the checkbox fields. This will correlate to the name of the action method parameter that the nodes are posted to. The string that will be used in the name attribute. <%= Html.Kendo().TreeView() .Name("TreeView") .Checkboxes(config => config .Name("checkedNodes") ) %> Defines the fluent interface for building Initializes a new instance of the class. The settings. Enables or disables binding. <%= Html.Kendo().TreeView() .Name("TreeView") .DataBinding(dataBinding => { dataBinding.Ajax().Select("Index", "Home").Enabled((bool)ViewData["ajax"]); }) %> The Enabled method is useful when you need to enable binding based on certain conditions. Sets the action, controller and route values The route values of the Action method. <%= Html.Kendo().Grid(Model) .Name("Grid") .DataBinding(dataBinding => { dataBinding.Ajax().Select(MVC.Home.Index(1).GetRouteValueDictionary()); }) %> Sets the action, controller and route values for the select operation Name of the action. Name of the controller. The route values. <%= Html.Kendo().TreeView() .Name("TreeView") .DataBinding(dataBinding => { dataBinding.Ajax().Select("Index", "Home", new RouteValueDictionary{ {"id", 1} }); }) %> Sets the action, controller and route values for the select operation Name of the action. Name of the controller. The route values. <%= Html.Kendo().TreeView() .Name("TreeView") .DataBinding(dataBinding => { dataBinding.Ajax().Select("Index", "Home", new { {"id", 1} }); }) %> Sets the action, controller and route values for the select operation Name of the action. Name of the controller. <%= Html.Kendo().TreeView() .Name("TreeView") .DataBinding(dataBinding => { dataBinding.Ajax().Select("Index", "Home"); }) %> Sets the route and values for the select operation Name of the route. The route values. <%= Html.Kendo().TreeView() .Name("TreeView") .DataBinding(dataBinding => { dataBinding.Ajax().Select("Default", "Home", new RouteValueDictionary{ {"id", 1} }); }) %> Sets the route and values for the select operation Name of the route. The route values. <%= Html.Kendo().TreeView() .Name("TreeView") .DataBinding(dataBinding => { dataBinding.Ajax().Select("Default", new {id=1}); }) %> Sets the route name for the select operation Name of the route. <%= Html.Kendo().TreeView() .Name("TreeView") .DataBinding(dataBinding => { dataBinding.Ajax().Select("Default"); }) %> Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Controls whether to bind the widget to the DataSource on initialization. <%= Html.Kendo().TreeView() .Name("TreeView") .AutoBind(false) %> Template to be used for rendering the item checkboxes in the treeview. <%= Html.Kendo().TreeView() .Name("TreeView") .CheckboxTemplate("#= data #") %> Id of the template element to be used for rendering the item checkboxes in the treeview. <%= Html.Kendo().TreeView() .Name("TreeView") .CheckboxTemplateId("widgetTemplateId") %> Template to be used for rendering the items in the treeview. <%= Html.Kendo().TreeView() .Name("TreeView") .Template("#= data #") %> Id of the template element to be used for rendering the items in the treeview. <%= Html.Kendo().TreeView() .Name("TreeView") .TemplateId("widgetTemplateId") %> Enable/disable rendering of checkboxes in the treeview. Whether checkboxes should be rendered. <%= Html.Kendo().TreeView() .Name("TreeView") .Checkboxes(true) %> Configures rendering of checkboxes in the treeview. Builder of the treeview checkboxes configuration. <%= Html.Kendo().TreeView() .Name("TreeView") .Checkboxes(config => config .CheckChildren(true) ) %> Defines the items in the TreeView The add action. <%= Html.Kendo().TreeView() .Name("TreeView") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Configures the client-side events. The client events action. <%= Html.Kendo().TreeView() .Name("TreeView") .Events(events => .OnDataBinding("onDataBinding") .OnItemDataBound("onItemDataBound") ) %> Binds the TreeView to a sitemap The view data key. The action to configure the item. <%= Html.Kendo().TreeView() .Name("TreeView") .BindTo("examples", (item, siteMapNode) => { }) %> Binds the TreeView to a sitemap. The view data key. <%= Html.Kendo().TreeView() .Name("TreeView") .BindTo("examples") %> Binds the TreeView to a list of items. Use if a hierarchy of items is being sent from the controller; to bind the TreeView declaratively, use the Items() method. The list of items <%= Html.Kendo().TreeView() .Name("TreeView") .BindTo(model) %> Binds the TreeView to a list of objects. The TreeView will be "flat" which means a TreeView item will be created for every item in the data source. The type of the data item The data source. The action executed for every data bound item. <%= Html.Kendo().TreeView() .Name("TreeView") .BindTo(new []{"First", "Second"}, (item, value) => { item.Text = value; }) %> Binds the TreeView to a list of objects. The TreeView will create a hierarchy of items using the specified mappings. The type of the data item The data source. The action which will configure the mappings <%= Html.Kendo().TreeView() .Name("TreeView") .BindTo(Model, mapping => mapping .For<Customer>(binding => binding .Children(c => c.Orders) // The "child" items will be bound to the the "Orders" property .ItemDataBound((item, c) => item.Text = c.ContactName) // Map "Customer" properties to TreeViewItem properties ) .For<Order<(binding => binding .Children(o => null) // "Orders" do not have child objects so return "null" .ItemDataBound((item, o) => item.Text = o.OrderID.ToString()) // Map "Order" properties to TreeViewItem properties ) ) %> Callback for each item. Action, which will be executed for each item. <%= Html.Kendo().TreeView() .Name("TreeView") .ItemAction(item => { item .Text(...) .HtmlAttributes(...); }) %> Select item depending on the current URL. If true the item will be highlighted. <%= Html.Kendo().TreeView() .Name("TreeView") .HighlightPath(true) %> Use to enable or disable animation of the TreeView. The boolean value. <%= Html.Kendo().TreeView() .Name("TreeView") .Animation(false) //toggle effect %> Configures the animation effects of the widget. The action which configures the animation effects. <%= Html.Kendo().TreeView() .Name("TreeView") .Animation(animation => { animation.Expand(open => { open.SlideIn(SlideDirection.Down); }); }) %> Expand all the items. If true all the items will be expanded. <%= Html.Kendo().TreeView() .Name("TreeView") .ExpandAll(true) %> Enables drag & drop between treeview nodes. If true, drag & drop is enabled. <%= Html.Kendo().TreeView() .Name("TreeView") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) .DragAndDrop(true) %> Enable/disable security trimming functionality of the component. If true security trimming is enabled. <%= Html.Kendo().TreeView() .Name("TreeView") .SecurityTrimming(false) %> Defines the security trimming functionality of the component The securityTrimming action. <%= Html.Kendo().TreeView() .Name("TreeView") .SecurityTrimming(builder => { builder.Enabled(true).HideParent(true); }) %> Sets the name of the field that will supply the item text. The field name. <%= Html.Kendo().TreeView() .Name("TreeView") .DataTextField("Name") %> Sets the name of the field that will supply the item URL. The field name. <%= Html.Kendo().TreeView() .Name("TreeView") .DataUrlField("LinksTo") %> Sets the name of the field that will supply the CSS class for the item sprite image. The field name. <%= Html.Kendo().TreeView() .Name("TreeView") .DataSpriteCssClassField("IconSprite") %> Sets the name of the field that will supply the URL for the item image. The field name. <%= Html.Kendo().TreeView() .Name("TreeView") .DataImageUrlField("ImageURL") %> Configure the DataSource of the component The action that configures the . <%= Html.Kendo().TreeView() .Name("TreeView") .DataSource(dataSource => dataSource .Read(read => read .Action("Employees", "TreeView") ) ) %> Allows the treeview to fetch the entire datasource at initialization time. Whether the datasource should be loaded on demand. <%= Html.Kendo().TreeView() .Name("TreeView") .LoadOnDemand(false) %> Defines the fluent API for configuring the events of the Kendo TreeView for ASP.NET MVC Defines the inline handler of the collapse client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Collapse( @<text> function(e) { // event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the collapse client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Collapse("onExpand")) %> Defines the inline handler of the dataBound client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.DataBound( @<text> function(e) { // event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the dataBound client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.DataBound("onExpand")) %> Defines the inline handler of the drag client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Drag( @<text> function(e) { // event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the drag client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Drag("onExpand")) %> Defines the inline handler of the dragend client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.DragEnd( @<text> function(e) { // event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the dragend client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.DragEnd("onExpand")) %> Defines the inline handler of the dragstart client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.DragStart( @<text> function(e) { // event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the dragstart client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.DragStart("onExpand")) %> Defines the inline handler of the drop client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Drop( @<text> function(e) { // event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the drop client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Drop("onExpand")) %> Defines the inline handler of the expand client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Expand( @<text> function(e) { // event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the expand client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Expand("onExpand")) %> Defines the inline handler of the select client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Select( @<text> function(e) { // event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the select client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Select("onExpand")) %> Defines the inline handler of the change client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Change( @<text> function(e) { // event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the change client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TreeView() .Name("TreeView") .Events(events => events.Change("onChange")) %> Defines the fluent interface for configuring child TreeView items. Defines the fluent interface for configuring navigation items The type of the item. The type of the builder. Initializes a new instance of the class. The item. Returns the inner navigation item Sets the HTML attributes applied to the outer HTML element rendered for the item The attributes. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Attributes(new {@class="first-item"})) %> Sets the HTML attributes applied to the outer HTML element rendered for the item The attributes. Sets the text displayed by the item. The value. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("First Item")) %> Makes the item visible or not. Invisible items are not rendered in the output HTML. Sets the text displayed by the item. The value. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("First Item").Visible((bool)ViewData["visible"])) %> Enables or disables the item. Disabled item cannot be clicked, expanded or open (depending on the item type - menu, tabstrip, panelbar). <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("First Item").Enabled((bool)ViewData["enabled"])) %> Selects or unselects the item. By default items are not selected. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("First Item").Selected(true)) %> Sets the route to which the item should navigate. Name of the route. The route values. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("First Item").Route("Default", new RouteValueDictionary{{"id", 1}})) %> Sets the route to which the item should navigate. Name of the route. The route values. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("First Item").Route("Default", new {id, 1})) %> Sets the route to which the item should navigate. Name of the route. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("First Item").Route("Default")) %> Sets the action to which the item should navigate The route values of the Action method. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("Index").Action(MVC.Home.Index(3).GetRouteValueDictionary())) %> Sets the action to which the item should navigate Name of the action. Name of the controller. The route values. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("Index").Action("Index", "Home", new RouteValueDictionary{{"id", 1}})) %> Sets the action to which the item should navigate Name of the action. Name of the controller. The route values. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("Index").Action("Index", "Home", new {id, 1})) %> Sets the action to which the item should navigate Name of the action. Name of the controller. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("Index").Action("Index", "Home")) %> Sets the URL to which the item should navigate The value. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("www.example.com").Url("http://www.example.com")) %> Sets the URL of the image that should be displayed by the item. The value. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("First Item").ImageUrl("~/Content/first.png")) %> Sets the HTML attributes for the item image. The attributes. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items .Add().Text("First Item") .ImageUrl("~/Content/first.png") .ImageHtmlAttributes(new {@class="first-item-image"})) %> Sets the HTML attributes for the item image. The attributes. Sets the sprite CSS class names. The CSS classes. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items .Add().Text("First Item") .SpriteCssClasses("icon", "first-item")) %> Sets the HTML content which the item should display. The action which renders the content. <% Html.Kendo().Menu() .Name("Menu") .Items(items => items .Add() .Text("First Item") .Content(() => { %> <strong> First Item Content</strong> <% })) .Render(); %> Sets the HTML content which the item should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().Menu() .Name("Menu") .Items(items => items .Add() .Text("First Item") .Content( @<text> Some text <strong> First Item Content</strong> </text> ); ) ) Sets the HTML content which the item should display as a string. The action which renders the content. <% Html.Kendo().Menu() .Name("Menu") .Items(items => items .Add() .Text("First Item") .Content("<strong> First Item Content</strong>"); ) .Render(); %> Sets the HTML attributes of the content element of the item. The attributes. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items .Add().Text("First Item") .Content(() => { %> <strong>First Item Content</strong> <% }) .ContentHtmlAttributes(new {@class="first-item-content"}) ) %> Sets the HTML attributes of the content element of the item. The attributes. Makes the item navigate to the specified controllerAction method. The type of the controller. The action. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items .Add().Text("First Item") .Action<HomeController>(controller => controller.Index())) %> Sets whether the Text property should be encoded when the item is rendered. Whether the property should be encoded. Default: true. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => items.Add().Text("<strong>First Item</strong>").Encoded(false)) %> Initializes a new instance of the class. The item. Configures the child items of a . The add action. <%= Html.Telerik().TreeView() .Name("TreeView") .Items(items => { items.Add().Text("First Item").Items(firstItemChildren => { firstItemChildren.Add().Text("Child Item 1"); firstItemChildren.Add().Text("Child Item 2"); }); }) %> Sets the id of the item. The id. <%= Html.Telerik().TreeView() .Name("TreeView") .Items(items => items.Add().Id("42")) %> Define when the item will be expanded on intial render. If true the item will be expanded. <%= Html.Telerik().TreeView() .Name("TreeView") .Items(items => { items.Add().Text("First Item").Items(firstItemChildren => { firstItemChildren.Add().Text("Child Item 1"); firstItemChildren.Add().Text("Child Item 2"); }) .Expanded(true); }) %> Specify whether the item should be initially checked. If true, the item will be checked. <%= Html.Telerik().TreeView() .Name("TreeView") .Checkboxes(true) .Items(items => { items.Add().Text("Item").Checked(true); }) %> Sets the expand mode of the treeview item. If true then item will be loaded on demand from client side, if the treeview DataSource is properly configured. <%= Html.Telerik().TreeView() .Name("TreeView") .Items(items => { items.Add().Text("First Item").Items(firstItemChildren => { firstItemChildren.Add().Text("Child Item 1"); firstItemChildren.Add().Text("Child Item 2"); }) .HasChildren(true); }) %> Creates items for the . Initializes a new instance of the class. The settings. Defines a item. Used for serializing objects. Gets the items of the treeview. Gets or sets the item action. Gets or sets the effects. Gets or sets a value indicating whether all the item is expanded. true if expand all is enabled; otherwise, false. The default value is false Represents an item from Kendo TreeView for ASP.NET MVC The HtmlAttributes which will be added to the wrapper of the content. The action which will output the content. Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Specifies a template used to populate aria-label attribute. The string template. <%= Html.Kendo().DatePicker() .Name("DatePicker") .ARIATemplate("Date: #=kendo.toString(data.current, 'd')#") %> FooterId to be used for rendering the footer of the Calendar. <%= Html.Kendo().DatePicker() .Name("DatePicker") .FooterId("widgetFooterId") %> Footer template to be used for rendering the footer of the Calendar. <%= Html.Kendo().DatePicker() .Name("DatePicker") .Footer("#= kendo.toString(data, "G") #") %> Enables/disables footer of the calendar popup. <%= Html.Kendo().DatePicker() .Name("DatePicker") .Footer(false) %> Specifies the navigation depth. <%= Html.Kendo().DatePicker() .Name("DatePicker") .Depth(CalendarView.Month) %> Specifies the start view. <%= Html.Kendo().DatePicker() .Name("DatePicker") .Start(CalendarView.Month) %> MonthTemplateId to be used for rendering the cells of the Calendar. <%= Html.Kendo().DatePicker() .Name("DatePicker") .MonthTemplateId("widgetMonthTemplateId") %> Templates for the cells rendered in the "month" view. <%= Html.Kendo().DatePicker() .Name("DatePicker") .MonthTemplate("#= data.value #") %> Configures the content of cells of the Calendar. <%= Html.Kendo().DatePicker() .Name("DatePicker") .MonthTemplate(month => month.Content("#= data.value #")) %> Sets the minimal date, which can be selected in DatePicker. Sets the maximal date, which can be selected in DatePicker. Sets the Url, which will be requested to return the content. The route values of the Action method. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Items(parent => { parent.Add() .LoadContentFrom(MVC.Home.Index().GetRouteValueDictionary()); }) %> Sets the Url, which will be requested to return the content. The action name. The controller name. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Items(parent => { parent.Add() .Text("Completely Open Source") .LoadContentFrom("AjaxView_OpenSource", "PanelBar"); }) %> Sets the Url, which will be requested to return the content. The action name. The controller name. Route values. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Items(parent => { parent.Add() .Text("Completely Open Source") .LoadContentFrom("AjaxView_OpenSource", "PanelBar", new { id = 10}); }) %> Sets the Url, which will be requested to return the content. The url. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Items(parent => { parent.Add() .Text("Completely Open Source") .LoadContentFrom(Url.Action("AjaxView_OpenSource", "PanelBar")); }) %> Defines the fluent interface for configuring bound columns The type of the data item Initializes a new instance of the class. The column. Gets or sets the format for displaying the data. The value. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderDate).Format("{0:dd/MM/yyyy}")) %> Provides additional view data in the editor template for that column (if any). The additional view data will be provided if the editing mode is set to in-line or in-cell. Otherwise use An anonymous object which contains the additional data <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => { columns.Bound(o => o.Customer).EditorViewData(new { customers = Model.Customers }); }) %> Specify which editor template should be used for the column name of the editor template Enables or disables sorting the column. All bound columns are sortable by default. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderDate).Sortable(false)) %> Enables or disables grouping by that column. All bound columns are groupable by default. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderDate).Groupable(false)) %> Enables or disables filtering the column. All bound columns are filterable by default. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderDate).Filterable(false)) %> Enables or disables HTML encoding the data of the column. All bound columns are encoded by default. <%= Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(o => o.OrderDate).Encoded(false)) %> Sets the template for the column. The action defining the template. <% Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => columns .Add(c => c.CustomerID) .Template(() => { %> >img alt="<%= c.CustomerID %>" src="<%= Url.Content("~/Content/Grid/Customers/" + c.CustomerID + ".jpg") %>" /> <% }).Title("Picture");) .Render(); %> Sets the template for the column. The action defining the template. Sets the client template for the column. The template Sets the client group template for the column. The template Sets the client group footer template for the column. The template Sets the footer template for the column. The action defining the template. Sets the footer template for the column. The action defining the template. Sets the group footer template for the column. The action defining the template. Sets the group footer template for the column. The action defining the template. Sets the group footer template for the column. The action defining the template. Sets the group footer template for the column. The action defining the template. Defines the fluent API for configuring the Kendo Grid for ASP.NET MVC events. Defines the name of the JavaScript function that will handle the the Change client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.Change( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Change client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.Change("gridChange")) ) Defines the name of the JavaScript function that will handle the the Cancel client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.Cancel( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Cancel client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.Cancel("gridCancel")) ) Defines the name of the JavaScript function that will handle the the Edit client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.Edit( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Edit client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.Edit("gridEdit")) ) Defines the name of the JavaScript function that will handle the the Save client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.Save( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Save client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.Save("gridSave")) ) Defines the name of the JavaScript function that will handle the the SaveChanges client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.SaveChanges( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the SaveChanges client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.SaveChanges("gridSaveChanges")) ) Defines the name of the JavaScript function that will handle the the DetailExpand client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.DetailExpand( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the DetailExpand client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.DetailExpand("gridDetailExpand")) ) Defines the name of the JavaScript function that will handle the the DetailInit client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.DetailInit( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the DetailInit client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.DetailInit("gridDetailInit")) ) Defines the name of the JavaScript function that will handle the the DetailCollapse client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.DetailCollapse( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the DetailCollapse client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.DetailCollapse("gridDetailCollapse")) ) Defines the name of the JavaScript function that will handle the the Remove client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.Remove( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the Remove client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.Remove("gridRemove")) ) Defines the name of the JavaScript function that will handle the the DataBound client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.DataBound( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the DataBound client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.DataBound("gridDataBound")) ) Defines the name of the JavaScript function that will handle the the DataBinding client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.DataBinding( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the DataBinding client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.DataBinding("gridDataBinding")) ) Defines the name of the JavaScript function that will handle the the ColumnResize client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.ColumnResize( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the ColumnResize client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.ColumnResize("gridColumnResize")) ) Defines the name of the JavaScript function that will handle the the ColumnReorder client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.ColumnReorder( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the ColumnReorder client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.ColumnReorder("gridColumnReorder")) ) Defines the name of the JavaScript function that will handle the the ColumnHide client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.ColumnHide( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the ColumnHide client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.ColumnHide("gridColumnHide")) ) Defines the name of the JavaScript function that will handle the the ColumnShow client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.ColumnShow( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the the ColumnShow client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.ColumnShow("gridColumnShow")) ) Defines the name of the JavaScript function that will handle the ColumnMenuInit client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.ColumnMenuInit( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the ColumnMenuInit client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.ColumnMenuInit("gridColumnMenuInit")) ) Defines the name of the JavaScript function that will handle the FilterMenuInit client-side event. The handler code wrapped in a text tag (Razor syntax). @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.FilterMenuInit( @<text> function(e) { //event handling code } </text> )) ) Defines the name of the JavaScript function that will handle the FilterMenuInit client-side event. The name of the JavaScript function that will handle the event. @(Html.Kendo().Grid() .Name("Grid") .Events(events => events.FilterMenuInit("gridFilterMenuInit")) ) Represents a cell from Kendo Grid for ASP.NET MVC Defines the fluent interface for configuring the component. Initializes a new instance of the class. The column. Creates command for the . The type of the data item Initializes a new instance of the class. The column. Defines a edit command. Defines a delete command. Defines a select command. Defines a custom command. Defines the fluent interface for configuring . Represents a row from Kendo Grid for ASP.NET MVC Defines the fluent interface for configuring Initializes a new instance of the class. The settings. Enables or disables scrolling. <%= Html.Kendo().Grid(Model) .Name("Grid") .Scrollable(s => s.Enabled((bool)ViewData["enableScrolling"])) %> The Enabled method is useful when you need to enable scrolling based on certain conditions. Sets the height of the scrollable area in pixels. The height in pixels. <%= Html.Kendo().Grid(Model) .Name("Grid") .Scrollable(s => s.Height(400)) %> Sets the height of the scrollable. The height in pixels. <%= Html.Kendo().Grid(Model) .Name("Grid") .Scrollable(s => s.Height("20em")) // use "auto" to remove the default height and make the Grid expand automatically %> Defines the fluent interface for configuring Enables or disables selection. <%= Html.Kendo().Grid(Model) .Name("Grid") .Selectable(selection => selection.Enabled((bool)ViewData["enableSelection"])) %> The Enabled method is useful when you need to enable scrolling based on certain conditions. Specifies whether multiple or single selection is allowed. <%= Html.Kendo().Grid(Model) .Name("Grid") .Selectable(selection => selection.Mode((bool)ViewData["selectionMode"])) %> The Mode method is useful to switch between different selection modes. Specifies whether row or cell selection is allowed. <%= Html.Kendo().Grid(Model) .Name("Grid") .Selectable(selection => selection.Type((bool)ViewData["selectionType"])) %> The Type method is useful to switch between different selection types. Defines the fluent interface for configuring the . Initializes a new instance of the class. The settings. Enables or disables sorting. <%= Html.Kendo().Grid(Model) .Name("Grid") .Sorting(sorting => sorting.Enabled((bool)ViewData["enableSorting"])) %> The Enabled method is useful when you need to enable sorting based on certain conditions. Sets the sort mode of the grid. The value. <%= Html.Kendo().Grid(Model) .Name("Grid") .Sorting(sorting => sorting.SortMode(GridSortMode.MultipleColumns)) %> Enables or disables unsorted mode. The value. <%= Html.Kendo().Grid(Model) .Name("Grid") .Sorting(sorting => sorting.AllowUnsort(true)) %> Specifies the animation duration of item. Fast animation, duration is set to 200. Normal animation, duration is set to 400. Slow animation, duration is set to 600. Defines the sort modes supported by Kendo UI Grid for ASP.NET MVC The user can sort only by one column at the same time. The user can sort by more than one column at the same time. The server side wrapper for Kendo UI Grid Gets the selection configuration Gets the template which the grid will use to render a row Gets the filtering configuration. Gets the column menu configuration. Gets the scrolling configuration. Gets the keyboard navigation configuration. Gets or sets a value indicating whether custom binding is enabled. true if custom binding is enabled; otherwise, false. The default value is false Gets the paging configuration. Gets the columns of the grid. Gets the page size of the grid. Gets the sorting configuration. The sorting. Gets or sets a value indicating whether to add the property of the grid as a prefix in url parameters. true if prefixing is enabled; otherwise, false. The default value is true Gets or sets the action executed when rendering a row. Gets or sets the action executed when rendering a cell. The fluent API for configuring Kendo UI Grid for ASP.NET MVC. Initializes a new instance of the class. The component. Sets the data source configuration of the grid. The lambda which configures the data source @(Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) <%:Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> Sets the server-side detail template of the grid in ASPX views. The template as a code block <%@Page Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>" %> <% Html.Kendo().Grid(Model) .Name("grid") .DetailTemplate(product => { %> Product Details: <div>Product Name: <%: product.ProductName %></div> <div>Units In Stock: <%: product.UnitsInStock %></div> <% }) .Render(); %> Sets the server-side detail template of the grid in Razor views. The template @model IEnumerable<Product> @(Html.Kendo().Grid(Model) .Name("grid") .DetailTemplate(@<text> Product Details: <div>Product Name: @product.ProductName</div> <div>Units In Stock: @product.UnitsInStock</div> </text>) ) Sets the id of the script element which contains the client-side detail template of the grid. The id @(Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ClientDetailTemplateId("detail-template") ) <script id="detail-template" type="text/x-kendo-template"> Product Details: <div>Product Name: #: ProductName # </div> <div>Units In Stock: #: UnitsInStock #</div> </script> <%:Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ClientDetailTemplateId("detail-template") %> <script id="detail-template" type="text/x-kendo-template"> Product Details: <div>Product Name: #: ProductName # </div> <div>Units In Stock: #: UnitsInStock #</div> </script> Sets the server-side row template of the grid in ASPX views. The template as a code block <%@Page Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>" %> <%: Html.Kendo().Grid(Model) .Name("grid") .RowTemplate((product, grid) => { %> <div>Product Name: <%: product.ProductName %></div> <div>Units In Stock: <%: product.UnitsInStock %></div> <% }) %> Sets the server-side row template of the grid in ASPX views. The template as a code block <%@Page Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>" %> <%: Html.Kendo().Grid(Model) .Name("grid") .RowTemplate(product => { %> <div>Product Name: <%: product.ProductName %></div> <div>Units In Stock: <%: product.UnitsInStock %></div> <% }) %> Sets the server-side row template of the grid in Razor views. The template @model IEnumerable<Product> @(Html.Kendo().Grid(Model) .Name("grid") .RowTemplate(@<text> <div>Product Name: @product.ProductName</div> <div>Units In Stock: @product.UnitsInStock</div> </text>) ) Sets the server-side row template of the grid in Razor views. The template @model IEnumerable<Product> @(Html.Kendo().Grid(Model) .Name("grid") .RowTemplate(grid => @<text> <div>Product Name: @product.ProductName</div> <div>Units In Stock: @product.UnitsInStock</div> </text>) ) Sets the client-side row template of the grid. The client-side row template must contain a table row element (tr). The template @(Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ClientRowTemplate( "<tr>" + "<td>#: ProductName #</td>" + "<td>#: UnitsInStock #</td>" + "</tr>" ) ) <%:Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ClientRowTemplate( "<tr>" + "<td>#: ProductName #</td>" + "<td>#: UnitsInStock #</td>" + "</tr>" ) %> Sets the client-side alt row template of the grid. The client-side alt row template must contain a table row element (tr). The template @(Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ClientAltRowTemplate( "<tr class='k-alt'>" + "<td>#: ProductName #</td>" + "<td>#: UnitsInStock #</td>" + "</tr>" ) ) <%:Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ClientAltRowTemplate( "<tr class='k-alt'>" + "<td>#: ProductName #</td>" + "<td>#: UnitsInStock #</td>" + "</tr>" ) %> Sets the client-side row template of the grid. The client-side row template must contain a table row element (tr). The template @(Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ClientRowTemplate(grid => "<tr>" + "<td>#: ProductName #</td>" + "<td>#: UnitsInStock #</td>" + "</tr>" ) ) <%:Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ClientRowTemplate(grid => "<tr>" + "<td>#: ProductName #</td>" + "<td>#: UnitsInStock #</td>" + "</tr>" ) %> If set to false the widget will not bind to the data source during initialization; the default value is true. Setting AutoBind to false is supported in ajax-bound mode. If true the grid will be automatically data bound, otherwise false @(Html.Kendo().Grid<Product>() .Name("grid") .AutoBind(false) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) <%:Html.Kendo().Grid<Product>() .Name("grid") .AutoBind(false) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> Sets the resizing configuration of the grid. The lambda which configures the resizing @(Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .Resizable(resizing => resizing.Columns(true)) ) <%= Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .Resizable(resizing => resizing.Columns(true)) %> Sets the width of the column resize handle. Apply a larger value for easier grasping. width in pixels @(Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ColumnResizeHandleWidth(8) ) <%= Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ColumnResizeHandleWidth(8) %> Sets the reordering configuration of the grid. The lambda which configures the reordering @(Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .Reorderable(reordering => reordering.Columns(true)) ) <%= Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .Reorderable(reordering => reordering.Columns(true)) %> Sets the editing configuration of the grid. The lambda which configures the editing @(Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .Editable(editing => editing.Mode(GridEditMode.PopUp)) ) <%= Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .Editable(editing => editing.Mode(GridEditMode.PopUp)) %> Enables grid editing. @(Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .Editable() ) <%= Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .Editable() %> Sets the toolbar configuration of the grid. The lambda which configures the toolbar @(Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ToolBar(commands => commands.Create()) ) <%= Html.Kendo().Grid<Product>() .Name("Grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ToolBar(commands => commands.Create()) %> Binds the grid to a list of objects The data source. <%@Page Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>" %> &lt;%: Html.Kendo().Grid<Product>() .Name("grid") .BindTo(Model) %> @model IEnumerable<Product> @(Html.Kendo().Grid<Product>() .Name("grid") .BindTo(Model) ) Binds the grid to a list of objects The data source. <%@Page Inherits="System.Web.Mvc.ViewPage<IEnumerable>" %> &lt;%: Html.Kendo().Grid<Product>() .Name("grid") .BindTo(Model) %> @model IEnumerable; @(Html.Kendo().Grid<Product>() .Name("grid") .BindTo(Model) ) Sets a lambda which is executed for every table row rendered server-side by the grid. The lambda which will be executed for every table row <%@Page Inherits="System.Web.Mvc.ViewPage<IEnumerable>" %> &lt;%: Html.Kendo().Grid(Model) .Name("grid") .RowAction(row => { // "DataItem" is the Product instance to which the current row is bound if (row.DataItem.UnitsInStock > 10) { //Set the background of the entire row row.HtmlAttributes["style"] = "background:red;"; } }); %> @model IEnumerable<Product> @(Html.Kendo().Grid(Model) .Name("grid") .RowAction(row => { // "DataItem" is the Product instance to which the current row is bound if (row.DataItem.UnitsInStock > 10) { //Set the background of the entire row row.HtmlAttributes["style"] = "background:red;"; } }); ) Sets a lambda which is executed for every table cell rendered server-side by the grid. The lambda which will be executed for every table cell <%@Page Inherits="System.Web.Mvc.ViewPage<IEnumerable>" %> &lt;%: Html.Kendo().Grid(Model) .Name("grid") .CellAction(cell => { if (cell.Column.Name == "UnitsInStock") { if (cell.DataItem.UnitsInStock > 10) { //Set the background of this cell only cell.HtmlAttributes["style"] = "background:red;"; } } }) %> @model IEnumerable<Product> @(Html.Kendo().Grid(Model) .Name("grid") .CellAction(cell => { if (cell.Column.Name == "UnitsInStock") { if (cell.DataItem.UnitsInStock > 10) { //Set the background of this cell only cell.HtmlAttributes["style"] = "background:red;"; } } }) ) If set to true the grid will perform custom binding. If true enables custom binding. @(Html.Kendo().Grid<Product>() .Name("grid") .EnableCustomBinding(true) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) <%:Html.Kendo().Grid<Product>() .Name("grid") .EnableCustomBinding(true) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> Sets the column configuration of the grid. The lambda which configures columns <%:Html.Kendo().Grid<Product>() .Name("grid") .Columns(columns => { columns.Bound(product => product.ProductName).Title("Product Name"); columns.Command(command => command.Destroy()); }) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Destroy(destroy => destroy.Action("Products_Destroy", "Home")) .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Columns(columns => { columns.Bound(product => product.ProductName).Title("Product Name"); columns.Command(command => command.Destroy()); }) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Destroy(destroy => destroy.Action("Products_Destroy", "Home")) .Read(read => read.Action("Products_Read", "Home")) ) ) Enables grid column sorting. <%:Html.Kendo().Grid<Product>() .Name("grid") .Sortable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Sortable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Sets the sorting configuration of the grid. The lambda which configures the sorting <%:Html.Kendo().Grid<Product>() .Name("grid") .Sortable(sorting => sorting.SortMode(GridSortMode.MultipleColumn)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Sortable(sorting => sorting.SortMode(GridSortMode.MultipleColumn)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Enables grid row selection. <%:Html.Kendo().Grid<Product>() .Name("grid") .Selectable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Selectable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Sets the selection configuration of the grid. The lambda which configures the selection <%:Html.Kendo().Grid<Product>() .Name("grid") .Selectable(selection => selection.Enabled(true)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Selectable(selection => selection.Enabled(true)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) If set to true the grid will prefix the query string parameters with its name during server binding. By default the grid will prefix the query string parameters. <%@Page Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>" %> <%: Html.Kendo().Grid(Model) .Name("grid") .PrefixUrlParameters(false) %> @model IEnumerable<Product> @(Html.Kendo().Grid(Model) .Name("grid") .PrefixUrlParameters(false) ) Enables grid paging. <%:Html.Kendo().Grid<Product>() .Name("grid") .Pageable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Pageable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Sets the paging configuration of the grid. The lambda which configures the paging <%:Html.Kendo().Grid<Product>() .Name("grid") .Pageable(paging => paging.Refresh(true) ) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Pageable(paging => paging.Refresh(true) ) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Enables grid filtering. <%:Html.Kendo().Grid<Product>() .Name("grid") .Filterable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Filterable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Sets the filtering configuration of the grid. The lambda which configures the filtering <%:Html.Kendo().Grid<Product>() .Name("grid") .Filterable(filtering => filtering.Enabled(true)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Filterable(filtering => filtering.Enabled(true)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Enables the grid column menu. <%:Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ColumnMenu() %> @(Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ColumnMenu() ) Sets the column menu configuration of the grid. The lambda which configures the column menu <%:Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ColumnMenu(columnMenu => columnMenu.Enabled(true)) %> @(Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .ColumnMenu(columnMenu => columnMenu.Enabled(true)) ) Enables grid scrolling. <%:Html.Kendo().Grid<Product>() .Name("grid") .Scrollable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Scrollable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Sets the scrolling configuration of the grid. The lambda which configures the scrolling <%:Html.Kendo().Grid<Product>() .Name("grid") .Scrollable(scrolling => scrolling.Enabled(true)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Scrollable(scrolling => scrolling.Enabled(true)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Enables grid keyboard navigation. <%:Html.Kendo().Grid<Product>() .Name("grid") .Navigatable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Navigatable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Sets the keyboard navigation configuration of the grid. The lambda which configures the keyboard navigation <%:Html.Kendo().Grid<Product>() .Name("grid") .Navigatable(navigation => navigation.Enabled(true)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Navigatable(navigation => navigation.Enabled(true)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Sets the event configuration of the grid. The lambda which configures the events <%:Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .Events(events => events.DataBound("grid_dataBound")) %> <script> function grid_dataBound(e) { // handle the dataBound event } </script> @(Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) .Events(events => events.DataBound("grid_dataBound")) ) <script> function grid_dataBound(e) { // handle the dataBound event } </script> Sets the grouping configuration of the grid. The lambda which configures the grouping <%:Html.Kendo().Grid<Product>() .Name("grid") .Groupable(grouping => grouping.Enabled(true)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Groupable(grouping => grouping.Enabled(true)) .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Enables grid grouping. <%:Html.Kendo().Grid<Product>() .Name("grid") .Groupable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) %> @(Html.Kendo().Grid<Product>() .Name("grid") .Groupable() .DataSource(dataSource => // configure the data source dataSource .Ajax() .Read(read => read.Action("Products_Read", "Home")) ) ) Enables the adaptive rendering when viewed on mobile browser Used to determine if adaptive rendering should be used when viewed on mobile browser Currently the Grid widget doesn't distinguish between phone and tablet option. Creates columns for the . The type of the data item to which the grid is bound to Initializes a new instance of the class. The container. Defines a bound column. Defines a bound column. Defines a bound column. Defines a foreign key column. Member type The member which matches the selected item The foreign data The data value field The data text field Defines a foreign key column. Member type The member which matches the selected item The foreign data Determines if columns should be automatically generated. If true columns should be generated, otherwise false. Determines if columns should be automatically generated. Action which will be executed for each generated column. Defines a template column. Defines a command column. Defines the fluent interface for configuring Initializes a new instance of the class. The pager. Sets the page sizes of the grid. The values shown in the pageSize dropdown Sets the page sizes of the grid. A value indicating whether to enable the page sizes dropdown Sets the number of buttons displayed in the numeric pager. Default is 10. The value Enables or disables paging. <%= Html.Kendo().Grid(Model) .Name("Grid") .Pageable(paging => paging.Enabled((bool)ViewData["enablePaging"])) %> The Enabled method is useful when you need to enable paging based on certain conditions. Initializes a new instance of the class. The parent. Adds an item to the . The object to add to the . The is read-only. Removes all items from the . The is read-only. Determines whether the contains a specific value. The object to locate in the . true if is found in the ; otherwise, false. Copies the elements of the to an , starting at a particular index. The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. The zero-based index in at which copying begins. is null. is less than 0. is multidimensional. -or- is equal to or greater than the length of . -or- The number of elements in the source is greater than the available space from to the end of the destination . -or- Type cannot be cast automatically to the type of the destination . Returns an enumerator that iterates through the collection. A that can be used to iterate through the collection. Determines the index of a specific item in the . The object to locate in the . The index of if found in the list; otherwise, -1. Inserts an item to the at the specified index. The zero-based index at which should be inserted. The object to insert into the . is not a valid index in the . The is read-only. Removes the first occurrence of a specific object from the . The object to remove from the . true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . The is read-only. Removes the item at the specified index. The zero-based index of the item to remove. is not a valid index in the . The is read-only. Gets or sets the T object that is the parent of the current node. The parent. Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Defines the items in the menu The add action. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Configures the client-side events. The client events action. <%= Html.Kendo().Menu() .Name("Menu") .Events(events => events.Open("onOpen").OnClose("onClose") ) %> Specifies Menu opening direction. The desired direction. <%= Html.Kendo().Menu() .Name("Menu") .Direction(MenuDirection.Left) %> Specifies Menu opening direction. The desired direction. <%= Html.Kendo().Menu() .Name("Menu") .Direction("top") %> Sets the menu orientation. The desired orientation. <%= Html.Kendo().Menu() .Name("Menu") .Orientation(MenuOrientation.Vertical) %> Enables or disables the "open-on-click" feature. <%= Html.Kendo().Menu() .Name("Menu") .OpenOnClick(true) %> Specifies that sub menus should close after item selection (provided they won't navigate). <%= Html.Kendo().Menu() .Name("Menu") .CloseOnClick(false) %> Specifies the delay in ms before the menu is opened/closed - used to avoid accidental closure on leaving. <%= Html.Kendo().Menu() .Name("Menu") .HoverDelay(300) %> Binds the menu to a sitemap The view data key. The action to configure the item. <%= Html.Kendo().Menu() .Name("Menu") .BindTo("examples", (item, siteMapNode) => { }) %> Binds the menu to a sitemap. The view data key. <%= Html.Kendo().Menu() .Name("Menu") .BindTo("examples") %> Binds the menu to a list of objects. The menu will be "flat" which means a menu item will be created for every item in the data source. The type of the data item The data source. The action executed for every data bound item. <%= Html.Kendo().Menu() .Name("Menu") .BindTo(new []{"First", "Second"}, (item, value) => { item.Text = value; }) %> Binds the menu to a list of objects. The menu will create a hierarchy of items using the specified mappings. The type of the data item The data source. The action which will configure the mappings <%= Html.Kendo().Menu() .Name("Menu") .BindTo(Model, mapping => mapping .For<Customer>(binding => binding .Children(c => c.Orders) // The "child" items will be bound to the the "Orders" property .ItemDataBound((item, c) => item.Text = c.ContactName) // Map "Customer" properties to MenuItem properties ) .For<Order<(binding => binding .Children(o => null) // "Orders" do not have child objects so return "null" .ItemDataBound((item, o) => item.Text = o.OrderID.ToString()) // Map "Order" properties to MenuItem properties ) ) %> Callback for each item. Action, which will be executed for each item. <%= Html.Kendo().Menu() .Name("Menu") .ItemAction(item => { item .Text(...) .HtmlAttributes(...); }) %> Select item depending on the current URL. If true the item will be highlighted. <%= Html.Kendo().Menu() .Name("Menu") .HighlightPath(true) %> Enable/disable security trimming functionality of the component. If true security trimming is enabled. <%= Html.Kendo().Menu() .Name("Menu") .SecurityTrimming(false) %> Defines the security trimming functionality of the component The securityTrimming action. <%= Html.Kendo().Menu() .Name("Menu") .SecurityTrimming(builder => { builder.Enabled(true).HideParent(true); }) %> Represents an item from Kendo Menu for ASP.NET MVC Defines the fluent interface for configuring child menu items. Initializes a new instance of the class. The item. Configures the child items of a . The add action. <%= Html.Kendo().Menu() .Name("Menu") .Items(items => { items.Add().Text("First Item").Items(firstItemChildren => { firstItemChildren.Add().Text("Child Item 1"); firstItemChildren.Add().Text("Child Item 2"); }); }) %> Defines the fluent API for adding items to Kendo Menu for ASP.NET MVC Specifies the orientation in which the menu items will be ordered Items are oredered horizontally Items are oredered vertically Defines the fluent interface for configuring the Menu events. Defines the inline handler of the Open client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Menu() .Name("Menu") .Events(events => events.Open( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Open client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Menu() .Name("Menu") .Events(events => events.Open("onOpen")) %> Defines the inline handler of the Close client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Menu() .Name("Menu") .Events(events => events.Close( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Close client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Menu() .Name("Menu") .Events(events => events.Close("onClose")) %> Defines the inline handler of the Activate client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Menu() .Name("Menu") .Events(events => events.Activate( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Activate client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Menu() .Name("Menu") .Events(events => events.Activate("onActivate")) %> Defines the inline handler of the Deactivate client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Menu() .Name("Menu") .Events(events => events.Deactivate( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Deactivate client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Menu() .Name("Menu") .Events(events => events.Deactivate("onDeactivate")) %> Defines the inline handler of the Select client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Menu() .Name("Menu") .Events(events => events.Select( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Select client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Menu() .Name("Menu") .Events(events => events.Select("onSelect")) %> Sets the action, controller name and route values of object. The object. The route values of the Action method. Sets the action and controller name, along with Route values of object. The object. Action name. Controller name. Route values as an object Sets the action, controller name and route values of object. The object. Action name. Controller name. Route values as Sets the action and route values of object. The object. The controller action. Sets the url property of object. The object. The Url. Sets the route name and route values of object. The object. Route name. Route values as an object. Sets the route name and route values of object. The object. Route name. Route values as . Generating url depending on the ViewContext and the generator. The object. The object The generator. Determines whether the specified navigatable matches the current request URL. The object. The object. The generator. Generating url depending on the ViewContext and the generator. The object. The object The generator. Verify whether the object is accessible. The object. The object. The object Verifies whether collection of objects is accessible. Object of type. The object. The object. The object Determines whether this instance has value. true if either ActionName and ControllerName, RouteName or Url are set; false otherwise Defines the fluent API for creating bindings for Kendo Menu, TreeView and PanelBar Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Defines the items in the panelbar The add action. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Configures the client-side events. The client events action. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.Expand("expand").Collapse("collapse") ) %> Binds the panelbar to a sitemap The view data key. The action to configure the item. <%= Html.Kendo().PanelBar() .Name("PanelBar") .BindTo("examples", (item, siteMapNode) => { }) %> Binds the panelbar to a sitemap. The view data key. <%= Html.Kendo().PanelBar() .Name("PanelBar") .BindTo("examples") %> Binds the panelbar to a list of objects The type of the data item The data source. The action executed for every data bound item. <%= Html.Kendo().PanelBar() .Name("PanelBar") .BindTo(new []{"First", "Second"}, (item, value) => { item.Text = value; }) %> Binds the panelbar to a list of objects. The panelbar will create a hierarchy of items using the specified mappings. The type of the data item The data source. The action which will configure the mappings <%= Html.Kendo().PanelBar() .Name("PanelBar") .BindTo(Model, mapping => mapping .For<Customer>(binding => binding .Children(c => c.Orders) // The "child" items will be bound to the the "Orders" property .ItemDataBound((item, c) => item.Text = c.ContactName) // Map "Customer" properties to PanelBarItem properties ) .For<Order<(binding => binding .Children(o => null) // "Orders" do not have child objects so return "null" .ItemDataBound((item, o) => item.Text = o.OrderID.ToString()) // Map "Order" properties to PanelBarItem properties ) ) %> Configures the animation effects of the panelbar. Whether the component animation is enabled. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Animation(false) Configures the animation effects of the panelbar. The action that configures the animation. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Animation(animation => animation.Expand(config => config.Fade(FadeDirection.In))) Callback for each item. Action, which will be executed for each item. <%= Html.Kendo().PanelBar() .Name("PanelBar") .ItemAction(item => { item .Text(...) .HtmlAttributes(...); }) %> Select item depending on the current URL. If true the item will be highlighted. <%= Html.Kendo().PanelBar() .Name("PanelBar") .HighlightPath(true) %> Renders the panelbar with expanded items. If true the panelbar will be expanded. <%= Html.Kendo().PanelBar() .Name("PanelBar") .ExpandAll(true) %> Sets the expand mode of the panelbar. The desired expand mode. <%= Html.Kendo().PanelBar() .Name("PanelBar") .ExpandMode(PanelBarExpandMode.Multiple) %> Selects the item at the specified index. The index. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) .SelectedIndex(1) %> Enable/disable security trimming functionality of the component. If true security trimming is enabled. <%= Html.Kendo().PanelBar() .Name("PanelBar") .SecurityTrimming(false) %> Defines the security trimming functionality of the component The securityTrimming action. <%= Html.Kendo().PanelBar() .Name("PanelBar") .SecurityTrimming(builder => { builder.Enabled(true).HideParent(true); }) %> Defines the fluent interface for configuring the PanelBar events. Defines the inline handler of the Expand client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.Expand( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Expand client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.Expand("expand")) %> Defines the inline handler of the ContentLoad client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.ContentLoad( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the ContentLoad client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.ContentLoad("contentLoad")) %> Defines the inline handler of the Collapse client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.Collapse( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Collapse client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.Collapse("collapse")) %> Defines the inline handler of the Select client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.Select( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Select client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.Select("select")) %> Defines the inline handler of the Error client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.Error( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Error client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Events(events => events.Error("onError")) %> Specifies the expand mode in which the panelbar will expand its items Only one item can be expanded. All items can be expanded Represents an item from Kendo PanelBar for ASP.NET MVC Defines the fluent interface for configuring child panelbar items. Initializes a new instance of the class. The item. The context of the View. Configures the child items of a . The add action. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Items(items => { items.Add().Text("First Item").Items(firstItemChildren => { firstItemChildren.Add().Text("Child Item 1"); firstItemChildren.Add().Text("Child Item 2"); }); }) %> Define when the item will be expanded on intial render. If true the item will be expanded. <%= Html.Kendo().PanelBar() .Name("PanelBar") .Items(items => { items.Add().Text("First Item").Items(firstItemChildren => { firstItemChildren.Add().Text("Child Item 1"); firstItemChildren.Add().Text("Child Item 2"); }) .Expanded(true); }) %> Defines the fluent API for adding items to Kendo PanelBar for ASP.NET MVC Defines the fluent interface for configuring the TabStrip events. Defines the inline handler of the Activate client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TabStrip() .Name("TabStrip") .Events(events => events.Activate( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Activate client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TabStrip() .Name("TabStrip") .Events(events => events.Activate("onActivate")) %> Defines the inline handler of the Select client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TabStrip() .Name("TabStrip") .Events(events => events.Select( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Select client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TabStrip() .Name("TabStrip") .Events(events => events.Select("onSelect")) %> Defines the inline handler of the ContentLoad client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TabStrip() .Name("TabStrip") .Events(events => events.ContentLoad( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the ContentLoad client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TabStrip() .Name("TabStrip") .Events(events => events.ContentLoad("onContentLoad")) %> Defines the inline handler of the Error client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().TabStrip() .Name("TabStrip") .Events(events => events.Error( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Error client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().TabStrip() .Name("TabStrip") .Events(events => events.Error("onError")) %> Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Defines the items in the tabstrip The add action. <%= Html.Kendo().TabStrip() .Name("TabStrip") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Configures the client-side events. The client events action. <%= Html.Kendo().TabStrip() .Name("TabStrip") .Events(events => events.Select("onSelect").OnLoad("onLoad") ) %> Configures the animation effects of the tabstrip. Whether the component animation is enabled. <%= Html.Kendo().TabStrip() .Name("PanelBar") .Animation(false) Configures the animation effects of the tabstrip. The action that configures the animation. <%= Html.Kendo().TabStrip() .Name("PanelBar") .Animation(animation => animation.Open(config => config.Fade(FadeDirection.In))) Binds the tabstrip to a sitemap The view data key. The action to configure the item. <%= Html.Kendo().TabStrip() .Name("TabStrip") .BindTo("examples", (item, siteMapNode) => { }) %> Binds the tabstrip to a sitemap. The view data key. <%= Html.Kendo().TabStrip() .Name("TabStrip") .BindTo("examples") %> Binds the tabstrip to a list of objects The type of the data item The data source. The action executed for every data bound item. <%= Html.Kendo().TabStrip() .Name("TabStrip") .BindTo(new []{"First", "Second"}, (item, value) => { item.Text = value; }) %> Selects the item at the specified index. The index. <%= Html.Kendo().TabStrip() .Name("TabStrip") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) .SelectedIndex(1) %> Callback for each item. Action, which will be executed for each item. <%= Html.Kendo().TabStrip() .Name("TabStrip") .ItemAction(item => { item .Text(...) .HtmlAttributes(...); }) %> Select item depending on the current URL. If true the item will be highlighted. <%= Html.Kendo().TabStrip() .Name("TabStrip") .HighlightPath(true) %> Enable/disable security trimming functionality of the component. If true security trimming is enabled. <%= Html.Kendo().TabStrip() .Name("TabStrip") .SecurityTrimming(false) %> Represents an item from Kendo TabStrip for ASP.NET MVC Defines the fluent interface for configuring child tabstrip items. Initializes a new instance of the class. The item. The context of the View. Defines the fluent API for adding items to Kendo TabStrip for ASP.NET MVC Active state of items Button with plain text content Button with an icon and text content Button with an icon only Bare button with an icon only (no background and borders) Content - rendered around custom content Default state of items Disabled state of items Group - rendered around grouped items (children) Header - rendered on headers or header items Hovered state of items Icon - icon from default icon set Image - image rendered through ImageUrl Item - rendered on items First in list of items Last in list of items Top in list of items Bottom in list of items Middle in list of items Last in list of headers Link - rendered on all links Reset - removes inherited styles Selected state of items Sprite - sprite rendered in the begging of the item. Widget - rendered always on the outmost HTML element of a UI component Input - input rendered in the div wrapper CheckBox - rendered on all checkbox ToolBar - rendered on all toolbars Alternating class for zebra stripes Scrollable - rendered on all elements that wish to be scrollable on touch devices Contains CSS classes for icons "Delete" icon "Delete Group" icon "Refresh" icon "Maximize" icon "Minimize" icon "Pin" icon "Close" icon "Custom" icon Contains CSS classes, used in the grid Grid action Container element for editing / inserting form Container element for editing / inserting form Toolbar which contains different commands Pager navigation icon Contains CSS classes, used in the treeview Class that shows treeview lines Contains CSS classes, used in the editor Button in editor toolbar Color picker in editor toolbar Editor tool icon Editor custom tool Editor textarea element Slider increase button. Slider decrease button. Horizontal splitter Vertical splitter Splitter pane Contains CSS classes, used in the window Window content area Window title bar Specifies the name of the file The file name <%= Html.Kendo().Upload() .Name("files") .Files(files => files.Add().Name("file.txt").Size(500).Extension(".txt")) .Async(a => a .Save("Save", "Compose") .Remove("Remove", "Compose") .AutoUpload(true) ) %> Specifies the size of the file in bytes The file size <%= Html.Kendo().Upload() .Name("files") .Files(files => files.Add().Name("file.txt").Size(500).Extension(".txt")) .Async(a => a .Save("Save", "Compose") .Remove("Remove", "Compose") .AutoUpload(true) ) %> Specifies the extension of the file The file extension <%= Html.Kendo().Upload() .Name("files") .Files(files => files.Add().Name("file.txt").Size(500).Extension(".txt")) .Async(a => a .Save("Save", "Compose") .Remove("Remove", "Compose") .AutoUpload(true) ) %> A builder class for Initializes a new instance of the class. The messages. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .Retry("retry") ) %> Sets the Cancel button text New cancel button text. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .Cancel("cancel") ) %> Sets the Drag and Drop hint text New Drag and Drop hint text. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .DropFilesHere("drop files here") ) %> Sets the Remove button text New Remove button text. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .Remove("drop files here") ) %> Sets the Retry button text New Retry button text. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .Retry("retry") ) %> Sets the Select button text New Select button text. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .Select("select") ) %> Sets the "failed" status text accessible by screen readers New "failed" status text accessible by screen readers. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .StatusFailed("failed") ) %> Sets the "uploaded" status text accessible by screen readers New "uploaded" status text accessible by screen readers. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .StatusUploaded("uploaded") ) %> Sets the "uploading" status text accessible by screen readers New "uploading" status text accessible by screen readers. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .StatusUploading("uploading") ) %> Sets the "uploading" header status text accessible by screen readers New "header uploading" status text accessible by screen readers. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .HeaderStatusUploading("header uploading") ) %> Sets the "uploaded" header status text accessible by screen readers New "header uploaded" status text accessible by screen readers. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .HeaderStatusUploaded("header uploaded") ) %> Sets Upload button (visible when AutoUpload is set to false) text New Upload button text. <%= Html.Kendo().Upload() .Name("Upload") .Messages(msgs => msgs .UploadSelectedFiles("uploading") ) %> A builder class for Initializes a new instance of the class. The async settings. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save("Save", "Home", new RouteValueDictionary{ {"id", 1} }) ) %> Sets a value indicating whether to start the upload immediately after selecting a file true if the upload should start immediately after selecting a file, false otherwise; true by default Sets a value indicating whether to upload selected files in one batch (request) true if the files should be uploaded in a single request, false otherwise; false by default Sets the action, controller and route values for the save operation Name of the action. Name of the controller. The route values. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save("Save", "Home", new RouteValueDictionary{ {"id", 1} }); ) %> Sets the action, controller and route values for the save operation Name of the action. Name of the controller. The route values. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save("Save", "Home", new { id = 1 }); ) %> Sets the action and controller for the save operation Name of the action. Name of the controller. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save("Save", "Home"); ) %> Sets the route name for the save operation Name of the route. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save("Default"); ) %> Sets the route values for the save operation The route values of the action method. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save(MVC.Home.Save(1).GetRouteValueDictionary()); ) %> Sets the route and values for the save operation Name of the route. The route values. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save("Default", "Home", new RouteValueDictionary{ {"id", 1} }); ) %> Sets the route and values for the save operation Name of the route. The route values. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save("Default", new { id = 1 }); ) %> Sets the action for the save operation The type of the controller. The action. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save<HomeController>(controller => controller.Save()) ) %> Sets the field name for the save operation The form field name to use for submiting the files. The Upload name is used if not set. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .SaveField("attachment"); ) %> Sets an absolute or relative Save action URL. Note that the URL must be in the same domain for the upload to succeed. The Save action URL. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .SaveUrl("/save"); ) %> Sets the action, controller and route values for the remove operation Name of the action. Name of the controller. The route values. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Remove("Remove", "Home", new RouteValueDictionary{ {"id", 1} }); ) %> Sets the action, controller and route values for the remove operation Name of the action. Name of the controller. The route values. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Remove("Remove", "Home", new { id = 1 }); ) %> Sets the action and controller for the remove operation Name of the action. Name of the controller. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Remove("Remove", "Home"); ) %> Sets the route name for the remove operation Name of the route. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Remove("Default"); ) %> Sets the route values for the remove operation The route values of the action method. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Remove(MVC.Home.Remove(1).GetRouteValueDictionary()); ) %> Sets the route and values for the remove operation Name of the route. The route values. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Remove("Default", "Home", new RouteValueDictionary{ {"id", 1} }); ) %> Sets the route and values for the remove operation Name of the route. The route values. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Remove("Default", new { id = 1 }); ) %> Sets the action for the remove operation The type of the controller. The action. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Remove<HomeController>(controller => controller.Remove()) ) %> Sets an absolute or relative Remove action URL. Note that the URL must be in the same domain for the operation to succeed. The Remove action URL. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .RemoveUrl("/remove"); ) %> Sets the field name for the remove operation The form field name to use for submiting the files. "fileNames" is used if not set. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .RemoveField("attachments"); ) %> Defines the fluent interface for configuring the component. Initializes a new instance of the class. The component. Configures the client-side events. The client events configuration action. <%= Html.Kendo().Upload() .Name("Upload") .Events(events => events .Upload("onUpload") ) %> Enables or disables the component. true if the component should be enabled, false otherwise; the default is true. <%= Html.Kendo().Upload() .Name("Upload") .Enable(false) %> Enables or disables multiple file selection. true if multiple file selection should be enabled, false otherwise; the default is true. <%= Html.Kendo().Upload() .Name("Upload") .Multiple(false) %> Sets a value indicating whether to show the list of uploaded files true if the list of uploaded files should be visible, false otherwise; true by default Use it to configure asynchronous uploading. Use builder to set different asynchronous uploading options. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save("Save", "Compose") .Remove("Remove", "Compose") ); %> Use it to configure asynchronous uploading. Use builder to set different asynchronous uploading options. <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save("Save", "Compose") .Remove("Remove", "Compose") ); %> The template element to be used for rendering the files in the list The id of the template @(Html.Kendo().Upload() .Name("files") .TemplateId("fileTemplate") .Async(a => a .Save("Save", "Compose") .Remove("Remove", "Compose") .AutoUpload(true) ) ) <%= Html.Kendo().Upload() .Name("Upload") .TemplateId("fileTemplate") .Async(async => async .Save("Save", "Compose") .Remove("Remove", "Compose") ) %> Sets the initially rendered files The lambda which configures initial files <%= Html.Kendo().Upload() .Name("files") .Files(files => files.Add().Name("file.txt").Size(500).Extension(".txt")) .Async(a => a .Save("Save", "Compose") .Remove("Remove", "Compose") .AutoUpload(true) ) %> @(Html.Kendo().Upload() .Name("files") .Files(files => files.Add().Name("file.txt").Size(500).Extension(".txt")) .Async(a => a .Save("Save", "Compose") .Remove("Remove", "Compose") .AutoUpload(true) ) ) Defines the fluent interface for configuring the Upload events. Initializes a new instance of the class. The client events. Defines the inline handler of the Select client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Upload() .Name("Upload") .Events(events => events.Select( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Select client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Upload() .Name("Upload") .Events(events => events.Select("onSelect")) %> Defines the inline handler of the Upload client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Upload() .Name("Upload") .Events(events => events.Upload( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Upload client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Upload() .Name("Upload") .Events(events => events.Upload("onUpload")) %> Defines the inline handler of the Success client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Upload() .Name("Upload") .Events(events => events.Success( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Success client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Upload() .Name("Upload") .Events(events => events.Success("onSuccess")) %> Defines the inline handler of the Error client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Upload() .Name("Upload") .Events(events => events.Error( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Error client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Upload() .Name("Upload") .Events(events => events.Error("onError")) %> Defines the inline handler of the Complete client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Upload() .Name("Upload") .Events(events => events.Complete( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Complete client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Upload() .Name("Upload") .Events(events => events.Complete("onComplete")) %> Defines the inline handler of the Cancel client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Upload() .Name("Upload") .Events(events => events.Cancel( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Cancel client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Upload() .Name("Upload") .Events(events => events.Cancel("onCancel")) %> Defines the inline handler of the Remove client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Upload() .Name("Upload") .Events(events => events.Remove( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Remove client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Upload() .Name("Upload") .Events(events => events.Remove("onRemove")) %> Defines the inline handler of the Progress client-side event The handler code wrapped in a text tag (Razor syntax). <% Html.Kendo().Upload() .Name("Upload") .Events(events => events.Progress( @<text> function(e) { //event handling code } </text> )) .Render(); %> Defines the name of the JavaScript function that will handle the the Progress client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Upload() .Name("Upload") .Events(events => events.Progress("onProgress")) %> Initializes a new instance of the class. The Upload component. Builds the Upload component markup. Defines the Save action Defines the name of the form field submitted to the Save action. The default value is the Upload name. Defines the Remove action Defines the name of the form field submitted to the Remove action. The default value is "fileNames". Gets or sets a value indicating whether to start the upload immediately after selecting a file Gets or sets a value indicating whether to upload selected files in one batch (request) Initializes a new instance of the class. Serializes the asynchronous uploading settings to the writer. The serialization key. The target dictionary. Defines the Save action Defines the name of the form field submitted to the Save action. The default value is the Upload name. Defines the Remove action Defines the name of the form field submitted to the Remove action. The default value is "removeField". Gets or sets a value indicating whether to start the upload immediately after selecting a file true if the upload should start immediately after selecting a file, false otherwise; true by default Gets or sets a value indicating whether to upload selected files in one batch (request) Initializes a new instance of the class. The view context. The javascript initializer. The URL Generator. Writes the initialization script. The writer object. Writes the Upload HTML. The writer object. Gets or sets a value indicating if the component is enabled. true if the component should be enabled, false otherwise; the default is true. Gets or sets a value indicating if multiple file selection is enabled. true if multiple file selection should be enabled, false otherwise; the default is true. Gets or sets a value indicating whether to show the list of uploaded files true if the list of uploaded files should be visible, false otherwise; true by default Defines the asynchronous uploading settings Gets or sets the URL generator. The URL generator. Gets or sets the Upload messages. The Upload messages. Gets or sets the template Id for the files The template for the files list Gets the initially rendered files Creates the fluent API builders of the Kendo UI widgets Creates a <%= Html.Kendo().Menu() .Name("Menu") .Items(items => { /* add items here */ }); %> Creates a <%= Html.Kendo().Editor() .Name("Editor"); %> Creates a new bound to the specified data item type. The type of the data item <%= Html.Kendo().Grid<Order>() .Name("Grid") .BindTo(Model) %> Creates a new bound to the specified data source. The type of the data item The data source. <%= Html.Kendo().Grid(Model) .Name("Grid") %> Creates a new bound to a DataTable. DataTable from which the grid instance will be bound Creates a new bound to a DataView. DataView from which the grid instance will be bound Creates a new bound an item in ViewData. Type of the data item The data source view data key. <%= Html.Kendo().Grid<Order>("orders") .Name("Grid") %> Creates a new bound to the specified data item type. The type of the data item <%= Html.Kendo().ListView<Order>() .Name("ListView") .BindTo(Model) %> Creates a new bound to the specified data source. The type of the data item The data source. <%= Html.Kendo().ListView(Model) .Name("ListView") %> Creates a new bound an item in ViewData. Type of the data item The data source view data key. <%= Html.Kendo().ListView<Order>("orders") .Name("ListView") %> Creates a new bound to the specified data item type. The type of the data item <%= Html.Kendo().MobileListView<Order>() .Name("MobileListView") .BindTo(Model) %> Creates a new . <%= Html.Kendo().MobileListView() .Name("MobileListView") .Items(items => { items.Add().Text("Item"); items.AddLink().Text("Link Item"); }) %> Creates a new bound to the specified data source. The type of the data item The data source. <%= Html.Kendo().MobileListView(Model) .Name("MobileListView") %> Creates a new bound an item in ViewData. Type of the data item The data source view data key. <%= Html.Kendo().MobileListView<Order>("orders") .Name("MobileListView") %> Creates a <%= Html.Kendo().Splitter() .Name("Splitter"); %> Creates a new . <%= Html.Kendo().TabStrip() .Name("TabStrip") .Items(items => { items.Add().Text("First"); items.Add().Text("Second"); }) %> Creates a new . <%= Html.Kendo().DateTimePicker() .Name("DateTimePicker") %> Creates a new . <%= Html.Kendo().DatePicker() .Name("DatePicker") %> Creates a new . <%= Html.Kendo().TimePicker() .Name("TimePicker") %> Creates a new . <%= Html.Kendo().Barcode() .For("Container") %> Creates a new . <%= Html.Kendo().Tooltip() .For("Container") %> Creates a new . <%= Html.Kendo().ColorPicker() .Name("ColorPicker") %> Creates a new . <%= Html.Kendo().ColorPalette() .Name("ColorPalette") %> Creates a new . <%= Html.Kendo().FlatColorPicker() .Name("FlatColorPicker") %> Creates a new . <%= Html.Kendo().Calendar() .Name("Calendar") %> Creates a new . <%= Html.Kendo().PanelBar() .Name("PanelBar") .Items(items => { items.Add().Text("First"); items.Add().Text("Second"); }) %> Creates a new . <%= Html.Kendo().RecurrenceEditor() .Name("recurrenceEditor") .FirstWeekDay(0) .Timezone("Etc/UTC") %> Creates a new . <%= Html.Kendo().TimezoneEditor() .Name("timezoneEditor") .Value("Etc/UTC") %> Creates a new . <%= Html.Kendo().Scheduler() .Name("Scheduler") %> Creates a <%= Html.Kendo().TreeView() .Name("TreeView") .Items(items => { /* add items here */ }); %> Creates a new . <%= Html.Kendo().NumericTextBox() .Name("NumericTextBox") %> Creates a new . <%= Html.Kendo().NumericTextBox<double>() .Name("NumericTextBox") %> Creates a new . <%= Html.Kendo().CurrencyTextBox() .Name("CurrencyTextBox") %> Creates a new . <%= Html.Kendo().PercentTextBox() .Name("PercentTextBox") %> Creates a new . <%= Html.Kendo().IntegerTextBox() .Name("IntegerTextBox") %> Creates a new . <%= Html.Kendo().Window() .Name("Window") %> Creates a new . <%= Html.Kendo().LinearGauge() .Name("linearGauge") %> Creates a new . <%= Html.Kendo().RadialGauge() .Name("radialGauge") %> Creates a new . <%= Html.Kendo().DropDownList() .Name("DropDownList") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Creates a new . <%= Html.Kendo().ComboBox() .Name("ComboBox") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Creates a new . <%= Html.Kendo().AutoComplete() .Name("AutoComplete") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Creates a new . <%= Html.Kendo().MultiSelect() .Name("MultiSelect") .Items(items => { items.Add().Text("First Item"); items.Add().Text("Second Item"); }) %> Creates a new . <%= Html.Kendo().Slider() .Name("Slider") %> Creates a new . <%= Html.Kendo().Slider() .Name("Slider") %> Creates a new . <%= Html.Kendo().RangeSlider() .Name("RangeSlider") %> Creates a new . <%= Html.Kendo().RangeSlider() .Name("RangeSlider") %> Creates a new <%= Html.Kendo().ProgressBar() .Name("progressBar") %> Creates a <%= Html.Kendo().Upload() .Name("Upload") .Async(async => async .Save("ProcessAttachments", "Home") .Remove("RemoveAttachment", "Home") ) %> Creates a <%= Html.Kendo().Button() .Name("Button1"); %> Creates a <%= Html.Kendo().Chart() .Name("Chart") %> Creates a new bound to the specified data source. The type of the data item The data source. <%= Html.Kendo().Chart(Model) .Name("Chart") %> Creates a new bound an item in ViewData. Type of the data item The data source view data key. <%= Html.Kendo().Chart<SalesData>("sales") .Name("Chart") %> Creates a new unbound . <%= Html.Kendo().Chart() .Name("Chart") .Series(series => { series.Bar(new int[] { 1, 2, 3 }).Name("Total Sales"); }) %> Creates a <%= Html.Kendo().StockChart() .Name("StockChart") %> Creates a new bound to the specified data source. The type of the data item The data source. <%= Html.Kendo().StockChart(Model) .Name("StockChart") %> Creates a new bound an item in ViewData. Type of the data item The data source view data key. <%= Html.Kendo().StockChart<SalesData>("sales") .Name("StockChart") %> Creates a new unbound . <%= Html.Kendo().StockChart() .Name("StockChart") .Series(series => { series.Bar(new int[] { 1, 2, 3 }).Name("Total Sales"); }) %> Creates a <%= Html.Kendo().Sparkline() .Name("Sparkline") %> Creates a new bound to the specified data source. The type of the data item The data source. <%= Html.Kendo().Sparkline(Model) .Name("Sparkline") %> Creates a new bound an item in ViewData. Type of the data item The data source view data key. <%= Html.Kendo().Sparkline<SalesData>("sales") .Name("Sparkline") %> Creates a new unbound . <%= Html.Kendo().Sparkline() .Name("Sparkline") .Series(series => { series.Bar(new int[] { 1, 2, 3 }).Name("Total Sales"); }) %> Creates a <%= Html.Kendo().QRCode() .Name("qrCode") .Value("Hello World") %> Returns the initialization scripts for widgets set as deferred Determines if the script should be rendered within a script tag Returns the initialization scripts for the specified widget. The name of the widget. Determines if the script should be rendered within a script tag Creates a <%= Html.Kendo().Map() .Name("Map") %> Creates a <%= Html.Kendo().MobileActionSheet() .Name("MobileActionSheet") %> Creates a <%= Html.Kendo().MobileApplication() .Name("MobileApplication") %> Creates a <%= Html.Kendo().MobileBackButton() .Name("MobileBackButton") %> Creates a <%= Html.Kendo().MobileButton() .Name("MobileButton") %> Creates a <%= Html.Kendo().MobileButtonGroup() .Name("MobileButtonGroup") %> Creates a <%= Html.Kendo().MobileDetailButton() .Name("MobileDetailButton") %> Creates a <%= Html.Kendo().MobileDrawer() .Name("MobileDrawer") %> Creates a <%= Html.Kendo().MobileLayout() .Name("MobileLayout") %> Creates a <%= Html.Kendo().MobileModalView() .Name("MobileModalView") %> Creates a <%= Html.Kendo().MobileNavBar() .Name("MobileNavBar") %> Creates a <%= Html.Kendo().MobilePopOver() .Name("MobilePopOver") %> Creates a <%= Html.Kendo().MobileScrollView() .Name("MobileScrollView") %> Creates a <%= Html.Kendo().MobileSplitView() .Name("MobileSplitView") %> Creates a <%= Html.Kendo().MobileSwitch() .Name("MobileSwitch") %> Creates a <%= Html.Kendo().MobileTabStrip() .Name("MobileTabStrip") %> Creates a <%= Html.Kendo().MobileView() .Name("MobileView") %> Creates a new UI component. Creates a new . <%= Html.Kendo().NumericTextBoxFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().NumericTextBoxFor(m=>m.NullableProperty) %> Creates a new . <%= Html.Kendo().IntegerTextBoxFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().IntegerTextBoxFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().CurrencyTextBoxFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().CurrencyTextBoxFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().PercentTextBoxFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().PercentTextBoxFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().DateTimePickerFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().DateTimePickerFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().ColorPickerFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().DatePickerFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().DatePickerFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().TimePickerFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().TimePickerFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().TimePickerFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().TimePickerFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().DropDownListFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().ComboBoxFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().AutoCompleteFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().MultiSelectFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().SliderFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().SliderFor(m=>m.NullableProperty) %> Creates a new . <%= Html.Kendo().SliderFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().SliderFor(m=>m.NullableProperty) %> Creates a new . <%= Html.Kendo().RangeSliderFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().RangeSliderFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().LinearGaugeFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().LinearGaugeFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().RadialGaugeFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().RadialGaugeFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().RecurrenceEditorFor(m=>m.Property) %> Creates a new . <%= Html.Kendo().TimezoneEditorFor(m=>m.Property) %> Defines the fluent API for configuring the Kendo Window position settings Sets the top position. Sets the left position. Defines the fluent interface for configuring the . Initializes a new instance of the class. The instance that is to be configured Configures the window to show a close button. <%= Html.Kendo().Window() .Name("Window") .Actions(actions => actions.Close()) %> Configures the window to show a maximize button. <%= Html.Kendo().Window() .Name("Window") .Actions(actions => actions.Maximize()) %> Configures the window to show a minimize button. <%= Html.Kendo().Window() .Name("Window") .Actions(actions => actions.Maximize()) %> Configures the window to show a refresh button. <%= Html.Kendo().Window() .Name("Window") .Actions(actions => actions.Refresh()) %> Configures the window to show a pin button. <%= Html.Kendo().Window() .Name("Window") .Actions(actions => actions.Pin()) %> Configures the window to show a refresh button. <%= Html.Kendo().Window() .Name("Window") .Actions(actions => actions.Custom("menu")) %> Configures the window to show no buttons in its titlebar. <%= Html.Kendo().Window() .Name("Window") .Actions(actions => actions.Clear()) %> Defines the fluent API for configuring the Kendo Window resizing settings Defines the fluent interface for configuring the Window events. Defines the name of the JavaScript function that will handle the the Open client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Open("onOpen")) %> Defines the name of the JavaScript function that will handle the the Open client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Open("onOpen")) %> Defines the name of the JavaScript function that will handle the the Activate client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Activate("onActivate")) %> Defines the name of the JavaScript function that will handle the the Activate client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Activate("onActivate")) %> Defines the name of the JavaScript function that will handle the the Deactivate client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Deactivate("onDeactivate")) %> Defines the name of the JavaScript function that will handle the the Deactivate client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Deactivate("onDeactivate")) %> Defines the name of the JavaScript function that will handle the the Close client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Close("onClose")) %> Defines the name of the JavaScript function that will handle the the Close client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Close("onClose")) %> Defines the name of the JavaScript function that will handle the the DragStart client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.DragStart("onDragStart")) %> Defines the name of the JavaScript function that will handle the the DragStart client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.DragStart("onDragStart")) %> Defines the name of the JavaScript function that will handle the the DragEnd client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.DragEnd("onDragEnd")) %> Defines the name of the JavaScript function that will handle the the DragEnd client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.DragEnd("onDragEnd")) %> Defines the name of the JavaScript function that will handle the the Resize client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Resize("onResize")) %> Defines the name of the JavaScript function that will handle the the Resize client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Resize("onResize")) %> Defines the name of the JavaScript function that will handle the the Refresh client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Refresh("onRefresh")) %> Defines the name of the JavaScript function that will handle the the Refresh client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Refresh("onRefresh")) %> Defines the name of the JavaScript function that will handle the the Error client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Error("onError")) %> Defines the name of the JavaScript function that will handle the the Error client-side event. The name of the JavaScript function that will handle the event. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Error("onError")) %> Defines the fluent interface for configuring the component. Allows title to be shown / hidden Whether the window title will be visible Sets title, which appears in the header of the window. Defines a selector for the element to which the Window will be appended. By default this is the page body. A selector of the Window container Sets the HTML content which the window should display. The action which renders the content. <% Html.Kendo().Window() .Name("Window") .Content(() => { %> <strong>Window content</strong> <% }) %> Sets the HTML content which the window should display The Razor inline template @(Html.Kendo().Window() .Name("Window") .Content(@<strong> Hello World!</strong>)) Sets the HTML content which the item should display as a string. The action which renders the content. <%= Html.Kendo().Window() .Name("Window") .Content("<strong> First Item Content</strong>") %> Sets the Url, which will be requested to return the content. The route values of the Action method. <%= Html.Kendo().Window() .Name("Window") .LoadContentFrom(MVC.Home.Index().GetRouteValueDictionary()); %> Sets the Url, which will be requested to return the content. The action name. The controller name. <%= Html.Kendo().Window() .Name("Window") .LoadContentFrom("AjaxView_OpenSource", "Window") %> Sets the Url, which will be requested to return the content. The action name. The controller name. Route values. <%= Html.Kendo().Window() .Name("Window") .LoadContentFrom("AjaxView_OpenSource", "Window", new { id = 10}) %> Sets the Url, which will be requested to return the content. The url. <%= Html.Kendo().Window() .Name("Window") .LoadContentFrom(Url.Action("AjaxView_OpenSource", "Window")) %> Configures the client-side events. The client events action. <%= Html.Kendo().Window() .Name("Window") .Events(events => events.Open("onOpen").Close("onClose") ) %> Enables windows resizing. <%= Html.Kendo().Window() .Name("Window") .Resizable() %> Configures the resizing ability of the window. Resizing settings action. <%= Html.Kendo().Window() .Name("Window") .Resizable(settings => settings.Enabled(true).MaxHeight(500).MaxWidth(500) ) %> Configures the window buttons. The buttons configuration action. <%= Html.Kendo().Window() .Name("Window") .Actions(actions => actions.Close() ) %> Sets the width of the window. Sets the height of the window. Configures the position of the window. Position settings action. <%= Html.Kendo().Window() .Name("Window") .Position(settings => settings.Top(100).Left(100) ) %> Sets whether the window should be rendered visible. Sets whether the window should have scrollbars. Configures the animation effects of the window. Whether the component animation is enabled. <%= Html.Kendo().Window() .Name("Window") .Animation(false) Configures the animation effects of the panelbar. The action that configures the animation. <%= Html.Kendo().Window() .Name("Window") .Animation(animation => animation.Expand) Sets whether the window should be modal or not. Sets whether the window can be moved. Sets whether the window can be moved. Sets whether the window is pinned. Sets whether the window automatically gains focus when opened. Sets whether the window is pinned. Explicitly specifies whether the loaded window content will be rendered as an iframe or in-line Returns the physical path for the specified virtual path. The virtual path. Merges the specified instance. The instance. The key. The value. if set to true [replace existing]. Appends the in value. The instance. The key. The separator. The value. Appends the specified value at the beginning of the existing value Toes the attribute string. The instance. Merges the specified instance. The instance. From. if set to true [replace existing]. Merges the specified instance. The instance. From. Merges the specified instance. The instance. The values. if set to true [replace existing]. Merges the specified instance. The instance. The values. Requests the context. The instance. Gets a value indicating whether we're running under Mono. true if Mono; otherwise, false. Gets a value indicating whether we're running under Linux or a Unix variant. true if Linux/Unix; otherwise, false. Returns the physical path for the specified virtual path. The virtual path. Starts thread safe read write code block. The instance. Starts thread safe read code block. The instance. Starts thread safe write code block. The instance. Replaces the format item in a specified System.String with the text equivalent of the value of a corresponding System.Object instance in a specified array. A string to format. An System.Object array containing zero or more objects to format. A copy of format in which the format items have been replaced by the System.String equivalent of the corresponding instances of System.Object in args. Determines whether this instance and another specified System.String object have the same value. The string to check equality. The comparing with string. true if the value of the comparing parameter is the same as this string; otherwise, false. Determines whether this instance and another specified System.String object have the same value. The string to check equality. The comparing with string. true if the value of the comparing parameter is the same as this string; otherwise, false. A strongly-typed resource class, for looking up localized strings, etc. Returns the cached ResourceManager instance used by this class. Overrides the current thread's CurrentUICulture property for all resource lookups using this strongly typed resource class. Looks up a localized string similar to "{0}" array cannot be empty.. Looks up a localized string similar to You must use InCell edit mode for batch updates.. Looks up a localized string similar to The Update data binding setting is required for batch updates. Please specify the Update action or url in the DataBinding configuration.. Looks up a localized string similar to "{0}" cannot be negative.. Looks up a localized string similar to "{0}" cannot be negative or zero.. Looks up a localized string similar to "{0}" cannot be null.. Looks up a localized string similar to "{0}" cannot be null or empty.. Looks up a localized string similar to Cannot find a public property of primitive type to sort by.. Looks up a localized string similar to Cannot have more one column in order when sort mode is set to single column.. Looks up a localized string similar to Cannot route to class named 'Controller'.. Looks up a localized string similar to Cannot set AutoBind if widget is populated during initialization. Looks up a localized string similar to Cannot use Ajax and WebService binding at the same time.. Looks up a localized string similar to Cannot use PushState with server navigation.. Looks up a localized string similar to Cannot use only server templates in Ajax or WebService binding mode. Please specify a client template as well.. Looks up a localized string similar to Cannot use Virtual Scroll with Server binding.. Looks up a localized string similar to "{0}" collection cannot be empty.. Looks up a localized string similar to Multiple types were found that match the controller named '{0}'. This can happen if the route that services this request does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter. The request for '{0}' has found the following matching controllers:{1}. Looks up a localized string similar to Multiple types were found that match the controller named '{0}'. This can happen if the route that services this request ('{1}') does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter. The request for '{0}' has found the following matching controllers:{2}. Looks up a localized string similar to Controller name must end with 'Controller'.. Looks up a localized string similar to Custom command routes is available only for server binding.. Looks up a localized string similar to There is no DataSource Model Id property specified.. Looks up a localized string similar to DataTable InLine editing and custom EditorTemplate per column is not supported. Looks up a localized string similar to You must specify TemplateName when PopUp edit mode is enabled with DataTable binding. Looks up a localized string similar to The Delete data binding setting is required by the delete command. Please specify the Delete action or url in the DataBinding configuration.. Looks up a localized string similar to The Update data binding setting is required by the edit command. Please specify the Update action or url in the DataBinding configuration.. Looks up a localized string similar to {0} should not be bigger then {1}.. Looks up a localized string similar to Group with specified name already exists.. Looks up a localized string similar to Group with specified name "{0}" already exists. Please specify a different name.. Looks up a localized string similar to Group with "{0}" does not exist in {1} SharedWebAssets.. Looks up a localized string similar to Group with specified name "{0}" does not exist. Please make sure you have specified a correct name.. Looks up a localized string similar to InCell editing mode is not supported in server binding mode. Looks up a localized string similar to InCell editing mode is not supported when ClientRowTemplate is used. Looks up a localized string similar to Provided index is out of range.. Looks up a localized string similar to The Insert data binding setting is required by the insert command. Please specify the Insert action or url in the DataBinding configuration.. Looks up a localized string similar to Item with specified source already exists.. Looks up a localized string similar to Local group with name "{0}" already exists.. Looks up a localized string similar to The key with the following name "{0}" was not found. Please update all localization files.. Looks up a localized string similar to Bound columns require a field or property access expression.. Looks up a localized string similar to {0} should be less than {1}.. Looks up a localized string similar to Name cannot be blank.. Looks up a localized string similar to Name cannot contain spaces.. Looks up a localized string similar to "None" is only used for internal purpose.. Looks up a localized string similar to Only one ScriptRegistrar is allowed in a single request.. Looks up a localized string similar to Only one StyleSheetRegistrar is allowed in a single request.. Looks up a localized string similar to Only property and field expressions are supported. Looks up a localized string similar to of {0}. Looks up a localized string similar to Paging must be enabled to use PageOnScroll.. Looks up a localized string similar to The {0} must be bigger then 0.. Looks up a localized string similar to {0} must be positive number.. Looks up a localized string similar to {0} should be bigger than {1} and less then {2}. Looks up a localized string similar to The "{0}" class is no longer supported. To enable RTL support you must include telerik.rtl.css and apply the "t-rtl" class to a parent HTML element or the <body>.. Looks up a localized string similar to Scrolling must be enabled to use PageOnScroll.. Looks up a localized string similar to You must have SiteMap defined with key "{0}" in ViewData dictionary.. Looks up a localized string similar to Source must be a virtual path which should starts with "~/". Looks up a localized string similar to Specified file does not exist: "{0}".. Looks up a localized string similar to Passed string cannot be parsed to DateTime object.. Looks up a localized string similar to Passed string cannot be parsed to TimeSpan object.. Looks up a localized string similar to The specified method is not an action method.. Looks up a localized string similar to Time should be bigger than MinTime and less than MaxTime.. Looks up a localized string similar to You should set Tooltip container. Tooltip.For(container). Looks up a localized string similar to You cannot set Url and ContentUrl at the same time.. Looks up a localized string similar to The value '{0}' is invalid.. Looks up a localized string similar to The Url of the WebService must be set. Looks up a localized string similar to You cannot add more than once column when sort mode is set to single column.. Looks up a localized string similar to You cannot use non generic BindTo overload without EnableCustomBinding set to true. Looks up a localized string similar to You cannot call render more than once.. Looks up a localized string similar to You cannot call Start more than once.. Looks up a localized string similar to You cannot configure a shared web asset group.. Looks up a localized string similar to You must have to call Start prior calling this method.. Returns the relative path for the specified virtual path. The URL. Returns the relative path for the specified virtual path. The URL. Defines the fluent API for configuring the Kendo MobileActionSheet for ASP.NET MVC. Initializes a new instance of the class. The component. The text of the cancel button. The value that configures the cancel. Specifies the title of the actionsheet The value that configures the title. The popup configuration options (tablet only) The action that configures the popup. Contains the items of the actionsheet widget The action that configures the items. Configures the client-side events. The client events action. <%= Html.Kendo().MobileActionSheet() .Name("MobileActionSheet") .Events(events => events .Open("onOpen") ) %> Defines the fluent API for adding items to Kendo MobileActionSheet for ASP.NET MVC Defines the fluent API for configuring the MobileActionSheetPopupSettings settings. The height of the popup in pixels. The value that configures the height. The width of the popup in pixels The value that configures the width. The height of the popup in pixels. The value that configures the height. The width of the popup in pixels The value that configures the width. The direction to which the popup will expand, relative to the target that opened it The value that configures the direction. Defines the fluent API for configuring the Kendo MobileActionSheet for ASP.NET MVC events. Fires when the ActionSheet is closed. The name of the JavaScript function that will handle the close event. Fires when the ActionSheet is opened. The name of the JavaScript function that will handle the open event. Initializes a new instance of the class. The MobileActionSheet component. Builds the MobileActionSheet markup. Gets the HTML attributes. The HTML attributes. Defines the fluent API for configuring the MobileActionSheetItem settings. Specifies the name of the handler that will be executed when the item is clicked The value that configures the action. Specifies the text of the item The value that configures the text. Sets the HTML attributes. The HTML attributes. Sets the HTML attributes. The HTML attributes. Defines the fluent API for configuring the Kendo MobileButton for ASP.NET MVC. Initializes a new instance of the class. The component. If set to false the widget will be disabled and will not allow the user to click it. The widget is enabled by default. The value that configures the enable. The icon of the button. It can be either one of the built-in icons, or a custom one. The value that configures the icon. Specifies the url for remote view or id of the view to be loaded (prefixed with #, like an anchor) The value that configures the url. Specifies the text of the button The value that configures the text. Specifies the Pane transition The value that configures the transition. Specifies the id of target Pane or `_top` for application level Pane The value that configures the target. This value will be available when the action callback of ActionSheet item is executed The value that configures the actionsheetcontext. Use the align data attribute to specify the elements position inside the NavBar. By default, elements without any align are centered. The value that configures the align. Specifies the widget to be open when is tapped (the href must be set too) The value that configures the rel. Specifies the value shown in badge icon The value that configures the badge. Specifies the url for remote view to be loaded Sets controller and action from where the remove view to be loaded. Action name Controller Name Route values Sets controller, action and routeValues from where the remove view to be loaded. Action name Controller Name Configures the client-side events. The client events action. <%= Html.Kendo().MobileButton() .Name("MobileButton") .Events(events => events .Click("onClick") ) %> Defines the fluent API for configuring the Kendo MobileButton for ASP.NET MVC events. Fires when the user taps the button. The name of the JavaScript function that will handle the click event. Initializes a new instance of the class. The MobileButton component. Builds the MobileButton markup. Defines the fluent API for configuring the Kendo MobileButtonGroup for ASP.NET MVC. Initializes a new instance of the class. The component. Defines the initially selected Button (zero based index). The value that configures the index. Sets the DOM event used to select the button. Accepts "up" as an alias for touchend, mouseup and MSPointerUp vendor specific events.By default, buttons are selected immediately after the user presses the button (on touchstart or mousedown or MSPointerDown, depending on the mobile device). However, if the widget is placed in a scrollable view, the user may accidentally press the button when scrolling. In such cases, it is recommended to set this option to "up". The value that configures the selecton. Contains the items of the button group widget The action that configures the items. Configures the client-side events. The client events action. <%= Html.Kendo().MobileButtonGroup() .Name("MobileButtonGroup") .Events(events => events .Select("onSelect") ) %> Defines the fluent API for configuring the Kendo MobileButtonGroup for ASP.NET MVC events. Fires when a Button is selected. The name of the JavaScript function that will handle the select event. Initializes a new instance of the class. The MobileButtonGroup component. Builds the MobileButtonGroup markup. Defines the fluent API for adding items to Kendo MobileButtonGroup for ASP.NET MVC Gets the HTML attributes. The HTML attributes. Defines the fluent API for configuring the MobileButtonGroupItem settings. The icon of the button. It can be either one of the built-in icons, or a custom one The value that configures the icon. Specifies the text of the item The value that configures the text. Specifies the value shown in badge icon The value that configures the badge. Sets the HTML attributes. The HTML attributes. Sets the HTML attributes. The HTML attributes. Defines the fluent API for configuring the Kendo MobileBackButton for ASP.NET MVC. Initializes a new instance of the class. The component. The icon of the button. It can be either one of the built-in icons, or a custom one The value that configures the icon. Specifies the text of the button The value that configures the text. Specifies the url for remote view or id of the view to be loaded (prefixed with #, like an anchor) The value that configures the url. Specifies the id of target Pane or `_top` for application level Pane The value that configures the target. Use the align data attribute to specify the elements position inside the NavBar. By default, elements without any align are centered. The value that configures the align. Specifies the url for remote view to be loaded Sets controller and action from where the remove view to be loaded. Action name Controller Name Route values Sets controller, action and routeValues from where the remove view to be loaded. Action name Controller Name Configures the client-side events. The client events action. <%= Html.Kendo().MobileBackButton() .Name("MobileBackButton") .Events(events => events .Click("onClick") ) %> Defines the fluent API for configuring the Kendo MobileBackButton for ASP.NET MVC events. Fires when the user taps the button. The name of the JavaScript function that will handle the click event. Initializes a new instance of the class. The MobileBackButton component. Builds the MobileBackButton markup. Defines the fluent API for configuring the Kendo MobileSwitch for ASP.NET MVC. Initializes a new instance of the class. The component. The checked state of the widget. The value that configures the checked. If set to false the widget will be disabled and will not allow the user to change its checked state. The widget is enabled by default. The value that configures the enable. The OFF label. The value that configures the offlabel. The ON label. The value that configures the onlabel. Configures the client-side events. The client events action. <%= Html.Kendo().MobileSwitch() .Name("MobileSwitch") .Events(events => events .Change("onChange") ) %> Defines the fluent API for configuring the Kendo MobileSwitch for ASP.NET MVC events. Fires when the state of the widget changes The name of the JavaScript function that will handle the change event. Initializes a new instance of the class. The MobileSwitch component. Builds the MobileSwitch markup. Defines the fluent API for configuring the Kendo MobileTabStrip for ASP.NET MVC. Initializes a new instance of the class. The component. The index of the initially selected tab. The value that configures the selectedindex. Contains the items of the tabstrip widget The action that configures the items. Configures the client-side events. The client events action. <%= Html.Kendo().MobileTabStrip() .Name("MobileTabStrip") .Events(events => events .Select("onSelect") ) %> Defines the fluent API for adding items to Kendo MobileTabStrip for ASP.NET MVC Gets the HTML attributes. The HTML attributes. Defines the fluent API for configuring the MobileTabStripItem settings. Specifies the url or id of the view which will be loaded The value that configures the url. The icon of the button. It can be either one of the built-in icons, or a custom one The value that configures the icon. Specifies the text of the item The value that configures the text. Specifies the id of target Pane or `_top` for application level Pane The value that configures the target. This value will be available when the action callback of ActionSheet item is executed The value that configures the actionsheetcontext. Specifies the value shown in badge icon The value that configures the badge. Specifies the widget to be open when is tapped (the href must be set too) The value that configures the rel. Sets the HTML attributes. The HTML attributes. Sets the HTML attributes. The HTML attributes. Specifies the url for remote view to be loaded Sets controller and action from where the remove view to be loaded. Action name Controller Name Route values Sets controller, action and routeValues from where the remove view to be loaded. Action name Controller Name Defines the fluent API for configuring the Kendo MobileTabStrip for ASP.NET MVC events. Fires when tab is selected. The name of the JavaScript function that will handle the select event. Initializes a new instance of the class. The MobileTabStrip component. Builds the MobileTabStrip markup. Defines the fluent API for configuring the Kendo MobileView for ASP.NET MVC. Initializes a new instance of the class. The component. Applicable to remote views only. If set to true, the remote view contents will be reloaded from the server (using Ajax) each time the view is navigated to. The value that configures the reload. If set to true, the view will stretch its child contents to occupy the entire view, while disabling kinetic scrolling. Useful if the view contains an image or a map. The value that configures the stretch. The text to display in the NavBar title (if present) and the browser title. The value that configures the title. If set to true, the view will use the native scrolling available in the current platform. This should help with form issues on some platforms (namely Android and WP8). Native scrolling is only enabled on platforms that support it: iOS > 5+, Android > 3+, WP8. BlackBerry devices do support it, but the native scroller is flaky. The value that configures the usenativescrolling. If set to true, the user can zoom in/out the contents of the view using the pinch/zoom gesture. The value that configures the zoom. Specifies the id of the default layout The value that configures the layout. Specifies the Pane transition The value that configures the transition. Sets the HTML content which the header should display. The action which renders the header. <% Html.Kendo().MobileView() .Name("View") .Header(() => { %> <strong> View Header </strong> <% }) .Render(); %> Sets the HTML content which the header should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileView() .Name("View") .Header( @<text> Some text <strong> View Header </strong> </text> ) ) Sets the HTML content which the header should display as a string. The action which renders the header. <% Html.Kendo().MobileView() .Name("View") .Header("<strong> View Header </strong>"); .Render(); %> Sets the HTML content which the content should display. The action which renders the content. <% Html.Kendo().MobileView() .Name("View") .Content(() => { %> <strong> View Content </strong> <% }) .Render(); %> Sets the HTML content which the content should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileView() .Name("View") .Content( @<text> Some text <strong> View Content </strong> </text> ) ) Sets the HTML content which the view content should display as a string. The action which renders the view content. <% Html.Kendo().MobileView() .Name("View") .Content("<strong> View Content </strong>"); .Render(); %> Sets the HTML content which the footer should display. The action which renders the footer. <% Html.Kendo().MobileView() .Name("View") .Footer(() => { %> <strong> View Footer </strong> <% }) .Render(); %> Sets the HTML content which the footer should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileView() .Name("View") .Footer( @<text> Some text <strong> View Footer </strong> </text> ) ) Sets the HTML content which the footer should display as a string. The action which renders the footer. <% Html.Kendo().MobileView() .Name("View") .Footer("<strong> View Footer </strong>"); .Render(); %> Configures the client-side events. The client events action. <%= Html.Kendo().MobileView() .Name("MobileView") .Events(events => events .AfterShow("onAfterShow") ) %> Defines the fluent API for configuring the Kendo MobileView for ASP.NET MVC events. Fires after the mobile View becomes visible. If the view is displayed with transition, the event is triggered after the transition is complete. The name of the JavaScript function that will handle the afterShow event. Fires before the mobile View becomes hidden. The name of the JavaScript function that will handle the beforeHide event. Fires before the mobile View becomes visible. The event can be prevented by calling the preventDefault method of the event parameter, in case a redirection should happen. The name of the JavaScript function that will handle the beforeShow event. Fires when the mobile View becomes hidden. The name of the JavaScript function that will handle the hide event. Fires after the mobile View and its child widgets are initialized. The name of the JavaScript function that will handle the init event. Fires when the mobile View becomes visible. The name of the JavaScript function that will handle the show event. Initializes a new instance of the class. The MobileView component. Builds the MobileView markup. Defines the fluent API for configuring the Kendo MobileModalView for ASP.NET MVC. Initializes a new instance of the class. The component. When set to false, the ModalView will close when the user taps outside of its element. The value that configures the modal. The height of the ModalView container in pixels. If not set, the element style is used. The value that configures the height. The width of the ModalView container in pixels. If not set, the element style is used. The value that configures the width. If set to true, the user can zoom in/out the contents of the view using the pinch/zoom gesture. The value that configures the zoom. If set to true, the view will stretch its child contents to occupy the entire view, while disabling kinetic scrolling. Useful if the view contains an image or a map. The value that configures the stretch. (available since Q1 2013) If set to true, the view will use the native scrolling available in the current platform. This should help with form issues on some platforms (namely Android and WP8). Native scrolling is only enabled on platforms that support it: iOS > 4, Android > 2, WP8. BlackBerry devices do support it, but the native scroller is flaky. The value that configures the usenativescrolling. The text to display in the navbar title (if present) and the browser title. The value that configures the title. Specifies the id of the default layout The value that configures the layout. The height of the ModalView in pixels. The value that configures the height. The width of the ModalView in pixels The value that configures the width. Sets the HTML content which the header should display. The action which renders the header. <% Html.Kendo().MobileModalView() .Name("View") .Header(() => { %> <strong> View Header </strong> <% }) .Render(); %> Sets the HTML content which the header should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileModalView() .Name("View") .Header( @<text> Some text <strong> View Header </strong> </text> ) ) Sets the HTML content which the header should display as a string. The action which renders the header. <% Html.Kendo().MobileModalView() .Name("View") .Header("<strong> View Header </strong>"); .Render(); %> Sets the HTML content which the content should display. The action which renders the content. <% Html.Kendo().MobileModalView() .Name("View") .Content(() => { %> <strong> View Content </strong> <% }) .Render(); %> Sets the HTML content which the content should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileModalView() .Name("View") .Content( @<text> Some text <strong> View Content </strong> </text> ) ) Sets the HTML content which the view content should display as a string. The action which renders the view content. <% Html.Kendo().MobileModalView() .Name("View") .Content("<strong> View Content </strong>"); .Render(); %> Sets the HTML content which the footer should display. The action which renders the footer. <% Html.Kendo().MobileModalView() .Name("View") .Footer(() => { %> <strong> View Footer </strong> <% }) .Render(); %> Sets the HTML content which the footer should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileModalView() .Name("View") .Footer( @<text> Some text <strong> View Footer </strong> </text> ) ) Sets the HTML content which the footer should display as a string. The action which renders the footer. <% Html.Kendo().MobileModalView() .Name("View") .Footer("<strong> View Footer </strong>"); .Render(); %> Configures the client-side events. The client events action. <%= Html.Kendo().MobileModalView() .Name("MobileModalView") .Events(events => events .Close("onClose") ) %> Defines the fluent API for configuring the Kendo MobileModalView for ASP.NET MVC events. Fired when the mobile ModalView is closed by the user. The name of the JavaScript function that will handle the close event. Fired when the mobile ModalView and its child widgets are initialized. The name of the JavaScript function that will handle the init event. Fires when the ModalView is shown. The name of the JavaScript function that will handle the open event. Initializes a new instance of the class. The MobileModalView component. Builds the MobileModalView markup. Defines the fluent API for configuring the Kendo MobileSplitView for ASP.NET MVC. Initializes a new instance of the class. The component. Defines the SplitView style - horizontal or vertical. The value that configures the style. Contains the panes of the splitview widget The action that configures the panes. Configures the client-side events. The client events action. <%= Html.Kendo().MobileSplitView() .Name("MobileSplitView") .Events(events => events .Init("onInit") ) %> Defines the fluent API for adding items to Kendo MobileSplitView for ASP.NET MVC Gets the HTML attributes. The HTML attributes. Gets the client events of the grid. The client events. Defines the fluent API for configuring the MobileSplitViewPane settings. The id of tha pane. The value that configures the id. The value that configures the initial. The value that configures the initial. The value that configures the layout. The value that configures the layout. The text displayed in the loading popup. Setting this value to false will disable the loading popup. The value that configures the loading. The default View transition. The value that configures the transition. Defines whether the pane is collapsible. Collapsible panes are automatically hidden when the device is in portrait orientation. The value that configures the collapsible. Defines the width of the pane in portrait orientation. The value that configures the portraitwidth. Defines the width of the pane in portrait orientation (in pixels). The value that configures the portraitwidth. Sets the HTML content which the pane should display. The action which renders the content. <% Html.Kendo().MobileSplitView() .Name("View") .Panes(panes => panes.Add() .Content(() => { %> <strong> View Content </strong> <% }) ) .Render(); %> Sets the HTML content which the pane should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileSplitView() .Name("View") .Panes(panes => panes.Add() .Content( @<text> Some text <strong> View Content </strong> </text> )) ) Sets the HTML content which the pane should display as a string. The action which renders the view content. <% Html.Kendo().MobileSplitView() .Name("View") .Panes(panes => panes.Add().Content("<strong> View Content </strong>")) .Render(); %> Sets the HTML attributes. The HTML attributes. Sets the HTML attributes. The HTML attributes. Configures the client-side events. The client events action. <%= Html.Kendo().MobileSplitView() .Name("MobileSplitView") .Panes(panes => panes.Add() .Events(events => events .Navigate("onNavigate") )) %> Defines the fluent API for configuring the Kendo MobileSplitView for ASP.NET MVC events. Fires after the mobile SplitView and its child widgets are initialized. The name of the JavaScript function that will handle the init event. Fires when the mobile SplitView becomes visible. The name of the JavaScript function that will handle the show event. Initializes a new instance of the class. The MobileSplitView component. Builds the MobileSplitView markup. Defines the fluent API for configuring the Kendo MobilePopOver for ASP.NET MVC. Initializes a new instance of the class. The component. The pane configuration options. The action that configures the pane. The popup configuration options (tablet only) The action that configures the popup. Sets the HTML content which the content should display. The action which renders the content. <% Html.Kendo().MobilePopOver() .Name("PopOver") .Content(() => { %> <strong> PopOver Content </strong> <% }) .Render(); %> Sets the HTML content which the content should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobilePopOver() .Name("PopOver") .Content( @<text> Some text <strong> PopOver Content </strong> </text> ) ) Sets the HTML content which the popover content should display as a string. The action which renders the view content. <% Html.Kendo().MobilePopOver() .Name("PopOver") .Content("<strong> PopOver Content </strong>"); .Render(); %> Configures the client-side events. The client events action. <%= Html.Kendo().MobilePopOver() .Name("MobilePopOver") .Events(events => events .Close("onClose") ) %> Defines the fluent API for configuring the MobilePopOverPaneSettings settings. The id of the initial mobile View to display. The value that configures the initial. The id of the default Pane Layout. The value that configures the layout. The text displayed in the loading popup. Setting this value to false will disable the loading popup. The value that configures the loading. The default View transition. The value that configures the transition. Defines the fluent API for configuring the MobilePopOverPopupSettings settings. The height of the popup in pixels. The value that configures the height. The width of the popup in pixels The value that configures the width. The height of the popup in pixels. The value that configures the height. The width of the popup in pixels The value that configures the width. The direction to which the popup will expand, relative to the target that opened it The value that configures the direction. Defines the fluent API for configuring the Kendo MobilePopOver for ASP.NET MVC events. Fires when popover is closed. The name of the JavaScript function that will handle the close event. Fires when popover is opened. The name of the JavaScript function that will handle the open event. Initializes a new instance of the class. The MobilePopOver component. Builds the MobilePopOver markup. Gets the Header HTML attributes. The HTML attributes. Gets the Footer HTML attributes. The HTML attributes. Defines the fluent API for configuring the Kendo MobileLayout for ASP.NET MVC. Initializes a new instance of the class. The component. The specific platform this layout targets. By default, layouts are displayed on all platforms. The value that configures the platform. Sets the HTML content which the header should display. The action which renders the header. <% Html.Kendo().MobileLayout() .Name("Layout") .Header(() => { %> <strong> View Header </strong> <% }) .Render(); %> Sets the HTML content which the header should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileLayout() .Name("Layout") .Header( @<text> Some text <strong> View Header </strong> </text> ) ) Sets the HTML content which the header should display as a string. The action which renders the header. <% Html.Kendo().MobileLayout() .Name("Layout") .Header("<strong> View Header </strong>"); .Render(); %> Sets the HTML content which the footer should display. The action which renders the footer. <% Html.Kendo().MobileLayout() .Name("Layout") .Footer(() => { %> <strong> View Footer </strong> <% }) .Render(); %> Sets the HTML content which the footer should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileLayout() .Name("Layout") .Footer( @<text> Some text <strong> View Footer </strong> </text> ) ) Sets the HTML content which the footer should display as a string. The action which renders the footer. <% Html.Kendo().MobileLayout() .Name("Layout") .Footer("<strong> View Footer </strong>"); .Render(); %> Sets the Header HTML attributes. The HTML attributes. Sets the Footer HTML attributes. The HTML attributes. Sets the Header HTML attributes. The HTML attributes. Sets the Footer HTML attributes. The HTML attributes. Configures the client-side events. The client events action. <%= Html.Kendo().MobileLayout() .Name("MobileLayout") .Events(events => events .Hide("onHide") ) %> Defines the fluent API for configuring the Kendo MobileLayout for ASP.NET MVC events. Fires when a mobile View using the layout becomes hidden. The name of the JavaScript function that will handle the hide event. Fires after a mobile Layout and its child widgets is initialized. The name of the JavaScript function that will handle the init event. Fires when a mobile View using the layout becomes visible. The name of the JavaScript function that will handle the show event. Initializes a new instance of the class. The MobileLayout component. Builds the MobileLayout markup. Creates a HTML element used as a view title. The text for the content. Returns HTML element representing default view title. Defines the fluent API for configuring the Kendo MobileNavBar for ASP.NET MVC. Initializes a new instance of the class. The component. Sets the HTML content which the content should display. The action which renders the content. <% Html.Kendo().MobileNavBar() .Name("NavBar") .Content(() => { %> <strong> View Title </strong> <% }) .Render(); %> Sets the HTML content which the content should display. The action which renders the content. <% Html.Kendo().MobileNavBar() .Name("NavBar") .Content((navbar) => { %> <= navbar.ViewTitle("View Title")> <% }) .Render(); %> Sets the HTML content which the content should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileNavBar() .Name("NavBar") .Content( @<text> Some text <strong> View Title </strong> </text> ) ) Sets the HTML content which the content should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileNavBar() .Name("NavBar") .Content(@navbar => @<text> Some text @navbar.ViewTitle("View Title") </text> ) ) Sets the HTML content which the view content should display as a string. The action which renders the view content. <% Html.Kendo().MobileNavBar() .Name("NavBar") .Content("<strong> View Title </strong>"); .Render(); %> Initializes a new instance of the class. The MobileNavBar component. Builds the MobileNavBar markup. Defines the fluent API for configuring the Kendo MobileScrollView for ASP.NET MVC. Initializes a new instance of the class. The component. If set to false the widget will not bind to the DataSource during initialization. In this case data binding will occur when the change event of the data source is fired. By default the widget will bind to the DataSource specified in the configuration.Applicable only in data bound mode. The value that configures the autobind. The milliseconds that take the ScrollView to snap to the current page after released. The value that configures the duration. The template which is used to render the pages without content. By default the ScrollView renders a blank page.Applicable only in data bound mode. The value that configures the emptytemplateid. If set to true the ScrollView will display a pager. By default pager is enabled. The value that configures the enablepager. Determines how many data items will be passed to the page template.Applicable only in data bound mode. The value that configures the itemsperpage. The initial page to display. The value that configures the page. The template which is used to render the content of pages. By default the ScrollView renders a div element for every page.Applicable only in data bound mode. The value that configures the templateid. Specifies the tag name of the item element. By default it will be `div` element The value that configures the itemtagname. Specifies whether exactly one item per page must be shown The value that configures the fititemperpage. The height of the ScrollView content. The value that configures the contentheight. The velocity threshold after which a swipe will result in a bounce effect. The value that configures the bouncevelocitythreshold. Multiplier applied to the snap amount of the ScrollView. By default, the widget scrolls to the next screen when swipe. If the pageSize property is set to 0.5, the ScrollView will scroll by half of the widget width. The value that configures the pagesize. The velocity threshold after which a swipe will navigate to the next page (as opposed to snapping back to the current page). The value that configures the velocitythreshold. Contains the items of the ScrollView widget The action that configures the items. The height of the ScrollView content. The value that configures the contentheight. Instance of DataSource or the data that the mobile ScrollView will be bound to. The value that configures the datasource. Configures the client-side events. The client events action. <%= Html.Kendo().MobileScrollView() .Name("MobileScrollView") .Events(events => events .Change("onChange") ) %> Defines the fluent API for configuring the Kendo MobileScrollView for ASP.NET MVC events. Fires before the widget page is changed. The change can be prevented by calling the preventDefault method of the event parameter, in which case the widget will snap back to the current page. The name of the JavaScript function that will handle the changing event. Fires when the widget page is changed. The name of the JavaScript function that will handle the change event. Fires when widget refreshes The name of the JavaScript function that will handle the refresh event. Initializes a new instance of the class. The MobileScrollView component. Builds the MobileScrollView markup. Defines the fluent API for adding items to Kendo MobileScrollView for ASP.NET MVC Gets the HTML attributes. The HTML attributes. Gets the content of the item Defines the fluent API for configuring the MobileScrollViewItem settings. Sets the HTML attributes. The HTML attributes. Sets the HTML attributes. The HTML attributes. Sets the HTML content which the content should display. The action which renders the content. <% Html.Kendo().MobileScrollView() .Name("View") .Items(items => items.Add() .Content(() => { %> <strong> View Content </strong> <% }) ) .Render(); %> Sets the HTML content which the content should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileScrollView() .Name("View") .Items(items => items.Add() .Content( @<text> Some text <strong> View Content </strong> </text> ) ) ) Sets the HTML content which the view content should display as a string. The action which renders the view content. <% Html.Kendo().MobileScrollView() .Name("View") .Items(items => items.Add() .Content("<strong> View Content </strong>")) .Render(); %> Defines the fluent API for configuring the Kendo MobileDetailButton for ASP.NET MVC. Initializes a new instance of the class. The component. Specifies the url for remote view or id of the view to be loaded (prefixed with #, like an anchor) The value that configures the url. Specifies the Pane transition The value that configures the transition. Specifies the id of target Pane or `_top` for application level Pane The value that configures the target. This value will be available when the action callback of ActionSheet item is executed The value that configures the actionsheetcontext. The icon of the button. It can be either one of the built-in icons, or a custom one. The value that configures the icon. Specifies predefined button style The value that configures the style. Use the align data attribute to specify the elements position inside the NavBar. By default, elements without any align are centered. The value that configures the align. Specifies the widget to be open when is tapped (the href must be set too) The value that configures the rel. Specifies the url for remote view to be loaded Sets controller and action from where the remove view to be loaded. Action name Controller Name Route values Sets controller, action and routeValues from where the remove view to be loaded. Action name Controller Name Configures the client-side events. The client events action. <%= Html.Kendo().MobileDetailButton() .Name("MobileDetailButton") .Events(events => events .Click("onClick") ) %> Defines the fluent API for configuring the Kendo MobileDetailButton for ASP.NET MVC events. Fires when the user taps the button. The name of the JavaScript function that will handle the click event. Initializes a new instance of the class. The MobileDetailButton component. Builds the MobileDetailButton markup. Defines the fluent API for configuring the Kendo MobileApplication for ASP.NET MVC. Initializes a new instance of the class. The component. Whether to hide the browser address bar. Supported only in iPhone and iPod. Doesn't affect standalone mode as there the address bar is always hidden. The value that configures the hideaddressbar. Whether to update the document title. The value that configures the updatedocumenttitle. The id of the initial mobile View to display. The value that configures the initial. The id of the default Application layout. The value that configures the layout. The text displayed in the loading popup. Setting this value to false will disable the loading popup.Note: The text should be wrapped inside <h1> tag. The value that configures the loading. Which platform look to force on the application. Supported values are "ios6", "ios7","android", "blackberry" and "wp8". The value that configures the platform. If set to true, the application will not use AJAX to load remote views. The value that configures the servernavigation. The skin to apply to the application. Currently, Kendo UI Mobile ships with a flat skin in addition to the native looking ones. The value that configures the skin. Set the status bar style meta tag in iOS used to control the styling of the status bar in a pinned to the Home Screen app. Available as of Q2 2013 SP. The value that configures the statusbarstyle. The default View transition. The value that configures the transition. Disables the default behavior of Kendo UI Mobile apps to be web app capable (open in a chromeless browser). Introduced in Q2 2013. The value that configures the webappcapable. Specifies how history should be handled The value that configures the pushstate. Configures the client-side events. The client events action. <%= Html.Kendo().MobileApplication() .Events(events => events .Init("onInit") ) %> Defines the fluent API for configuring the Kendo MobileListView for ASP.NET MVC. Initializes a new instance of the class. The component. Binds the MobileListView to a list of objects The data source. <%= Html.Kendo().MobileListView<Order>() .Name("Orders") .BindTo((IEnumerable<Order>)ViewData["Orders"]); %> Binds the MobileListView to a list of objects The data source. <%= Html.Kendo().MobileListView<Order>() .Name("Orders") .BindTo((IEnumerable)ViewData["Orders"]); %> Used in combination with pullToRefresh. If set to true, newly loaded data will be appended on top when refershing. The value that configures the appendonrefresh. Indicates whether the listview will call read on the DataSource initially. The value that configures the autobind. Instance of DataSource or the data that the mobile ListView will be bound to. The value that configures the datasource. If set to true, the listview gets the next page of data when the user scrolls near the bottom of the view. The value that configures the endlessscroll. If set to true, the group headers will persist their position when the user scrolls through the listview. Applicable only when the type is set to group, or when binding to grouped datasource. The value that configures the fixedheaders. The header item template (applicable when the type is set to group). The value that configures the headertemplate. If set to true, a button is rendered at the bottom of the listview, which fetch the next page of data when tapped. The value that configures the loadmore. The text of the rendered load-more button (applies only if loadMore is set to true). The value that configures the loadmoretext. The message template displayed when the user pulls the listView. Applicable only when pullToRefresh is set to true. The value that configures the pulltemplate. If set to true, the listview will reload its data when the user pulls the view over the top limit. The value that configures the pulltorefresh. The message template displayed during the refresh. Applicable only when pullToRefresh is set to true. The value that configures the refreshtemplate. The message template indicating that pullToRefresh will occur. Applicable only when pullToRefresh is set to true. The value that configures the releasetemplate. The distance to the bottom in pixels, after which the listview will start fetching the next page. Applicable only when endlessScroll is set to true. The value that configures the scrolltreshold. The distance to the bottom in pixels, after which the listview will start fetching the next page. Applicable only when endlessScroll is set to true. The value that configures the scrolltreshold. The style of the control. Can be either empty string(""), or inset. The value that configures the style. The item template. The value that configures the template. The type of the control. Can be either flat (default) or group. Determined automatically in databound mode. The value that configures the type. Indicates whether the filter input must be visible or not. The action that configures the filterable. Configures the client-side events. The client events action. <%= Html.Kendo().MobileListView<Order>() .Name("MobileListView") .Events(events => events .Click("onClick") ) %> Builds MobileListView items. Action for declaratively building MobileListView items. <% Html.Kendo().MobileListViewView() .Name("View") .Items(items => { items.Add().Text("Item"); items.AddLink().Text("Link Item"); }) .Render(); %> Defines the fluent API for configuring the MobileListViewFilterableSettings settings. Placeholder text for search input. The value that configures the placeholder. Indicates whether filtering should be performed on every key up event or not. The value that configures the autofilter. Specifies the field which will be used in the filter expression. The value that configures the field. Specifies whether the filter expression must be case sensitive or not. The value that configures the ignorecase. Specifies the comparison operator used in the filter expression. The value that configures the operator. Defines the fluent API for configuring the Kendo MobileListView for ASP.NET MVC events. Fires when item is tapped. The name of the JavaScript function that will handle the click event. Fires when the ListView has received data from the data source. The name of the JavaScript function that will handle the dataBound event. Fires when the ListView is about to be rendered. The name of the JavaScript function that will handle the dataBinding event. Fires when the last page of the ListView is reached. Event will be raised only if the 'endless scroll' or 'load more' option is enabled. The name of the JavaScript function that will handle the lastPageReached event. Initializes a new instance of the class. The MobileListView component. Builds the MobileListView markup. Defines the fluent API for configuring the Kendo MobileDrawer for ASP.NET MVC. Initializes a new instance of the class. The component. If set to false, swiping the view will not activate the drawer. In this case, the drawer will only be open by a designated button The value that configures the swipetoopen. The text to display in the Navbar title (if present). The value that configures the title. The position of the drawer. Can be left (default) or right. The value that configures the position. Sets the HTML content which the header should display. The action which renders the header. <% Html.Kendo().MobileDrawer() .Name("Drawer") .Header(() => { %> <strong> Drawer Header </strong> <% }) .Render(); %> Sets the HTML content which the header should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileDrawer() .Name("Drawer") .Header( @<text> Some text <strong> Drawer Header </strong> </text> ) ) Sets the HTML content which the header should display as a string. The action which renders the header. <% Html.Kendo().MobileDrawer() .Name("Drawer") .Header("<strong> Drawer Header </strong>"); .Render(); %> Sets the HTML content which the content should display. The action which renders the content. <% Html.Kendo().MobileDrawer() .Name("Drawer") .Content(() => { %> <strong> Drawer Content </strong> <% }) .Render(); %> Sets the HTML content which the content should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileDrawer() .Name("Drawer") .Content( @<text> Some text <strong> Drawer Content </strong> </text> ) ) Sets the HTML content which the view content should display as a string. The action which renders the view content. <% Html.Kendo().MobileDrawer() .Name("Drawer") .Content("<strong> Drawer Content </strong>"); .Render(); %> Sets the HTML content which the footer should display. The action which renders the footer. <% Html.Kendo().MobileDrawer() .Name("Drawer") .Footer(() => { %> <strong> Drawer Footer </strong> <% }) .Render(); %> Sets the HTML content which the footer should display. The content wrapped in a regular HTML tag or text tag (Razor syntax). @(Html.Kendo().MobileDrawer() .Name("Drawer") .Footer( @<text> Some text <strong> Drawer Footer </strong> </text> ) ) Sets the HTML content which the footer should display as a string. The action which renders the footer. <% Html.Kendo().MobileDrawer() .Name("Drawer") .Footer("<strong> Drawer Footer </strong>"); .Render(); %> A list of the view ids on which the drawer will appear. If omitted, the drawer can be revealed on any view in the application. The list of view ids on which the drawer will appear. Configures the client-side events. The client events action. <%= Html.Kendo().MobileDrawer() .Name("MobileDrawer") .Events(events => events .BeforeShow("onBeforeShow") ) %> Defines the fluent API for configuring the Kendo MobileDrawer for ASP.NET MVC events. Fires before the mobile Drawer is revealed. The event can be prevented by calling the preventDefault method of the event parameter. The name of the JavaScript function that will handle the beforeShow event. Fired when the mobile Drawer is closed by the user. The name of the JavaScript function that will handle the hide event. Fired when the mobile Drawer and its child widgets are initialized. The name of the JavaScript function that will handle the init event. Fires when the Drawer is shown. The name of the JavaScript function that will handle the show event. Initializes a new instance of the class. The MobileDrawer component. Builds the MobileDrawer markup. Defines the fluent API for configuring the Kendo MobileApplication for ASP.NET MVC events. Fires after the mobile application is instantiated. The name of the JavaScript function that will handle the init event. Defines the fluent API for configuring the Kendo Map for ASP.NET MVC. Initializes a new instance of the class. The component. Configures the center of the map. The latitude The longtitude The configuration of built-in map controls. The action that configures the controls. The default configuration for map layers by type. The action that configures the layerdefaults. The configuration of the map layers. The layer type is determined by the value of the type field. The action that configures the layers. The default options for all markers. The action that configures the markerdefaults. The initial markers to display on the map. The action that configures the markers. The minimum zoom level. The value that configures the minzoom. The maximum zoom level. The value that configures the maxzoom. The size of the map in pixels at zoom level 0. The value that configures the minsize. The map theme name.The built-in themes are: The value that configures the theme. The initial zoom level.Typical web maps use zoom levels from 0 (whole world) to 19 (sub-meter features).The map size is derived from the zoom level and minScale options: size = (2 ^ zoom) * minSize The value that configures the zoom. Configures the client-side events. The client events action. <%= Html.Kendo().Map() .Name("Map") .Events(events => events .Click("onClick") ) %> Defines the fluent API for configuring the MapControlsSettings settings. Enables or disables the built-in attribution control. The value that configures the attribution. Enables or disables the built-in navigator control (directional pad). The action that configures the navigator. Enables or disables the built-in zoom control (+/- button). The action that configures the zoom. Defines the fluent API for configuring the MapControlsNavigatorSettings settings. The position of the navigator control. Possible values include: The value that configures the position. Defines the fluent API for configuring the MapControlsZoomSettings settings. The position of the zoom control. Possible values include: The value that configures the position. Defines the fluent API for configuring the MapLayerDefaultsSettings settings. The default configuration for shape layers. The action that configures the shape. The default configuration for tile layers. The action that configures the tile. Defines the fluent API for configuring the MapLayerDefaultsShapeSettings settings. The attribution for all shape layers. The value that configures the attribution. The default style for shapes. The action that configures the style. Defines the fluent API for configuring the MapLayerDefaultsTileSettings settings. The URL template for tile layers. Template variables: The value that configures the urltemplateid. The attribution of all tile layers. The value that configures the attribution. The the opacity of all tile layers. The value that configures the opacity. Defines the fluent API for adding items to Kendo Map for ASP.NET MVC Defines the fluent API for configuring the MapLayer settings. Configures the data source of the map layer. The configuration of the data source. Configures of the subdomains. The subdomains If set to false the layer will not bind to the data source during initialization. In this case data binding will occur when the change event of the data source is fired. By default the widget will bind to the data source specified in the configuration. The value that configures the autobind. The attribution for the layer. The value that configures the attribution. The the opacity for the layer. The value that configures the opacity. The default style for shapes. The action that configures the style. The URL template for tile layers. Template variables: The value that configures the urltemplateid. The layer type. Supported types are "tile" and "shape". The value that configures the type. Defines the fluent API for configuring the MapLayerFillSettings settings. The default fill color for layer shapes. Accepts a valid CSS color string, including hex and rgb. The value that configures the color. The default fill opacity (0 to 1) for layer shapes. The value that configures the opacity. Defines the fluent API for configuring the MapLayerStrokeSettings settings. The default stroke color for layer shapes. Accepts a valid CSS color string, including hex and rgb. The value that configures the color. The default stroke opacity (0 to 1) for layer shapes. The value that configures the opacity. Defines the fluent API for configuring the MapMarkerDefaultsSettings settings. The default marker color. Accepts a valid CSS color string, including hex and rgb. The value that configures the color. The default marker size in pixels. The value that configures the size. The default marker shape. Supported shapes: The value that configures the shape. Defines the fluent API for adding items to Kendo Map for ASP.NET MVC Gets the HTML attributes. The HTML attributes. Defines the fluent API for configuring the MapMarker settings. The marker color. Accepts a valid CSS color string, including hex and rgb. The value that configures the color. The marker size in pixels. The value that configures the size. The marker shape. Supported shapes are "pin" and "circle". The value that configures the shape. Configures the position of the marker. The latitude The longtitude Sets the HTML attributes. The HTML attributes. Sets the HTML attributes. The HTML attributes. Defines the fluent API for configuring the Kendo Map for ASP.NET MVC events. Fired when the user clicks on the map. The name of the JavaScript function that will handle the click event. Fired when the map is reset, e.g. on initial load or during zoom. The name of the JavaScript function that will handle the reset event. Fired while the map viewport is being moved. The name of the JavaScript function that will handle the pan event. Fires after the map viewport has been moved. The name of the JavaScript function that will handle the panEnd event. Fired when a shape is clicked or tapped. The name of the JavaScript function that will handle the shapeClick event. Fired when a shape is created, but is not rendered yet. The name of the JavaScript function that will handle the shapeCreated event. Fired when the mouse enters a shape. The name of the JavaScript function that will handle the shapeMouseEnter event. Fired when the mouse leaves a shape. The name of the JavaScript function that will handle the shapeMouseLeave event. Fired when the map zoom level is about to change. The name of the JavaScript function that will handle the zoomStart event. Fired when the map zoom level has changed. The name of the JavaScript function that will handle the zoomEnd event. Initializes a new instance of the class. The Map component. Builds the Map markup. Defines the fluent API for configuring the MapLayerDefaultsShapeStyleSettings settings. The default fill for layer shapes. Accepts a valid CSS color string or object with detailed configuration. The action that configures the fill. The default stroke for layer shapes. Accepts a valid CSS color string or object with detailed configuration. The action that configures the stroke. Defines the fluent API for configuring the MapLayerDefaultsShapeStyleFillSettings settings. The default fill color for layer shapes. Accepts a valid CSS color string, including hex and rgb. The value that configures the color. The default fill opacity (0 to 1) for layer shapes. The value that configures the opacity. Defines the fluent API for configuring the MapLayerDefaultsShapeStyleStrokeSettings settings. The default stroke color for layer shapes. Accepts a valid CSS color string, including hex and rgb. The value that configures the color. The default dash type for layer shapes. The following dash types are supported: The value that configures the dashtype. The default stroke opacity (0 to 1) for layer shapes. The value that configures the opacity. The default stroke width for layer shapes. The value that configures the width. Defines the fluent API for configuring the MapLayerStyleSettings settings. The default fill for layer shapes. Accepts a valid CSS color string or object with detailed configuration. The action that configures the fill. The default stroke for layer shapes. Accepts a valid CSS color string or object with detailed configuration. The action that configures the stroke. Defines the fluent API for configuring the MapLayerStyleFillSettings settings. The default fill color for layer shapes. Accepts a valid CSS color string, including hex and rgb. The value that configures the color. The default fill opacity (0 to 1) for layer shapes. The value that configures the opacity. Defines the fluent API for configuring the MapLayerStyleStrokeSettings settings. The default stroke color for layer shapes. Accepts a valid CSS color string, including hex and rgb. The value that configures the color. The default dash type for layer shapes. The following dash types are supported: The value that configures the dashtype. The default stroke opacity (0 to 1) for layer shapes. The value that configures the opacity. The default stroke width for layer shapes. The value that configures the width.
================================================ FILE: Open Judge System/OJS.Common/Attributes/LocalizedDescriptionAttribute.cs ================================================ namespace OJS.Common.Attributes { using System; using System.ComponentModel; using System.Reflection; public class LocalizedDescriptionAttribute : DescriptionAttribute { public LocalizedDescriptionAttribute(string resourceName, Type resourceType = null) { var resourceProperty = resourceType?.GetProperty(resourceName, BindingFlags.Static | BindingFlags.Public); if (resourceProperty != null) { this.DescriptionValue = (string)resourceProperty.GetValue(resourceProperty.DeclaringType, null); } } } } ================================================ FILE: Open Judge System/OJS.Common/Attributes/LocalizedDisplayFormatAttribute.cs ================================================ namespace OJS.Common.Attributes { using System; using System.ComponentModel.DataAnnotations; using System.Reflection; public class LocalizedDisplayFormatAttribute : DisplayFormatAttribute { public LocalizedDisplayFormatAttribute() { var resourceProperty = this.NullDisplayTextResourceType?.GetProperty(this.NullDisplayTextResourceName, BindingFlags.Static | BindingFlags.Public); if (resourceProperty != null) { this.NullDisplayText = (string)resourceProperty.GetValue(resourceProperty.DeclaringType, null); } } public Type NullDisplayTextResourceType { get; set; } public string NullDisplayTextResourceName { get; set; } } } ================================================ FILE: Open Judge System/OJS.Common/Calculator.cs ================================================ namespace OJS.Common { using System; public class Calculator { public static byte? Age(DateTime? date) { if (!date.HasValue) { return null; } var birthDate = date.Value; var now = DateTime.Now; var age = now.Year - birthDate.Year; if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day)) { age--; } return (byte)age; } } } ================================================ FILE: Open Judge System/OJS.Common/DataAnnotations/DatabasePropertyAttribute.cs ================================================ namespace OJS.Common.DataAnnotations { using System; public class DatabasePropertyAttribute : Attribute { public string Name { get; set; } } } ================================================ FILE: Open Judge System/OJS.Common/DataAnnotations/ExcludeFromExcelAttribute.cs ================================================ namespace OJS.Common.DataAnnotations { using System; [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public class ExcludeFromExcelAttribute : Attribute { } } ================================================ FILE: Open Judge System/OJS.Common/ExpressionBuilder.cs ================================================ namespace OJS.Common { using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; public static class ExpressionBuilder { public static Expression> BuildOrExpression( IEnumerable values, Expression> valueSelector) { if (valueSelector == null) { throw new ArgumentNullException(nameof(valueSelector)); } if (values == null) { throw new ArgumentNullException(nameof(values)); } var parameterExpression = valueSelector.Parameters.Single(); if (!values.Any()) { return e => false; } var equals = values.Select( value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue)))); var body = equals.Aggregate(Expression.Or); return Expression.Lambda>(body, parameterExpression); } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/CompilerTypeExtensions.cs ================================================ namespace OJS.Common.Extensions { using OJS.Common.Models; public static class CompilerTypeExtensions { public static string GetFileExtension(this CompilerType compilerType) { switch (compilerType) { case CompilerType.None: return null; case CompilerType.CSharp: return "cs"; case CompilerType.MsBuild: return "zip"; case CompilerType.CPlusPlusGcc: return "cpp"; case CompilerType.Java: return "java"; default: return null; } } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/CompressStringExtensions.cs ================================================ namespace OJS.Common.Extensions { using System.IO; using System.IO.Compression; using System.Text; public static class CompressStringExtensions { public static byte[] Compress(this string stringToCompress) { if (stringToCompress == null) { return null; } var bytes = Encoding.UTF8.GetBytes(stringToCompress); using (var memoryStreamInput = new MemoryStream(bytes)) { using (var memoryStreamOutput = new MemoryStream()) { using (var deflateStream = new DeflateStream(memoryStreamOutput, CompressionMode.Compress)) { memoryStreamInput.CopyTo(deflateStream); } return memoryStreamOutput.ToArray(); } } } public static string Decompress(this byte[] bytes) { if (bytes == null) { return null; } using (var memoryStreamInput = new MemoryStream(bytes)) { using (var memoryStreamOutput = new MemoryStream()) { using (var deflateStream = new DeflateStream(memoryStreamInput, CompressionMode.Decompress)) { deflateStream.CopyTo(memoryStreamOutput); } return Encoding.UTF8.GetString(memoryStreamOutput.ToArray()); } } } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/DirectoryHelpers.cs ================================================ namespace OJS.Common.Extensions { using System.IO; public static class DirectoryHelpers { public static string CreateTempDirectory() { while (true) { var randomDirectoryName = Path.GetRandomFileName(); var path = Path.Combine(Path.GetTempPath(), randomDirectoryName); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); return path; } } } public static void SafeDeleteDirectory(string path, bool recursive = false) { if (Directory.Exists(path)) { var searchOption = recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; Directory.EnumerateFileSystemEntries(path, "*", searchOption).ForEach(x => File.SetAttributes(x, FileAttributes.Normal)); Directory.Delete(path, recursive); } } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/EnumExtensions.cs ================================================ namespace OJS.Common.Extensions { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using OJS.Common.Attributes; public static class EnumExtensions { public static string GetDisplayName(this T enumerationValue) { return GetDisplayName(enumerationValue, typeof(DisplayAttribute)); } /// /// Extends the enumeration so that if it has Description attribute on top of the value, it can be taken as a friendly text instead of the basic ToString method /// /// Type of the enumeration. /// Enum description public static string GetDescription(this T enumerationValue) where T : struct { return GetEnumDescription(enumerationValue, typeof(DescriptionAttribute)); } public static string GetLocalizedDescription(this T enumerationValue) where T : struct { return GetEnumDescription(enumerationValue, typeof(LocalizedDescriptionAttribute)); } private static string GetEnumDescription(this T enumerationValue, Type descriptionType) { var type = enumerationValue.GetType(); if (!type.IsEnum) { throw new ArgumentException("EnumerationValue must be of Enum type", nameof(enumerationValue)); } // Tries to find a DescriptionAttribute for a potential friendly name for the enum var memberInfo = type.GetMember(enumerationValue.ToString()); if (memberInfo.Length > 0) { var customAttributes = memberInfo[0].GetCustomAttributes(descriptionType, false); if (customAttributes.Length > 0) { // Pull out the description value return ((DescriptionAttribute)customAttributes[0]).Description; } } // If we have no description attribute, just return the ToString of the enum return enumerationValue.ToString(); } private static string GetDisplayName(this T value, Type descriptionType) { var type = value.GetType(); var memberInfo = type.GetMember(value.ToString()); if (memberInfo.Length > 0) { var customAttributes = memberInfo[0].GetCustomAttributes(descriptionType, false); if (customAttributes.Length > 0) { // Pull out the name value return ((DisplayAttribute)customAttributes[0]).Name; } } return value.ToString(); } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/ExecutionStrategyTypeExtensions.cs ================================================ namespace OJS.Common.Extensions { using OJS.Common.Models; public static class ExecutionStrategyTypeExtensions { public static string GetFileExtension(this ExecutionStrategyType executionStrategyType) { switch (executionStrategyType) { case ExecutionStrategyType.CompileExecuteAndCheck: return null; // The file extension depends on the compiler. case ExecutionStrategyType.NodeJsPreprocessExecuteAndCheck: return "js"; case ExecutionStrategyType.PythonExecuteAndCheck: return "py"; default: return null; } } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/FileHelpers.cs ================================================ namespace OJS.Common.Extensions { using System.IO; // TODO: Unit test public static class FileHelpers { public static string SaveStringToTempFile(string stringToWrite) { var tempFilePath = Path.GetTempFileName(); File.WriteAllText(tempFilePath, stringToWrite); return tempFilePath; } public static string SaveByteArrayToTempFile(byte[] dataToWrite) { var tempFilePath = Path.GetTempFileName(); File.WriteAllBytes(tempFilePath, dataToWrite); return tempFilePath; } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/IEnumerableExtensions.cs ================================================ namespace OJS.Common.Extensions { using System; using System.Collections.Generic; public static class IEnumerableExtensions { public static void ForEach(this IEnumerable enumerable, Action action) { foreach (var item in enumerable) { action(item); } } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/ObjectExtensions.cs ================================================ namespace OJS.Common.Extensions { using System; public static class ObjectExtensions { public static T CastTo(this object obj) { var result = Activator.CreateInstance(typeof(T)); foreach (var property in obj.GetType().GetProperties()) { try { result.GetType().GetProperty(property.Name).SetValue(result, property.GetValue(obj)); } catch { } } return (T)result; } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/PlagiarismDetectorTypeExtensions.cs ================================================ namespace OJS.Common.Extensions { using System; using OJS.Common.Models; public static class PlagiarismDetectorTypeExtensions { public static CompilerType[] GetCompatibleCompilerTypes(this PlagiarismDetectorType plagiarismDetectorType) { switch (plagiarismDetectorType) { case PlagiarismDetectorType.CSharpCompileDisassemble: return new[] { CompilerType.CSharp }; case PlagiarismDetectorType.JavaCompileDisassemble: return new[] { CompilerType.Java }; case PlagiarismDetectorType.PlainText: return new[] { CompilerType.None, CompilerType.CSharp, CompilerType.CPlusPlusGcc, CompilerType.Java, }; default: throw new ArgumentOutOfRangeException( nameof(plagiarismDetectorType), plagiarismDetectorType, null); } } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/StreamExtensions.cs ================================================ namespace OJS.Common.Extensions { using System.IO; public static class StreamExtensions { public static byte[] ToByteArray(this Stream input) { var buffer = new byte[16 * 1024]; using (var memoryStream = new MemoryStream()) { int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { memoryStream.Write(buffer, 0, read); } return memoryStream.ToArray(); } } public static Stream ToStream(this byte[] input) { var fileStream = new MemoryStream(input) { Position = 0 }; return fileStream; } } } ================================================ FILE: Open Judge System/OJS.Common/Extensions/StringExtensions.cs ================================================ namespace OJS.Common.Extensions { using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; public static class StringExtensions { public static DateTime TryGetDate(this string date) { try { return DateTime.ParseExact(date, "dd/MM/yyyy", null); } catch (Exception) { return new DateTime(2010, 1, 1); } } public static byte[] ToByteArray(this string sourceString) { var encoding = new UTF8Encoding(); return encoding.GetBytes(sourceString); } public static int ToInteger(this string input) { int integerValue; int.TryParse(input, out integerValue); return integerValue; } public static string ToUrl(this string uglyString) { var resultString = new StringBuilder(uglyString.Length); bool isLastCharacterDash = false; uglyString = uglyString.Replace("C#", "CSharp"); uglyString = uglyString.Replace("C++", "CPlusPlus"); foreach (var character in uglyString) { if (char.IsLetterOrDigit(character)) { resultString.Append(character); isLastCharacterDash = false; } else if (!isLastCharacterDash) { resultString.Append('-'); isLastCharacterDash = true; } } return resultString.ToString().Trim('-'); } public static string Repeat(this string input, int count) { var builder = new StringBuilder((input?.Length ?? 0) * count); for (int i = 0; i < count; i++) { builder.Append(input); } return builder.ToString(); } public static string GetFileExtension(this string fileName) { if (string.IsNullOrWhiteSpace(fileName)) { return string.Empty; } string[] fileParts = fileName.Split(new[] { "." }, StringSplitOptions.None); if (fileParts.Length == 1 || string.IsNullOrEmpty(fileParts.Last())) { return string.Empty; } return fileParts.Last().Trim().ToLower(); } public static string MaxLength(this string stringToTrim, int maxLength) { if (stringToTrim == null || stringToTrim.Length <= maxLength) { return stringToTrim; } return stringToTrim.Substring(0, maxLength); } // TODO: Unit test public static string MaxLengthWithEllipsis(this string stringToTrim, int maxLength) { if (stringToTrim == null || stringToTrim.Length <= maxLength) { return stringToTrim; } return stringToTrim.Substring(0, maxLength) + "..."; } // TODO: Test public static IEnumerable GetStringsBetween(this string stringToParse, string beforeString, string afterString) { var regEx = new Regex(Regex.Escape(beforeString) + "(.*?)" + Regex.Escape(afterString), RegexOptions.Singleline | RegexOptions.Compiled); var matches = regEx.Matches(stringToParse); foreach (Match match in matches) { yield return match.Groups[1].Value; } } // TODO: Test public static string GetStringBetween(this string stringToParse, string beforeString, string afterString) { var strings = stringToParse.GetStringsBetween(beforeString, afterString).ToList(); if (!strings.Any()) { return null; } return strings[0]; } public static string GetStringWithEllipsisBetween(this string input, int startIndex, int endIndex) { string result = null; if (input != null) { if (startIndex == endIndex) { result = string.Empty; } else { const string Ellipsis = "..."; result = string.Format( "{0}{1}{2}", startIndex > Ellipsis.Length ? Ellipsis : string.Empty, input.Substring(startIndex, endIndex - startIndex), input.Length - endIndex > Ellipsis.Length ? Ellipsis : string.Empty); } } return result; } public static int GetFirstDifferenceIndexWith(this string input, string other, bool ignoreCase = false) { var firstDifferenceIndex = -1; if (input != null && other != null) { var maxIndex = Math.Min(input.Length, other.Length); for (var i = 0; i < maxIndex; i++) { var areEqualChars = ignoreCase ? char.ToUpperInvariant(input[i]) == char.ToUpperInvariant(other[i]) : input[i] == other[i]; if (!areEqualChars) { firstDifferenceIndex = i; break; } } if (firstDifferenceIndex < 0 && input.Length != other.Length) { firstDifferenceIndex = maxIndex; } } if (input == null ^ other == null) { firstDifferenceIndex = 0; } return firstDifferenceIndex; } // TODO: Test public static string ToValidFileName(this string input) { var invalidCharacters = Path.GetInvalidFileNameChars(); var fixedString = new StringBuilder(input); foreach (var ch in invalidCharacters) { fixedString.Replace(ch, '_'); } return fixedString.ToString(); } // TODO: Test public static string ToValidFilePath(this string input) { var invalidCharacters = Path.GetInvalidPathChars(); var fixedString = new StringBuilder(input); foreach (var ch in invalidCharacters) { fixedString.Replace(ch, '_'); } return fixedString.ToString(); } public static string PascalCaseToText(this string input) { if (input == null) { return null; } const char WhiteSpace = ' '; var result = new StringBuilder(); var currentWord = new StringBuilder(); var abbreviation = new StringBuilder(); char previous = WhiteSpace; bool inWord = false; bool isAbbreviation = false; for (int i = 0; i < input.Length; i++) { char symbolToAdd = input[i]; if (char.IsUpper(symbolToAdd) && previous == WhiteSpace && !inWord) { inWord = true; isAbbreviation = true; abbreviation.Append(symbolToAdd); } else if (char.IsUpper(symbolToAdd) && inWord) { abbreviation.Append(symbolToAdd); currentWord.Append(WhiteSpace); symbolToAdd = char.ToLower(symbolToAdd); } else if (char.IsLower(symbolToAdd) && inWord) { isAbbreviation = false; } else if (symbolToAdd == WhiteSpace) { result.Append(isAbbreviation && abbreviation.Length > 1 ? abbreviation.ToString() : currentWord.ToString()); currentWord.Clear(); abbreviation.Clear(); if (result.Length > 0) { abbreviation.Append(WhiteSpace); } inWord = false; isAbbreviation = false; } previous = symbolToAdd; currentWord.Append(symbolToAdd); } if (currentWord.Length > 0) { result.Append(isAbbreviation && abbreviation.Length > 1 ? abbreviation.ToString() : currentWord.ToString()); } return result.ToString(); } } } ================================================ FILE: Open Judge System/OJS.Common/GlobalConstants.cs ================================================ namespace OJS.Common { public static class GlobalConstants { // TempData dictionary keys public const string InfoMessage = "InfoMessage"; public const string DangerMessage = "DangerMessage"; // ModelState dictionary keys public const string DateTimeError = "DateTimeError"; // Action names public const string Index = "Index"; // Partial views public const string QuickContestsGrid = "_QuickContestsGrid"; // Other public const string ExcelMimeType = "application/vnd.ms-excel"; public const string JsonMimeType = "application/json"; public const string ZipMimeType = "application/zip"; public const string BinaryFileMimeType = "application/octet-stream"; public const string ZipFileExtension = ".zip"; public const string ExecutableFileExtension = ".exe"; public const string AdministratorRoleName = "Administrator"; public const string EmailRegEx = "^[A-Za-z0-9]+[\\._A-Za-z0-9-]+@([A-Za-z0-9]+[-\\.]?[A-Za-z0-9]+)+(\\.[A-Za-z0-9]+[-\\.]?[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; public const int FileExtentionMaxLength = 4; public const int IpAdressMaxLength = 45; public const int MinimumSearchTermLength = 3; public const int FeedbackContentMinLength = 10; public const int DefaultProcessExitTimeOutMilliseconds = 5000; // ms // Account public const int UserNameMaxLength = 15; public const int UserNameMinLength = 5; public const string UserNameRegEx = @"^[a-zA-Z]([/._]?[a-zA-Z0-9]+)+$"; public const int PasswordMinLength = 6; public const int PasswordMaxLength = 100; public const int EmailMaxLength = 80; public const int FirstNameMaxLength = 30; public const int LastNameMaxLength = 30; public const int CityNameMaxLength = 30; public const int EducationalInstitutionMaxLength = 50; public const int FacultyNumberMaxLength = 30; public const int CompanyNameMaxLength = 30; public const int JobTitleMaxLenth = 30; // News public const int NewsTitleMaxLength = 200; public const int NewsTitleMinLength = 1; public const int NewsAuthorNameMaxLength = 25; public const int NewsAuthorNameMinLength = 2; public const int NewsSourceMaxLength = 50; public const int NewsSourceMinLength = 6; public const int NewsContentMinLength = 10; // Contests public const int ContestNameMaxLength = 100; public const int ContestNameMinLength = 4; public const int ContestPasswordMaxLength = 20; public const int ContestCategoryNameMaxLength = 100; public const int ContestCategoryNameMinLength = 6; public const int ContestQuestionMaxLength = 100; public const int ContestQuestionMinLength = 1; public const int ContestQuestionAnswerMaxLength = 100; public const int ContestQuestionAnswerMinLength = 1; // Administration public const int CheckerNameMaxLength = 100; public const int CheckerNameMinLength = 1; public const int ProblemNameMaxLength = 50; public const int ProblemDefaultMaximumPoints = 100; public const int ProblemDefaultTimeLimit = 1000; public const int ProblemDefaultMemoryLimit = 32 * 1024 * 1024; public const int ProblemResourceNameMaxLength = 50; public const int ProblemResourceNameMinLength = 3; public const int SubmissionTypeNameMaxLength = 100; public const int SubmissionTypeNameMinLength = 1; public const int TestInputMinLength = 1; public const int TestOutputMinLength = 1; // Submission public const string ContentAsStringErrorMessage = "This is a binary file (not a text submission)."; } } ================================================ FILE: Open Judge System/OJS.Common/MailSender.cs ================================================ namespace OJS.Common { using System.Collections.Generic; using System.Net.Mail; using System.Text; public sealed class MailSender { // TODO: Extract user, address and password as app.config settings private const string SendFrom = "telerikacademy@telerik.com"; private const string SendFromName = "BGCoder.com"; private const string Password = "__YOUR_PASSWORD_HERE__"; private const string ServerAddress = "127.0.0.1"; private const int ServerPort = 25; private static readonly object SyncRoot = new object(); private static MailSender instance; private readonly SmtpClient mailClient; private MailSender() { this.mailClient = new SmtpClient { Host = "127.0.0.1", Port = 25, DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory, PickupDirectoryLocation = @"C:\inetpub\mailroot\Pickup" }; } public static MailSender Instance { get { if (instance == null) { lock (SyncRoot) { if (instance == null) { instance = new MailSender(); } } } return instance; } } public void SendMailAsync(string recipient, string subject, string messageBody, IEnumerable bccRecipients = null) { var message = this.PrepareMessage(recipient, subject, messageBody, bccRecipients); this.mailClient.SendAsync(message, null); } public void SendMail(string recipient, string subject, string messageBody, IEnumerable bccRecipients = null) { var message = this.PrepareMessage(recipient, subject, messageBody, bccRecipients); this.mailClient.Send(message); } private MailMessage PrepareMessage(string recipient, string subject, string messageBody, IEnumerable bccRecipients) { var mailTo = new MailAddress(recipient); var mailFrom = new MailAddress(SendFrom, SendFromName); var message = new MailMessage(mailFrom, mailTo) { Body = messageBody, BodyEncoding = Encoding.UTF8, IsBodyHtml = true, Subject = subject, SubjectEncoding = Encoding.UTF8, }; if (bccRecipients != null) { foreach (var bccRecipient in bccRecipients) { message.Bcc.Add(bccRecipient); } } return message; } } } ================================================ FILE: Open Judge System/OJS.Common/Models/CompilerType.cs ================================================ namespace OJS.Common.Models { public enum CompilerType { None = 0, CSharp = 1, MsBuild = 2, CPlusPlusGcc = 3, Java = 4, JavaZip = 5, } } ================================================ FILE: Open Judge System/OJS.Common/Models/ContestQuestionType.cs ================================================ namespace OJS.Common.Models { using OJS.Common.Attributes; using Resource = Resources.Enums.EnumTranslations; public enum ContestQuestionType { [LocalizedDescription("Default", typeof(Resource))] Default = 0, // If possible answers available then DropDown, else text box [LocalizedDescription("DropDown", typeof(Resource))] DropDown = 1, [LocalizedDescription("TextBox", typeof(Resource))] TextBox = 2, [LocalizedDescription("MultiLineTextBox", typeof(Resource))] MultiLineTextBox = 3, } } ================================================ FILE: Open Judge System/OJS.Common/Models/ExecutionStrategyType.cs ================================================ namespace OJS.Common.Models { public enum ExecutionStrategyType { DoNothing = 0, CompileExecuteAndCheck = 1, CSharpTestRunner = 9, NodeJsPreprocessExecuteAndCheck = 2, NodeJsPreprocessExecuteAndRunUnitTestsWithMocha = 7, IoJsPreprocessExecuteAndRunJsDomUnitTests = 8, RemoteExecution = 3, JavaPreprocessCompileExecuteAndCheck = 4, JavaZipFileCompileExecuteAndCheck = 10, PythonExecuteAndCheck = 11, PhpCgiExecuteAndCheck = 5, PhpCliExecuteAndCheck = 6 } } ================================================ FILE: Open Judge System/OJS.Common/Models/PlagiarismDetectorType.cs ================================================ namespace OJS.Common.Models { using OJS.Common.Attributes; using Resource = Resources.Enums.EnumTranslations; public enum PlagiarismDetectorType { [LocalizedDescription("CSharpCompileDisassemble", typeof(Resource))] CSharpCompileDisassemble = 1, [LocalizedDescription("JavaCompileDisassemble", typeof(Resource))] JavaCompileDisassemble = 2, [LocalizedDescription("PlainText", typeof(Resource))] PlainText = 3, } } ================================================ FILE: Open Judge System/OJS.Common/Models/ProblemResourceType.cs ================================================ namespace OJS.Common.Models { using OJS.Common.Attributes; using Resource = Resources.Enums.EnumTranslations; public enum ProblemResourceType { [LocalizedDescription("ProblemDescription", typeof(Resource))] ProblemDescription = 1, [LocalizedDescription("AuthorsSolution", typeof(Resource))] AuthorsSolution = 2, [LocalizedDescription("Video", typeof(Resource))] Video = 3, } } ================================================ FILE: Open Judge System/OJS.Common/Models/TestRunResultType.cs ================================================ namespace OJS.Common.Models { public enum TestRunResultType { CorrectAnswer = 0, WrongAnswer = 1, TimeLimit = 2, MemoryLimit = 3, RunTimeError = 4, } } ================================================ FILE: Open Judge System/OJS.Common/OJS.Common.csproj ================================================  Debug AnyCPU {69B10B02-22CF-47D6-B5F3-8A5FFB7DC771} Library Properties OJS.Common OJS.Common v4.5 512 ..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\Rules.ruleset True True EnumTranslations.bg.resx True True EnumTranslations.resx PublicResXFileCodeGenerator EnumTranslations.bg.Designer.cs Resources.Enums PublicResXFileCodeGenerator EnumTranslations.Designer.cs Resources.Enums ================================================ FILE: Open Judge System/OJS.Common/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Common")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Common")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("db703e57-8e0e-4f24-ab82-6b76e106304f")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/OJS.Common/Resources/Enums/EnumTranslations.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Enums { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class EnumTranslations { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal EnumTranslations() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Common.Resources.Enums.EnumTranslations", typeof(EnumTranslations).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Authors Solution. /// public static string AuthorsSolution { get { return ResourceManager.GetString("AuthorsSolution", resourceCulture); } } /// /// Looks up a localized string similar to C# code. /// public static string CSharpCompileDisassemble { get { return ResourceManager.GetString("CSharpCompileDisassemble", resourceCulture); } } /// /// Looks up a localized string similar to Default. /// public static string Default { get { return ResourceManager.GetString("Default", resourceCulture); } } /// /// Looks up a localized string similar to DropDown. /// public static string DropDown { get { return ResourceManager.GetString("DropDown", resourceCulture); } } /// /// Looks up a localized string similar to Java code. /// public static string JavaCompileDisassemble { get { return ResourceManager.GetString("JavaCompileDisassemble", resourceCulture); } } /// /// Looks up a localized string similar to MultiLine TextBox. /// public static string MultiLineTextBox { get { return ResourceManager.GetString("MultiLineTextBox", resourceCulture); } } /// /// Looks up a localized string similar to Plain text. /// public static string PlainText { get { return ResourceManager.GetString("PlainText", resourceCulture); } } /// /// Looks up a localized string similar to Problem Description. /// public static string ProblemDescription { get { return ResourceManager.GetString("ProblemDescription", resourceCulture); } } /// /// Looks up a localized string similar to TextBox. /// public static string TextBox { get { return ResourceManager.GetString("TextBox", resourceCulture); } } /// /// Looks up a localized string similar to Video. /// public static string Video { get { return ResourceManager.GetString("Video", resourceCulture); } } } } ================================================ FILE: Open Judge System/OJS.Common/Resources/Enums/EnumTranslations.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/OJS.Common/Resources/Enums/EnumTranslations.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Авторско решение C# код По подразбиране Dropdown лист Java код Многоредов текст Текст Условие Едноредов текст Видео ================================================ FILE: Open Judge System/OJS.Common/Resources/Enums/EnumTranslations.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Authors Solution C# code Default DropDown Java code MultiLine TextBox Plain text Problem Description TextBox Video ================================================ FILE: Open Judge System/OJS.Common/SynchronizedHashtable.cs ================================================ namespace OJS.Common { using System; using System.Collections; public class SynchronizedHashtable { private readonly Hashtable hashtable; public SynchronizedHashtable() { var unsynchronizedHashtable = new Hashtable(); this.hashtable = Hashtable.Synchronized(unsynchronizedHashtable); } public bool Contains(object value) { return this.hashtable.ContainsKey(value); } public bool Add(object value) { if (this.hashtable.ContainsKey(value)) { return false; } try { this.hashtable.Add(value, true); return true; } catch (ArgumentException) { // The item is already in the hashtable. return false; } } public void Remove(object value) { this.hashtable.Remove(value); } } } ================================================ FILE: Open Judge System/OJS.Common/packages.config ================================================  ================================================ FILE: Open Judge System/Open Judge System.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web", "Web", "{93034417-0AAA-4E72-84EA-767DB4EF5283}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workers", "Workers", "{BCDBCB6C-55D6-40E7-83FB-9A678E203A9E}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{9DAC057C-7607-48F0-B961-70BAAF4C368A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{699277CE-89E7-4F00-A8BF-96A8450529E9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Data.Models", "Data\OJS.Data.Models\OJS.Data.Models.csproj", "{341CA732-D483-4487-923E-27ED2A6E9A4F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Web", "Web\OJS.Web\OJS.Web.csproj", "{C2EF4F1B-A694-4E52-935C-7872F6CAD37C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Data", "Data\OJS.Data\OJS.Data.csproj", "{1807194C-9E25-4365-B3BE-FE1DF627612B}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Data.Contracts", "Data\OJS.Data.Contracts\OJS.Data.Contracts.csproj", "{8C4BF453-24EF-46F3-B947-31505FB905DE}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "External Libraries", "External Libraries", "{3003E3B3-84A6-48E8-8252-B532A5086EB1}" ProjectSection(SolutionItems) = preProject External Libraries\Kendo.Mvc.dll = External Libraries\Kendo.Mvc.dll External Libraries\Kendo.Mvc.README = External Libraries\Kendo.Mvc.README External Libraries\Kendo.Mvc.xml = External Libraries\Kendo.Mvc.xml EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Tests.Common", "Tests\OJS.Tests.Common\OJS.Tests.Common.csproj", "{01CC0B02-529E-4D5F-B345-0B92F6920854}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{B0824D7E-8597-4CC2-AEB2-EED1CDBFD007}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Common", "Workers\OJS.Workers.Common\OJS.Workers.Common.csproj", "{7F714D0B-CE81-4DD7-B6B2-62080FE22CD8}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Checkers", "Workers\OJS.Workers.Checkers\OJS.Workers.Checkers.csproj", "{93EC1D66-2CE1-4682-AC09-C8C40178A9AD}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Common.Tests", "Tests\OJS.Common.Tests\OJS.Common.Tests.csproj", "{F4AD07BC-B932-4D09-82D8-9800C9260B33}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Controller", "Workers\OJS.Workers.Controller\OJS.Workers.Controller.csproj", "{1D0C9F0C-5A84-453B-BB49-A8CD86FFAE7A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Agent", "Workers\OJS.Workers.Agent\OJS.Workers.Agent.csproj", "{CE54BB68-B790-47F4-8412-58C2BAC900BD}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Checkers.Tests", "Tests\OJS.Workers.Checkers.Tests\OJS.Workers.Checkers.Tests.csproj", "{73B7CEF9-1843-4EFB-B9BF-E2A0492613A8}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Executors", "Workers\OJS.Workers.Executors\OJS.Workers.Executors.csproj", "{CDA78D62-7210-45CA-B3E5-9F6A5DEA5734}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Compilers", "Workers\OJS.Workers.Compilers\OJS.Workers.Compilers.csproj", "{8570183B-9D7A-408D-9EA6-F86F59B05A10}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SandboxExecutorProofOfConcept", "Tools\SandboxExecutorProofOfConcept\SandboxExecutorProofOfConcept.csproj", "{EB599E35-73C7-4FD7-BA38-BE6FB6E60C8E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SandboxTarget", "Tools\SandboxTarget\SandboxTarget.csproj", "{D51F7D60-421C-44B2-9422-2610066CB82D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Executors.Tests", "Tests\OJS.Workers.Executors.Tests\OJS.Workers.Executors.Tests.csproj", "{5054FE58-791D-41EA-9ED9-911788A7E631}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Web.Common", "Web\OJS.Web.Common\OJS.Web.Common.csproj", "{2E08E0AF-0E51-47CA-947B-4C66086FA030}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Common", "OJS.Common\OJS.Common.csproj", "{69B10B02-22CF-47D6-B5F3-8A5FFB7DC771}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.LocalWorker", "Workers\OJS.Workers.LocalWorker\OJS.Workers.LocalWorker.csproj", "{5D3361F8-F50B-415F-826A-724DCDAA4A89}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.ExecutionStrategies", "Workers\OJS.Workers.ExecutionStrategies\OJS.Workers.ExecutionStrategies.csproj", "{69966098-E5B2-46CD-88E9-1F79B245ADE0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Compilers.Tests", "Tests\OJS.Workers.Compilers.Tests\OJS.Workers.Compilers.Tests.csproj", "{A6A4AB27-2B67-4E8D-BAA6-2FDBB8366CCE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Tools", "Workers\OJS.Workers.Tools\OJS.Workers.Tools.csproj", "{A1F48412-495A-434C-BDD0-E70AEDAD6897}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.Tools.Tests", "Tests\OJS.Workers.Tools.Tests\OJS.Workers.Tools.Tests.csproj", "{EE0CE0F5-BAF8-4AA9-83E8-84881CDABFB1}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OJS.Workers.ExecutionStrategies.Tests", "Tests\OJS.Workers.ExecutionStrategies.Tests\OJS.Workers.ExecutionStrategies.Tests.csproj", "{1A12AF9D-5BD6-455E-924E-54E686A2F270}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlTestingPoC", "Tools\SqlTestingPoC\SqlTestingPoC.csproj", "{2AE356DA-FCD4-4601-A533-85042648D7F8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {341CA732-D483-4487-923E-27ED2A6E9A4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {341CA732-D483-4487-923E-27ED2A6E9A4F}.Debug|Any CPU.Build.0 = Debug|Any CPU {341CA732-D483-4487-923E-27ED2A6E9A4F}.Release|Any CPU.ActiveCfg = Release|Any CPU {341CA732-D483-4487-923E-27ED2A6E9A4F}.Release|Any CPU.Build.0 = Release|Any CPU {C2EF4F1B-A694-4E52-935C-7872F6CAD37C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C2EF4F1B-A694-4E52-935C-7872F6CAD37C}.Debug|Any CPU.Build.0 = Debug|Any CPU {C2EF4F1B-A694-4E52-935C-7872F6CAD37C}.Release|Any CPU.ActiveCfg = Release|Any CPU {C2EF4F1B-A694-4E52-935C-7872F6CAD37C}.Release|Any CPU.Build.0 = Release|Any CPU {1807194C-9E25-4365-B3BE-FE1DF627612B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1807194C-9E25-4365-B3BE-FE1DF627612B}.Debug|Any CPU.Build.0 = Debug|Any CPU {1807194C-9E25-4365-B3BE-FE1DF627612B}.Release|Any CPU.ActiveCfg = Release|Any CPU {1807194C-9E25-4365-B3BE-FE1DF627612B}.Release|Any CPU.Build.0 = Release|Any CPU {8C4BF453-24EF-46F3-B947-31505FB905DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C4BF453-24EF-46F3-B947-31505FB905DE}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C4BF453-24EF-46F3-B947-31505FB905DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C4BF453-24EF-46F3-B947-31505FB905DE}.Release|Any CPU.Build.0 = Release|Any CPU {01CC0B02-529E-4D5F-B345-0B92F6920854}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {01CC0B02-529E-4D5F-B345-0B92F6920854}.Debug|Any CPU.Build.0 = Debug|Any CPU {01CC0B02-529E-4D5F-B345-0B92F6920854}.Release|Any CPU.ActiveCfg = Release|Any CPU {01CC0B02-529E-4D5F-B345-0B92F6920854}.Release|Any CPU.Build.0 = Release|Any CPU {7F714D0B-CE81-4DD7-B6B2-62080FE22CD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7F714D0B-CE81-4DD7-B6B2-62080FE22CD8}.Debug|Any CPU.Build.0 = Debug|Any CPU {7F714D0B-CE81-4DD7-B6B2-62080FE22CD8}.Release|Any CPU.ActiveCfg = Release|Any CPU {7F714D0B-CE81-4DD7-B6B2-62080FE22CD8}.Release|Any CPU.Build.0 = Release|Any CPU {93EC1D66-2CE1-4682-AC09-C8C40178A9AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93EC1D66-2CE1-4682-AC09-C8C40178A9AD}.Debug|Any CPU.Build.0 = Debug|Any CPU {93EC1D66-2CE1-4682-AC09-C8C40178A9AD}.Release|Any CPU.ActiveCfg = Release|Any CPU {93EC1D66-2CE1-4682-AC09-C8C40178A9AD}.Release|Any CPU.Build.0 = Release|Any CPU {F4AD07BC-B932-4D09-82D8-9800C9260B33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F4AD07BC-B932-4D09-82D8-9800C9260B33}.Debug|Any CPU.Build.0 = Debug|Any CPU {F4AD07BC-B932-4D09-82D8-9800C9260B33}.Release|Any CPU.ActiveCfg = Release|Any CPU {F4AD07BC-B932-4D09-82D8-9800C9260B33}.Release|Any CPU.Build.0 = Release|Any CPU {1D0C9F0C-5A84-453B-BB49-A8CD86FFAE7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1D0C9F0C-5A84-453B-BB49-A8CD86FFAE7A}.Debug|Any CPU.Build.0 = Debug|Any CPU {1D0C9F0C-5A84-453B-BB49-A8CD86FFAE7A}.Release|Any CPU.ActiveCfg = Release|Any CPU {1D0C9F0C-5A84-453B-BB49-A8CD86FFAE7A}.Release|Any CPU.Build.0 = Release|Any CPU {CE54BB68-B790-47F4-8412-58C2BAC900BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CE54BB68-B790-47F4-8412-58C2BAC900BD}.Debug|Any CPU.Build.0 = Debug|Any CPU {CE54BB68-B790-47F4-8412-58C2BAC900BD}.Release|Any CPU.ActiveCfg = Release|Any CPU {CE54BB68-B790-47F4-8412-58C2BAC900BD}.Release|Any CPU.Build.0 = Release|Any CPU {73B7CEF9-1843-4EFB-B9BF-E2A0492613A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73B7CEF9-1843-4EFB-B9BF-E2A0492613A8}.Debug|Any CPU.Build.0 = Debug|Any CPU {73B7CEF9-1843-4EFB-B9BF-E2A0492613A8}.Release|Any CPU.ActiveCfg = Release|Any CPU {73B7CEF9-1843-4EFB-B9BF-E2A0492613A8}.Release|Any CPU.Build.0 = Release|Any CPU {CDA78D62-7210-45CA-B3E5-9F6A5DEA5734}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CDA78D62-7210-45CA-B3E5-9F6A5DEA5734}.Debug|Any CPU.Build.0 = Debug|Any CPU {CDA78D62-7210-45CA-B3E5-9F6A5DEA5734}.Release|Any CPU.ActiveCfg = Release|Any CPU {CDA78D62-7210-45CA-B3E5-9F6A5DEA5734}.Release|Any CPU.Build.0 = Release|Any CPU {8570183B-9D7A-408D-9EA6-F86F59B05A10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8570183B-9D7A-408D-9EA6-F86F59B05A10}.Debug|Any CPU.Build.0 = Debug|Any CPU {8570183B-9D7A-408D-9EA6-F86F59B05A10}.Release|Any CPU.ActiveCfg = Release|Any CPU {8570183B-9D7A-408D-9EA6-F86F59B05A10}.Release|Any CPU.Build.0 = Release|Any CPU {EB599E35-73C7-4FD7-BA38-BE6FB6E60C8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EB599E35-73C7-4FD7-BA38-BE6FB6E60C8E}.Debug|Any CPU.Build.0 = Debug|Any CPU {EB599E35-73C7-4FD7-BA38-BE6FB6E60C8E}.Release|Any CPU.ActiveCfg = Release|Any CPU {EB599E35-73C7-4FD7-BA38-BE6FB6E60C8E}.Release|Any CPU.Build.0 = Release|Any CPU {D51F7D60-421C-44B2-9422-2610066CB82D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D51F7D60-421C-44B2-9422-2610066CB82D}.Debug|Any CPU.Build.0 = Debug|Any CPU {D51F7D60-421C-44B2-9422-2610066CB82D}.Release|Any CPU.ActiveCfg = Release|Any CPU {D51F7D60-421C-44B2-9422-2610066CB82D}.Release|Any CPU.Build.0 = Release|Any CPU {5054FE58-791D-41EA-9ED9-911788A7E631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5054FE58-791D-41EA-9ED9-911788A7E631}.Debug|Any CPU.Build.0 = Debug|Any CPU {5054FE58-791D-41EA-9ED9-911788A7E631}.Release|Any CPU.ActiveCfg = Release|Any CPU {5054FE58-791D-41EA-9ED9-911788A7E631}.Release|Any CPU.Build.0 = Release|Any CPU {2E08E0AF-0E51-47CA-947B-4C66086FA030}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E08E0AF-0E51-47CA-947B-4C66086FA030}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E08E0AF-0E51-47CA-947B-4C66086FA030}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E08E0AF-0E51-47CA-947B-4C66086FA030}.Release|Any CPU.Build.0 = Release|Any CPU {69B10B02-22CF-47D6-B5F3-8A5FFB7DC771}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {69B10B02-22CF-47D6-B5F3-8A5FFB7DC771}.Debug|Any CPU.Build.0 = Debug|Any CPU {69B10B02-22CF-47D6-B5F3-8A5FFB7DC771}.Release|Any CPU.ActiveCfg = Release|Any CPU {69B10B02-22CF-47D6-B5F3-8A5FFB7DC771}.Release|Any CPU.Build.0 = Release|Any CPU {5D3361F8-F50B-415F-826A-724DCDAA4A89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5D3361F8-F50B-415F-826A-724DCDAA4A89}.Debug|Any CPU.Build.0 = Debug|Any CPU {5D3361F8-F50B-415F-826A-724DCDAA4A89}.Release|Any CPU.ActiveCfg = Release|Any CPU {5D3361F8-F50B-415F-826A-724DCDAA4A89}.Release|Any CPU.Build.0 = Release|Any CPU {69966098-E5B2-46CD-88E9-1F79B245ADE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {69966098-E5B2-46CD-88E9-1F79B245ADE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {69966098-E5B2-46CD-88E9-1F79B245ADE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {69966098-E5B2-46CD-88E9-1F79B245ADE0}.Release|Any CPU.Build.0 = Release|Any CPU {A6A4AB27-2B67-4E8D-BAA6-2FDBB8366CCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A6A4AB27-2B67-4E8D-BAA6-2FDBB8366CCE}.Debug|Any CPU.Build.0 = Debug|Any CPU {A6A4AB27-2B67-4E8D-BAA6-2FDBB8366CCE}.Release|Any CPU.ActiveCfg = Release|Any CPU {A6A4AB27-2B67-4E8D-BAA6-2FDBB8366CCE}.Release|Any CPU.Build.0 = Release|Any CPU {A1F48412-495A-434C-BDD0-E70AEDAD6897}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A1F48412-495A-434C-BDD0-E70AEDAD6897}.Debug|Any CPU.Build.0 = Debug|Any CPU {A1F48412-495A-434C-BDD0-E70AEDAD6897}.Release|Any CPU.ActiveCfg = Release|Any CPU {A1F48412-495A-434C-BDD0-E70AEDAD6897}.Release|Any CPU.Build.0 = Release|Any CPU {EE0CE0F5-BAF8-4AA9-83E8-84881CDABFB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EE0CE0F5-BAF8-4AA9-83E8-84881CDABFB1}.Debug|Any CPU.Build.0 = Debug|Any CPU {EE0CE0F5-BAF8-4AA9-83E8-84881CDABFB1}.Release|Any CPU.ActiveCfg = Release|Any CPU {EE0CE0F5-BAF8-4AA9-83E8-84881CDABFB1}.Release|Any CPU.Build.0 = Release|Any CPU {1A12AF9D-5BD6-455E-924E-54E686A2F270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1A12AF9D-5BD6-455E-924E-54E686A2F270}.Debug|Any CPU.Build.0 = Debug|Any CPU {1A12AF9D-5BD6-455E-924E-54E686A2F270}.Release|Any CPU.ActiveCfg = Release|Any CPU {1A12AF9D-5BD6-455E-924E-54E686A2F270}.Release|Any CPU.Build.0 = Release|Any CPU {2AE356DA-FCD4-4601-A533-85042648D7F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2AE356DA-FCD4-4601-A533-85042648D7F8}.Debug|Any CPU.Build.0 = Debug|Any CPU {2AE356DA-FCD4-4601-A533-85042648D7F8}.Release|Any CPU.ActiveCfg = Release|Any CPU {2AE356DA-FCD4-4601-A533-85042648D7F8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {341CA732-D483-4487-923E-27ED2A6E9A4F} = {699277CE-89E7-4F00-A8BF-96A8450529E9} {C2EF4F1B-A694-4E52-935C-7872F6CAD37C} = {93034417-0AAA-4E72-84EA-767DB4EF5283} {1807194C-9E25-4365-B3BE-FE1DF627612B} = {699277CE-89E7-4F00-A8BF-96A8450529E9} {8C4BF453-24EF-46F3-B947-31505FB905DE} = {699277CE-89E7-4F00-A8BF-96A8450529E9} {01CC0B02-529E-4D5F-B345-0B92F6920854} = {9DAC057C-7607-48F0-B961-70BAAF4C368A} {7F714D0B-CE81-4DD7-B6B2-62080FE22CD8} = {BCDBCB6C-55D6-40E7-83FB-9A678E203A9E} {93EC1D66-2CE1-4682-AC09-C8C40178A9AD} = {BCDBCB6C-55D6-40E7-83FB-9A678E203A9E} {F4AD07BC-B932-4D09-82D8-9800C9260B33} = {9DAC057C-7607-48F0-B961-70BAAF4C368A} {1D0C9F0C-5A84-453B-BB49-A8CD86FFAE7A} = {BCDBCB6C-55D6-40E7-83FB-9A678E203A9E} {CE54BB68-B790-47F4-8412-58C2BAC900BD} = {BCDBCB6C-55D6-40E7-83FB-9A678E203A9E} {73B7CEF9-1843-4EFB-B9BF-E2A0492613A8} = {9DAC057C-7607-48F0-B961-70BAAF4C368A} {CDA78D62-7210-45CA-B3E5-9F6A5DEA5734} = {BCDBCB6C-55D6-40E7-83FB-9A678E203A9E} {8570183B-9D7A-408D-9EA6-F86F59B05A10} = {BCDBCB6C-55D6-40E7-83FB-9A678E203A9E} {EB599E35-73C7-4FD7-BA38-BE6FB6E60C8E} = {B0824D7E-8597-4CC2-AEB2-EED1CDBFD007} {D51F7D60-421C-44B2-9422-2610066CB82D} = {B0824D7E-8597-4CC2-AEB2-EED1CDBFD007} {5054FE58-791D-41EA-9ED9-911788A7E631} = {9DAC057C-7607-48F0-B961-70BAAF4C368A} {2E08E0AF-0E51-47CA-947B-4C66086FA030} = {93034417-0AAA-4E72-84EA-767DB4EF5283} {5D3361F8-F50B-415F-826A-724DCDAA4A89} = {BCDBCB6C-55D6-40E7-83FB-9A678E203A9E} {69966098-E5B2-46CD-88E9-1F79B245ADE0} = {BCDBCB6C-55D6-40E7-83FB-9A678E203A9E} {A6A4AB27-2B67-4E8D-BAA6-2FDBB8366CCE} = {9DAC057C-7607-48F0-B961-70BAAF4C368A} {A1F48412-495A-434C-BDD0-E70AEDAD6897} = {BCDBCB6C-55D6-40E7-83FB-9A678E203A9E} {EE0CE0F5-BAF8-4AA9-83E8-84881CDABFB1} = {9DAC057C-7607-48F0-B961-70BAAF4C368A} {1A12AF9D-5BD6-455E-924E-54E686A2F270} = {9DAC057C-7607-48F0-B961-70BAAF4C368A} {2AE356DA-FCD4-4601-A533-85042648D7F8} = {B0824D7E-8597-4CC2-AEB2-EED1CDBFD007} EndGlobalSection EndGlobal ================================================ FILE: Open Judge System/Rules.ruleset ================================================  ================================================ FILE: Open Judge System/Settings.StyleCop ================================================ False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False at db or up iq it un bg ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/OJS.Common.Tests.csproj ================================================  Debug AnyCPU {F4AD07BC-B932-4D09-82D8-9800C9260B33} Library Properties OJS.Common.Tests OJS.Common.Tests v4.5 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest ..\..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.interfaces.dll False ..\..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.util.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\NUnit.VisualStudio.TestAdapter.dll False {69b10b02-22cf-47d6-b5f3-8a5ffb7dc771} OJS.Common False False False False Este proyecto hace referencia a los paquetes NuGet que faltan en este equipo. Use la restauración de paquetes NuGet para descargarlos. Para obtener más información, consulte http://go.microsoft.com/fwlink/?LinkID=322105. El archivo que falta es {0}. ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Common.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Common.Tests")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("9ce751cc-bd52-4f04-8e07-4463596c6d93")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/StringExtensions/CompressDecompressTests.cs ================================================ namespace OJS.Common.Tests.StringExtensions { using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class CompressDecompressTests { [Test] public void DecompressShouldProduceTheOriginallyCompressedString() { const string InputString = "Николай"; var compressed = InputString.Compress(); var decompressed = compressed.Decompress(); Assert.That(InputString, Is.EqualTo(decompressed)); } } } ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/StringExtensions/GetFileExtensionTests.cs ================================================ namespace OJS.Common.Tests.StringExtensions { using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class GetFileExtensionTests { [Test] public void GetFileExtensionShouldReturnEmptyStringWhenEmptyStringIsPassed() { string expected = string.Empty; string value = string.Empty; string actual = value.GetFileExtension(); Assert.AreEqual(expected, actual); } [Test] public void GetFileExtensionShouldReturnEmptyStringWhenNullIsPassed() { string expected = string.Empty; string actual = ((string)null).GetFileExtension(); Assert.AreEqual(expected, actual); } [Test] public void GetFileExtensionShouldReturnJpgWhenValidImageIsPassed() { string expected = "jpg"; string value = "pic.jpg"; string actual = value.GetFileExtension(); Assert.AreEqual(expected, actual); } [Test] public void GetFileExtensionShouldReturnPngWhenValidImageWithManyDotsIsPassed() { string expected = "png"; string value = "pic.test.value.jpg.png"; string actual = value.GetFileExtension(); Assert.AreEqual(expected, actual); } [Test] public void GetFileExtensionShouldReturnEmptyStringWhenFileDoesNotHaveExtension() { string expected = string.Empty; string value = "testing"; string actual = value.GetFileExtension(); Assert.AreEqual(expected, actual); } [Test] public void GetFileExtensionShouldReturnEmptyStringWhenFileEndsInADot() { string expected = string.Empty; string value = "testing."; string actual = value.GetFileExtension(); Assert.AreEqual(expected, actual); } [Test] public void GetFileExtensionShouldReturnEmptyStringWhenFileContainsManyDotsAndEndsInADot() { string expected = string.Empty; string value = "testing.jpg.value.gosho."; string actual = value.GetFileExtension(); Assert.AreEqual(expected, actual); } } } ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/StringExtensions/GetFirstDifferenceIndexWithTests.cs ================================================ namespace OJS.Common.Tests.StringExtensions { using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class GetFirstDifferenceIndexWithTests { [Test] public void ShouldReturnMinusOneWhenBothStringsAreNull() { const string First = null; const string Second = null; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second); Assert.AreEqual(-1, firstDifferenceIndex); } [Test] public void ShouldReturnZeroWhenParameterStringIsNull() { const string First = "test"; const string Second = null; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second); Assert.AreEqual(0, firstDifferenceIndex); } [Test] public void ShouldReturnZeroWhenInstanceStringIsNull() { const string First = null; const string Second = "test"; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second); Assert.AreEqual(0, firstDifferenceIndex); } [Test] public void ShouldReturnZeroWhenStringsHaveDifferentFirstLetter() { const string First = "string"; const string Second = "test"; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second); Assert.AreEqual(0, firstDifferenceIndex); } [Test] public void ShouldReturnCorrectIndexWhenStringsAreDifferent() { const string First = "testing string"; const string Second = "ten strings"; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second); Assert.AreEqual(2, firstDifferenceIndex); } [Test] public void ShouldReturnMinusOneWhenStringsAreDifferentAndIgnoresCase() { const string First = "testing string"; const string Second = "teStInG strING"; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second, true); Assert.AreEqual(-1, firstDifferenceIndex); } [Test] public void ShouldReturnMinusOneWhenStringsAreEqual() { const string First = "testing string"; const string Second = "testing string"; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second); Assert.AreEqual(-1, firstDifferenceIndex); } [Test] public void ShouldReturnCorrectIndexWhenFirstInstanceStringIsLongerThanParameterString() { const string First = "testing string and more"; const string Second = "testing string"; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second); Assert.AreEqual(Second.Length, firstDifferenceIndex); } [Test] public void ShouldReturnCorrectIndexWhenParameterStringIsLongerThanInstanceString() { const string First = "testing string"; const string Second = "testing string and more"; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second); Assert.AreEqual(First.Length, firstDifferenceIndex); } [Test] public void ShouldReturnMinusOneWhenBothStringsAreNullAndIgnoresCase() { const string First = null; const string Second = null; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second, true); Assert.AreEqual(-1, firstDifferenceIndex); } [Test] public void ShouldReturnCorrectIndexWhenStringsAreDifferentAndIgnoresCase() { const string First = "Testing String"; const string Second = "teStihg string"; var firstDifferenceIndex = First.GetFirstDifferenceIndexWith(Second, true); Assert.AreEqual(5, firstDifferenceIndex); } } } ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/StringExtensions/GetStringBetweenTests.cs ================================================ namespace OJS.Common.Tests.StringExtensions { using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class GetStringBetweenTests { [Test] public void GetStringBetweenShouldReturnProperValueWhenCalledWithSingleCharacters() { const string Value = "Test №10 execution successful!"; const string Expected = "10"; var actual = Value.GetStringBetween("№", " "); Assert.AreEqual(Expected, actual); } [Test] public void GetStringBetweenShouldReturnProperValueWhenCalledWithMultilineText() { const string Value = @"Answer incorrect! Expected output: 1 Your output: 2 Time used (in milliseconds): 21.4844 Memory used (in bytes): 1024000"; const string Expected = @" Expected output: 1 Your output: 2 "; var actual = Value.GetStringBetween("Answer incorrect!", "Time used"); Assert.AreEqual(Expected, actual); } [Test] public void GetStringBetweenShouldReturnProperValueWhenCalledWithNewLineAsSecondArgument() { const string Value = @"Answer correct!!! Time used (in milliseconds): 26.3672 Memory used (in bytes): 94208 "; const string Expected = "94208"; var actual = Value.GetStringBetween("Memory used (in bytes): ", "\r\n"); Assert.AreEqual(Expected, actual); } } } ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/StringExtensions/GetStringWithEllipsisBetweenTests.cs ================================================ namespace OJS.Common.Tests.StringExtensions { using System; using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class GetStringWithEllipsisBetweenTests { [Test] public void ShouldThrowExceptionWhenValueIsNotNullAndStartIndexIsNegative() { const string Value = "vladislav"; const int StartIndex = -2; const int EndIndex = 2; Assert.Throws( Is.InstanceOf(), () => { var result = Value.GetStringWithEllipsisBetween(StartIndex, EndIndex); }); } [Test] public void ShouldThrowExceptionWhenValueIsNotNullAndStartIndexIsEqualToStringLength() { const string Value = "vladislav"; var startIndex = Value.Length; const int EndIndex = 2; Assert.Throws( Is.InstanceOf(), () => { var result = Value.GetStringWithEllipsisBetween(startIndex, EndIndex); }); } [Test] public void ShouldThrowExceptionWhenValueIsNotNullAndStartIndexIsGreaterThanStringLength() { const string Value = "vladislav"; var startIndex = Value.Length + 1; const int EndIndex = 2; Assert.Throws( Is.InstanceOf(), () => { var result = Value.GetStringWithEllipsisBetween(startIndex, EndIndex); }); } [Test] public void ShouldReturnNullWhenValueIsNullAndStartAndEndIndicesAreValid() { const string Value = null; const int StartIndex = 1; const int EndIndex = 2; var result = Value.GetStringWithEllipsisBetween(StartIndex, EndIndex); Assert.IsNull(result); } [Test] public void ShouldThrowExceptionWhenValueIsNotNullAndStartIndexIsGreaterThanEndIndex() { const string Value = "vladislav"; const int StartIndex = 5; const int EndIndex = 2; Assert.Throws( Is.InstanceOf(), () => { var result = Value.GetStringWithEllipsisBetween(StartIndex, EndIndex); }); } [Test] public void ShouldReturnEmptyStringWhenValueIsNotNullAndStartIndexIsEqualToValueLength() { const string Value = "vladislav"; var startIndex = Value.Length; var endIndex = Value.Length; var result = Value.GetStringWithEllipsisBetween(startIndex, endIndex); Assert.AreEqual(string.Empty, result); } [Test] public void ShouldReturnEmptyStringWhenValueIsNotNullAndStartIndexIsEqualToEndIndex() { const string Value = "vladislav"; const int StartIndex = 2; const int EndIndex = 2; var result = Value.GetStringWithEllipsisBetween(StartIndex, EndIndex); Assert.AreEqual(string.Empty, result); } [Test] public void ShouldReturnNullWhenValueIsNullAndStartIndexIsEqualToEndIndex() { const string Value = null; const int StartIndex = 2; const int EndIndex = 2; var result = Value.GetStringWithEllipsisBetween(StartIndex, EndIndex); Assert.IsNull(result); } [Test] public void ShouldReturnValueWhenValueIsNotNullAndStartIndexIsEqualToZeroAndEndIndexIsEqualToStringLength() { const string Value = "vladislav"; const int StartIndex = 0; var endIndex = Value.Length; var result = Value.GetStringWithEllipsisBetween(StartIndex, endIndex); Assert.AreEqual(Value, result); } [Test] public void ShouldReturnCorrectSubstringWithoutEllipsisWhenValueIsNotNullAndStartIndexIsLessThanEllipsisLength() { const string Value = "vladislav"; const int StartIndex = 2; var endIndex = Value.Length; var result = Value.GetStringWithEllipsisBetween(StartIndex, endIndex); Assert.AreEqual("adislav", result); } [Test] public void ShouldReturnCorrectSubstringWithoutEllipsisWhenValueIsNotNullAndStartIndexIsEqualToEllipsisLength() { const string Value = "vladislav"; const int StartIndex = 3; var endIndex = Value.Length; var result = Value.GetStringWithEllipsisBetween(StartIndex, endIndex); Assert.AreEqual("dislav", result); } [Test] public void ShouldReturnCorrectSubstringWithEllipsisWhenValueIsNotNullAndStartIndexIsGreaterThanEllipsisLength() { const string Value = "vladislav"; const int StartIndex = 5; var endIndex = Value.Length; var result = Value.GetStringWithEllipsisBetween(StartIndex, endIndex); Assert.AreEqual("...slav", result); } [Test] public void ShouldReturnCorrectSubstringWithoutEllipsisWhenValueIsNotNullAndEndIndexIsLessThanLengthMinusEllipsisLength() { const string Value = "vladislav"; const int StartIndex = 0; var endIndex = Value.Length - 2; var result = Value.GetStringWithEllipsisBetween(StartIndex, endIndex); Assert.AreEqual("vladisl", result); } [Test] public void ShouldReturnCorrectSubstringWithoutEllipsisWhenValueIsNotNullAndEndIndexIsEqualToLengthMinusEllipsisLength() { const string Value = "vladislav"; const int StartIndex = 0; var endIndex = Value.Length - 3; var result = Value.GetStringWithEllipsisBetween(StartIndex, endIndex); Assert.AreEqual("vladis", result); } [Test] public void ShouldReturnCorrectSubstringWithEllipsisWhenValueIsNotNullAndEndIndexIsGreaterThanLengthMinusEllipsisLength() { const string Value = "vladislav"; const int StartIndex = 0; var endIndex = Value.Length - 4; var result = Value.GetStringWithEllipsisBetween(StartIndex, endIndex); Assert.AreEqual("vladi...", result); } [Test] public void ShouldReturnCorrectSubstringWithEllipsisOnBothSidesWhenStartIndexAndEndIndexAreAppropriate() { const string Value = "vladislav"; const int StartIndex = 4; var endIndex = Value.Length - 4; var result = Value.GetStringWithEllipsisBetween(StartIndex, endIndex); Assert.AreEqual("...i...", result); } [Test] public void ShouldReturnEmptyStringWhenStartIndexWhenStartIndexAndEndIndexAreEqualAndAppropriate() { const string Value = "vladislav"; const int StartIndex = 4; const int EndIndex = StartIndex; var result = Value.GetStringWithEllipsisBetween(StartIndex, EndIndex); Assert.AreEqual(string.Empty, result); } [Test] public void ShouldReturnEmptyStringWhenValueIsEmptyString() { var value = string.Empty; const int StartIndex = 0; const int EndIndex = 0; var result = value.GetStringWithEllipsisBetween(StartIndex, EndIndex); Assert.AreEqual(value, result); } [Test] public void ShouldReturnSingleWhitespaceStringWhenValueIsSingleWhitespace() { const string Value = " "; const int StartIndex = 0; const int EndIndex = 1; var result = Value.GetStringWithEllipsisBetween(StartIndex, EndIndex); Assert.AreEqual(Value, result); } } } ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/StringExtensions/MaxLengthTests.cs ================================================ namespace OJS.Common.Tests.StringExtensions { using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class MaxLengthTests { [Test] public void MaxLengthShouldReturnEmptyStringWhenEmptyStringIsPassed() { string expected = string.Empty; string value = string.Empty; string actual = value.MaxLength(0); Assert.AreEqual(expected, actual); } [Test] public void MaxLengthShouldReturnProperStringWhenLongerStringIsPassed() { string expected = "12345"; string value = "1234567890"; string actual = value.MaxLength(5); Assert.AreEqual(expected, actual); } [Test] public void MaxLengthShouldReturnProperStringWhenShorterStringIsPassed() { string expected = "123"; string value = "123"; string actual = value.MaxLength(5); Assert.AreEqual(expected, actual); } [Test] public void MaxLengthShouldReturnProperStringWhenStringWithTheSameLengthIsPassed() { string expected = "123"; string value = "123"; string actual = value.MaxLength(3); Assert.AreEqual(expected, actual); } [Test] public void MaxLengthShouldReturnProperStringWhenZeroLengthIsPassed() { string expected = string.Empty; string value = "123"; string actual = value.MaxLength(0); Assert.AreEqual(expected, actual); } } } ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/StringExtensions/PascalCaseToTextTests.cs ================================================ namespace OJS.Common.Tests.StringExtensions { using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class PascalCaseToTextTests { [Test] public void FewWordsStringShouldReturnProperResult() { const string Input = "PascalCaseExample"; const string Expected = "Pascal case example"; var result = Input.PascalCaseToText(); Assert.AreEqual(Expected, result); } [Test] public void OneWordStringShouldReturnProperResult() { const string Input = "Pascal"; const string Expected = "Pascal"; var result = Input.PascalCaseToText(); Assert.AreEqual(Expected, result); } [Test] public void MethodShouldNotChangeTheOtherPartsOfTheString() { const string Input = " PascalCase a A OtherWord Word2 "; const string Expected = " Pascal case a A Other word Word2 "; var result = Input.PascalCaseToText(); Assert.AreEqual(Expected, result); } [Test] public void AbbreviationsShouldBeKept() { const string Input = "Ivo knows SOLID"; const string Expected = "Ivo knows SOLID"; var result = Input.PascalCaseToText(); Assert.AreEqual(Expected, result); } [Test] public void AbbreviationsShouldBeKeptIfNoOtherWords() { const string Input = "SOLID"; const string Expected = "SOLID"; var result = Input.PascalCaseToText(); Assert.AreEqual(Expected, result); } [Test] public void NullStringShouldReturnNull() { const string Input = null; const string Expected = null; var result = Input.PascalCaseToText(); Assert.AreEqual(Expected, result); } } } ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/StringExtensions/StringToUrlTests.cs ================================================ namespace OJS.Common.Tests.StringExtensions { using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class StringToUrlTests { [Test] public void ToUrlMethodShouldReturnProperCSharpText() { var original = "SomeUrlWithC#InIt"; var result = original.ToUrl(); var expected = "SomeUrlWithCSharpInIt"; Assert.AreEqual(expected, result); } [Test] public void ToUrlMethodShouldReturnProperCPlusPlusText() { var original = "SomeUrlWithC++InIt"; var result = original.ToUrl(); var expected = "SomeUrlWithCPlusPlusInIt"; Assert.AreEqual(expected, result); } [Test] public void ToUrlMethodShouldConvertUglySymbolsToDashInMiddle() { var original = "Some%Url&With!Ugly)Symbol"; var result = original.ToUrl(); var expected = "Some-Url-With-Ugly-Symbol"; Assert.AreEqual(expected, result); } [Test] public void ToUrlMethodShouldConvertUglySymbolsToDashInMiddleWithRepeatitions() { var original = "Some%$Url&!With!^^^Ugly**)Symbol"; var result = original.ToUrl(); var expected = "Some-Url-With-Ugly-Symbol"; Assert.AreEqual(expected, result); } [Test] public void ToUrlMethodShouldRemoveUglySymbolsInTheStartOfString() { var original = "###Some%$Url&!With!^^^Ugly**)Symbol"; var result = original.ToUrl(); var expected = "Some-Url-With-Ugly-Symbol"; Assert.AreEqual(expected, result); } [Test] public void ToUrlMethodShouldConvertUglySymbolsToDashInTheEndOfString() { var original = "Some%$Url&!With!^^^Ugly**)Symbol*&*"; var result = original.ToUrl(); var expected = "Some-Url-With-Ugly-Symbol"; Assert.AreEqual(expected, result); } [Test] public void ToUrlMethodShouldConvertSpacesToDash() { var original = " Some Url With Ugly Symbol "; var result = original.ToUrl(); var expected = "Some-Url-With-Ugly-Symbol"; Assert.AreEqual(expected, result); } [Test] public void ToUrlMethodShouldConvertCSharpAndCPlusPlus() { var original = " Some C++UrlC++ With UglyC#C# Symbol "; var result = original.ToUrl(); var expected = "Some-CPlusPlusUrlCPlusPlus-With-UglyCSharpCSharp-Symbol"; Assert.AreEqual(expected, result); } [Test] public void ToUrlMethodShouldRemoveUglySymbolsAtBeginningAndEnd() { var original = "% Some C++UrlC++ With UglyC#C# Symbol #"; var result = original.ToUrl(); var expected = "Some-CPlusPlusUrlCPlusPlus-With-UglyCSharpCSharp-Symbol"; Assert.AreEqual(expected, result); } } } ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/StringExtensions/ToInteger.cs ================================================ namespace OJS.Common.Tests.StringExtensions { using Microsoft.VisualStudio.TestTools.UnitTesting; using OJS.Common.Extensions; [TestClass] public class ToInteger { [TestMethod] public void ZeroStringShouldReturnZero() { const int Expected = 0; const string Input = "0"; int actual = Input.ToInteger(); Assert.AreEqual(Expected, actual); } [TestMethod] public void InvalidInputShouldReturnZero() { const int Expected = 0; const string Input = "invalid"; int actual = Input.ToInteger(); Assert.AreEqual(Expected, actual); } [TestMethod] public void ValidInputShouldReturnSameValue() { const int Expected = 1234567890; const string Input = "1234567890"; int actual = Input.ToInteger(); Assert.AreEqual(Expected, actual); } } } ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/StringExtensions/ToIntegerTests.cs ================================================ namespace OJS.Common.Tests.StringExtensions { using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class ToIntegerTests { [Test] public void ZeroStringShouldReturnZero() { const int Expected = 0; const string Input = "0"; int actual = Input.ToInteger(); Assert.AreEqual(Expected, actual); } [Test] public void InvalidInputShouldReturnZero() { const int Expected = 0; const string Input = "invalid"; int actual = Input.ToInteger(); Assert.AreEqual(Expected, actual); } [Test] public void ValidInputShouldReturnSameValue() { const int Expected = 1234567890; const string Input = "1234567890"; int actual = Input.ToInteger(); Assert.AreEqual(Expected, actual); } } } ================================================ FILE: Open Judge System/Tests/OJS.Common.Tests/packages.config ================================================  ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/App.config ================================================ 
================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/DataFakes/DatabaseConfiguration.cs ================================================ namespace OJS.Tests.Common.DataFakes { using System; using System.Collections.Generic; using System.Data.Entity.Migrations; using OJS.Data; using OJS.Data.Models; internal sealed class DatabaseConfiguration : DbMigrationsConfiguration { public DatabaseConfiguration() { this.AutomaticMigrationsEnabled = true; this.AutomaticMigrationDataLossAllowed = true; } protected override void Seed(FakeOjsDbContext context) { context.ClearDatabase(); this.SeedContests(context); } private void SeedContests(IOjsDbContext context) { // active contests var visibleActiveContest = new Contest { Name = "Active-Visible", IsVisible = true, IsDeleted = false, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(2), }; var nonVisibleActiveContest = new Contest { Name = "Active-Non-Visible", IsVisible = false, IsDeleted = false, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(2) }; var visibleDeletedActiveContest = new Contest { Name = "Active-Visible-Deleted", IsVisible = true, IsDeleted = true, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(2) }; var nonVisibleDeletedActiveContest = new Contest { Name = "Active-Non-Visible-Deleted", IsVisible = false, IsDeleted = true, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(2) }; // past contests var visiblePastContest = new Contest { Name = "Past-Visible", IsVisible = true, IsDeleted = false, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(-1) }; var nonVisiblePastContest = new Contest { Name = "Past-Non-Visible", IsVisible = false, IsDeleted = false, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(-1) }; var visiblePastDeletedContest = new Contest { Name = "Past-Visible-Deleted", IsVisible = true, IsDeleted = true, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(-1) }; var nonVisiblePastDeletedContest = new Contest { Name = "Past-Non-Visible-Deleted", IsVisible = false, IsDeleted = true, StartTime = DateTime.Now.AddHours(-2), EndTime = DateTime.Now.AddHours(-1) }; // future contests var visibleFutureContest = new Contest { Name = "Future-Visible", IsVisible = true, IsDeleted = false, StartTime = DateTime.Now.AddHours(1), EndTime = DateTime.Now.AddHours(2) }; var nonVisibleFutureContest = new Contest { Name = "Future-Non-Visible", IsVisible = false, IsDeleted = false, StartTime = DateTime.Now.AddHours(1), EndTime = DateTime.Now.AddHours(2) }; var visibleFutureDeletedContest = new Contest { Name = "Future-Visible-Deleted", IsVisible = true, IsDeleted = true, StartTime = DateTime.Now.AddHours(1), EndTime = DateTime.Now.AddHours(2) }; var nonVisibleFutureDeletedContest = new Contest { Name = "Future-Non-Visible-Deleted", IsVisible = false, IsDeleted = true, StartTime = DateTime.Now.AddHours(1), EndTime = DateTime.Now.AddHours(2) }; var contests = new List() { // active contests in list (Contest)visibleActiveContest.ObjectClone(), (Contest)visibleActiveContest.ObjectClone(), (Contest)nonVisibleActiveContest.ObjectClone(), (Contest)nonVisibleActiveContest.ObjectClone(), (Contest)nonVisibleActiveContest.ObjectClone(), (Contest)visibleDeletedActiveContest.ObjectClone(), (Contest)visibleDeletedActiveContest.ObjectClone(), (Contest)visibleDeletedActiveContest.ObjectClone(), (Contest)visibleDeletedActiveContest.ObjectClone(), (Contest)nonVisibleDeletedActiveContest.ObjectClone(), // past contest in list (Contest)visiblePastContest.ObjectClone(), (Contest)visiblePastContest.ObjectClone(), (Contest)visiblePastContest.ObjectClone(), (Contest)nonVisiblePastContest.ObjectClone(), (Contest)nonVisiblePastContest.ObjectClone(), (Contest)nonVisiblePastContest.ObjectClone(), (Contest)nonVisiblePastContest.ObjectClone(), (Contest)visiblePastDeletedContest.ObjectClone(), (Contest)visiblePastDeletedContest.ObjectClone(), (Contest)visiblePastDeletedContest.ObjectClone(), (Contest)visiblePastDeletedContest.ObjectClone(), (Contest)nonVisiblePastDeletedContest.ObjectClone(), // future contests in list (Contest)visibleFutureContest.ObjectClone(), (Contest)visibleFutureContest.ObjectClone(), (Contest)visibleFutureContest.ObjectClone(), (Contest)visibleFutureContest.ObjectClone(), (Contest)nonVisibleFutureContest.ObjectClone(), (Contest)nonVisibleFutureContest.ObjectClone(), (Contest)nonVisibleFutureContest.ObjectClone(), (Contest)visibleFutureDeletedContest.ObjectClone(), (Contest)visibleFutureDeletedContest.ObjectClone(), (Contest)visibleFutureDeletedContest.ObjectClone(), (Contest)visibleFutureDeletedContest.ObjectClone(), (Contest)visibleFutureDeletedContest.ObjectClone(), (Contest)nonVisibleFutureDeletedContest.ObjectClone(), }; foreach (var contest in contests) { context.Contests.Add(contest); } context.SaveChanges(); } } } ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/DataFakes/FakeEmptyOjsDbContext.cs ================================================ namespace OJS.Tests.Common.DataFakes { using OJS.Data; public class FakeEmptyOjsDbContext : OjsDbContext { public FakeEmptyOjsDbContext() : base("FakeEmptyOjsDbContext") { } } } ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/DataFakes/FakeOjsDbContext.cs ================================================ namespace OJS.Tests.Common.DataFakes { using OJS.Data; public class FakeOjsDbContext : OjsDbContext { public FakeOjsDbContext() : base("FakeOjsDbContext") { } } } ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/DataFakes/ObjectExtensions.cs ================================================ namespace OJS.Tests.Common.DataFakes { using System; using System.Reflection; public static class ObjectExtensions { public static object ObjectClone(this object obj) { var type = obj.GetType(); var copy = Activator.CreateInstance(type); var fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy); foreach (var field in fields) { field.SetValue(copy, field.GetValue(obj)); } var props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy); foreach (var property in props) { if (property.CanWrite) { property.SetValue(copy, property.GetValue(obj)); } } return copy; } } } ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/OJS.Tests.Common.csproj ================================================  Debug AnyCPU {01CC0B02-529E-4D5F-B345-0B92F6920854} Library Properties OJS.Tests.Common OJS.Tests.Common v4.5 512 ..\..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll True ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll True ..\..\packages\EntityFramework.SqlServerCompact.6.1.3\lib\net45\EntityFramework.SqlServerCompact.dll True False ..\..\packages\Microsoft.AspNet.Identity.Core.1.0.0\lib\net45\Microsoft.AspNet.Identity.Core.dll False ..\..\packages\Microsoft.AspNet.Identity.EntityFramework.1.0.0\lib\net45\Microsoft.AspNet.Identity.EntityFramework.dll ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.interfaces.dll False ..\..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.util.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\NUnit.VisualStudio.TestAdapter.dll False True ..\..\packages\Microsoft.SqlServer.Compact.4.0.8876.1\lib\net40\System.Data.SqlServerCe.dll {8c4bf453-24ef-46f3-b947-31505fb905de} OJS.Data.Contracts {341ca732-d483-4487-923e-27ed2a6e9a4f} OJS.Data.Models {1807194c-9e25-4365-b3be-fe1df627612b} OJS.Data if not exist "$(TargetDir)x86" md "$(TargetDir)x86" xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\x86\*.*" "$(TargetDir)x86" if not exist "$(TargetDir)amd64" md "$(TargetDir)amd64" xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\amd64\*.*" "$(TargetDir)amd64" Este proyecto hace referencia a los paquetes NuGet que faltan en este equipo. Use la restauración de paquetes NuGet para descargarlos. Para obtener más información, consulte http://go.microsoft.com/fwlink/?LinkID=322105. El archivo que falta es {0}. ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Tests.Common")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Tests.Common")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("963edbf1-56ae-43fd-ac6a-23c27246218c")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/TestClassBase.cs ================================================ namespace OJS.Tests.Common { using System.Data.Entity; using OJS.Data; using OJS.Tests.Common.DataFakes; public abstract class TestClassBase { protected TestClassBase() { Database.SetInitializer(new MigrateDatabaseToLatestVersion()); this.OjsData = new OjsData(new FakeOjsDbContext()); this.InitializeEmptyOjsData(); } protected IOjsData EmptyOjsData { get; private set; } protected IOjsData OjsData { get; private set; } protected void InitializeEmptyOjsData() { Database.SetInitializer(new DropCreateDatabaseAlways()); var fakeEmptyOjsDbContext = new FakeEmptyOjsDbContext(); fakeEmptyOjsDbContext.Database.Initialize(true); this.EmptyOjsData = new OjsData(fakeEmptyOjsDbContext); } } } ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/WebStubs/StubHttpContextForRouting.cs ================================================ namespace OJS.Tests.Common.WebStubs { using System.Web; public class StubHttpContextForRouting : HttpContextBase { private readonly StubHttpRequestForRouting request; private readonly StubHttpResponseForRouting response; public StubHttpContextForRouting(string appPath = "/", string requestUrl = "~/") { this.request = new StubHttpRequestForRouting(appPath, requestUrl); this.response = new StubHttpResponseForRouting(); } public override HttpRequestBase Request => this.request; public override HttpResponseBase Response => this.response; } } ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/WebStubs/StubHttpRequestForRouting.cs ================================================ namespace OJS.Tests.Common.WebStubs { using System.Collections.Specialized; using System.Web; public class StubHttpRequestForRouting : HttpRequestBase { public StubHttpRequestForRouting(string appPath, string requestUrl) { this.ApplicationPath = appPath; this.AppRelativeCurrentExecutionFilePath = requestUrl; } public override string ApplicationPath { get; } public override string AppRelativeCurrentExecutionFilePath { get; } public override string PathInfo => string.Empty; public override NameValueCollection ServerVariables => new NameValueCollection(); } } ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/WebStubs/StubHttpResponseForRouting.cs ================================================ namespace OJS.Tests.Common.WebStubs { using System.Web; public class StubHttpResponseForRouting : HttpResponseBase { public override string ApplyAppPathModifier(string virtualPath) { return virtualPath; } } } ================================================ FILE: Open Judge System/Tests/OJS.Tests.Common/packages.config ================================================  ================================================ FILE: Open Judge System/Tests/OJS.Workers.Checkers.Tests/CSharpCodeCheckerTests.cs ================================================ namespace OJS.Workers.Checkers.Tests { using System; using NUnit.Framework; [TestFixture] public class CSharpCodeCheckerTests { [Test] public void CallingCheckMethodBeforeSetParameterShouldThrowAnException() { // Arrange var checker = new CSharpCodeChecker(); string expectedErrorMessage = "Please call SetParameter first with non-null string."; // Act var exception = Assert.Throws(() => checker.Check(string.Empty, string.Empty, string.Empty, false)); // Assert Assert.AreEqual(expectedErrorMessage, exception.Message); } [Test] public void SetParameterThrowsExceptionWhenGivenInvalidCode() { // Arrange var checker = new CSharpCodeChecker(); // Act and Assert Assert.Throws(() => checker.SetParameter(@".")); } [Test] public void SetParameterThrowsExceptionWhenNotGivenICheckerImplementation() { // Arragne var checker = new CSharpCodeChecker(); string expectedErrorMessage = "Implementation of OJS.Workers.Common.IChecker not found!"; // Act var exception = Assert.Throws(() => checker.SetParameter(@"public class MyChecker { }")); // Assert Assert.AreEqual(expectedErrorMessage, exception.Message); } [Test] public void SetParameterThrowsExceptionWhenGivenMoreThanOneICheckerImplementation() { // Arrange var checker = new CSharpCodeChecker(); var SetParameter = @" using OJS.Workers.Common; public class MyChecker1 : IChecker { public CheckerResult Check(string inputData, string receivedOutput, string expectedOutput, bool isTrialTest) { return new CheckerResult { IsCorrect = true, ResultType = CheckerResultType.Ok, CheckerDetails = new CheckerDetails(), }; } public void SetParameter(string parameter) { } } public class MyChecker2 : IChecker { public CheckerResult Check(string inputData, string receivedOutput, string expectedOutput, bool isTrialTest) { return new CheckerResult { IsCorrect = true, ResultType = CheckerResultType.Ok, CheckerDetails = new CheckerDetails(), }; } public void SetParameter(string parameter) { } }"; string expectedErrorMessage = "More than one implementation of OJS.Workers.Common.IChecker was found!"; // Act var exception = Assert.Throws(() => checker.SetParameter(SetParameter), "Hola", null); // Assert Assert.AreEqual(expectedErrorMessage, exception.Message); } [Test] public void CheckMethodWorksCorrectlyWithSomeCheckerCode() { var checker = new CSharpCodeChecker(); checker.SetParameter(@" using OJS.Workers.Common; public class MyChecker : IChecker { public CheckerResult Check(string inputData, string receivedOutput, string expectedOutput, bool isTrialTest) { return new CheckerResult { IsCorrect = true, ResultType = CheckerResultType.Ok, CheckerDetails = new CheckerDetails { Comment = ""It was me"" }, }; } public void SetParameter(string parameter) { } }"); var checkerResult = checker.Check(string.Empty, string.Empty, string.Empty, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.AreEqual("It was me", checkerResult.CheckerDetails.Comment); } [Test] public void CheckMethodReceivesCorrectParameters() { var checker = new CSharpCodeChecker(); checker.SetParameter(@" using OJS.Workers.Common; public class MyChecker : IChecker { public CheckerResult Check(string inputData, string receivedOutput, string expectedOutput, bool isTrialTest) { bool isCorrect = true; if (inputData != ""One"") isCorrect = false; if (receivedOutput != ""Two"") isCorrect = false; if (expectedOutput != ""Three"") isCorrect = false; return new CheckerResult { IsCorrect = isCorrect, ResultType = CheckerResultType.Ok, CheckerDetails = new CheckerDetails(), }; } public void SetParameter(string parameter) { } }"); var checkerResult = checker.Check("One", "Two", "Three", false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Checkers.Tests/CaseInsensitiveCheckerTests.cs ================================================ namespace OJS.Workers.Checkers.Tests { using System.Text; using NUnit.Framework; using OJS.Workers.Common; [TestFixture] public class CaseInsensitiveCheckerTests { [Test] public void CaseInsensitiveCheckerShouldReturnTrueWhenGivenCaseInsensitiveStrings() { string receivedOutput = "НиколАй"; string expectedOutput = "НикОлай"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void CaseInsensitiveCheckerShouldReturnTrueWhenGivenCaseInsensitiveStringsWithDifferentNewLineEndings() { string receivedOutput = "НикоЛай\n"; string expectedOutput = "ниКолай"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void CaseInsensitiveCheckerShouldReturnTrueWhenGivenCaseInsensitiveMultiLineStrings() { string receivedOutput = "НикОлай\nFoo\nBAr"; string expectedOutput = "николай\nFoO\nBar"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void CaseInsensitiveCheckerShouldReturnTrueWhenGivenCaseInsensitiveMultiLineStringsWithDifferentNewLineEndings() { string receivedOutput = "Николай\nFOo\nBar"; string expectedOutput = "Николай\nFoo\nBAr\n"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void CaseInsensitiveCheckerShouldNotRespectsTextCasing() { string receivedOutput = "Николай"; string expectedOutput = "николай"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void CaseInsensitiveCheckerShouldRespectsDecimalSeparators() { string receivedOutput = "1,1"; string expectedOutput = "1.1"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void CaseInsensitiveCheckerShouldReturnFalseWhenGivenDifferentStrings() { string receivedOutput = "Foo"; string expectedOutput = "Bar"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void CaseInsensitiveCheckerShouldReturnInvalidNumberOfLinesWhenReceivedOutputHasMoreLines() { string receivedOutput = "Bar\nFoo"; string expectedOutput = "Bar"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void CaseInsensitiveCheckerShouldReturnInvalidNumberOfLinesWhenExpectedOutputHasMoreLines() { string receivedOutput = "Bar"; string expectedOutput = "Bar\nFoo"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void CaseInsensitiveCheckerShouldReturnInvalidNumberOfLinesWhenGivenDifferentMultiLineStringsWithSameText() { string receivedOutput = "Bar\nFoo\n\n"; string expectedOutput = "Bar\nFoo"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void CaseInsensitiveCheckerShouldReturnWrongAnswerWhenGivenDifferentMultiLineStringsWithSameTextDifferentBlankLines() { string receivedOutput = "BAr\nFoo\n\n"; string expectedOutput = "\n\nBar\nFOo"; var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void CaseInsensitiveCheckShouldReturnCorrectAnswerInBiggerSameTextsTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void CaseInsensitiveCheckerShouldReturnWrongAnswerInBiggerDifferentTextsTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 100000; i > 0; i--) { expectedOutput.AppendLine(i.ToString()); } var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void CaseInsensitiveCheckerShouldReturnInvalidNumberOfLinesInBiggerDifferentNumberOfLinesTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 10000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void CaseInsensitiveCheckerShouldReturnWrongAnswerInBiggerTextsWithLastLineDifferentTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { receivedOutput.AppendLine(i.ToString()); } receivedOutput.Append(1); StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } expectedOutput.Append(2); var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void CaseInsensitiveCheckShouldReturnCorrectAnswerInBiggerSameTextsDifferentCaseTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 128; i++) { receivedOutput.AppendLine(((char)i).ToString().ToLower()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 128; i++) { expectedOutput.AppendLine(((char)i).ToString().ToUpper()); } var checker = new CaseInsensitiveChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Checkers.Tests/ExactCheckerTests.cs ================================================ namespace OJS.Workers.Checkers.Tests { using System.Text; using NUnit.Framework; using OJS.Workers.Common; [TestFixture] public class ExactCheckerTests { [Test] public void ExactCheckerShouldReturnTrueWhenGivenExactStrings() { string receivedOutput = "Николай"; string expectedOutput = "Николай"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void ExactCheckerShouldReturnTrueWhenGivenExactStringsWithDifferentNewLineEndings() { string receivedOutput = "Николай\n"; string expectedOutput = "Николай"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void ExactCheckerShouldReturnTrueWhenGivenExactMultiLineStrings() { string receivedOutput = "Николай\nFoo\nBar"; string expectedOutput = "Николай\nFoo\nBar"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void ExactCheckerShouldReturnTrueWhenGivenExactMultiLineStringsWithDifferentNewLineEndings() { string receivedOutput = "Николай\nFoo\nBar"; string expectedOutput = "Николай\nFoo\nBar\n"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void ExactCheckerShouldRespectsTextCasing() { string receivedOutput = "Николай"; string expectedOutput = "николай"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void ExactCheckerShouldRespectsDecimalSeparators() { string receivedOutput = "1,1"; string expectedOutput = "1.1"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void ExactCheckerShouldReturnFalseWhenGivenDifferentStrings() { string receivedOutput = "Foo"; string expectedOutput = "Bar"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void ExactCheckerShouldReturnInvalidNumberOfLinesWhenReceivedOutputHasMoreLines() { string receivedOutput = "Bar\nFoo"; string expectedOutput = "Bar"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void ExactCheckerShouldReturnInvalidNumberOfLinesWhenExpectedOutputHasMoreLines() { string receivedOutput = "Bar"; string expectedOutput = "Bar\nFoo"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void ExactCheckerShouldReturnInvalidNumberOfLinesWhenGivenDifferentMultiLineStringsWithSameText() { string receivedOutput = "Bar\nFoo\n\n"; string expectedOutput = "Bar\nFoo"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void ExactCheckerShouldReturnWrongAnswerWhenGivenDifferentMultiLineStringsWithSameTextDifferentBlankLines() { string receivedOutput = "Bar\nFoo\n\n"; string expectedOutput = "\n\nBar\nFoo"; var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void ExacterCheckShouldReturnCorrectAnswerInBiggerSameTextsTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void ExactCheckerShouldReturnWrongAnswerInBiggerDifferentTextsTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 100000; i > 0; i--) { expectedOutput.AppendLine(i.ToString()); } var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void ExactCheckerShouldReturnInvalidNumberOfLinesInBiggerDifferentNumberOfLinesTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 10000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void ExactCheckerShouldReturnWrongAnswerInBiggerTextsWithLastLineDifferentTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { receivedOutput.AppendLine(i.ToString()); } receivedOutput.Append(1); StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } expectedOutput.Append(2); var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Checkers.Tests/OJS.Workers.Checkers.Tests.csproj ================================================  Debug AnyCPU {73B7CEF9-1843-4EFB-B9BF-E2A0492613A8} Library Properties OJS.Workers.Checkers.Tests OJS.Workers.Checkers.Tests v4.5 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest ..\..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.interfaces.dll False ..\..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.util.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\NUnit.VisualStudio.TestAdapter.dll False {93ec1d66-2ce1-4682-ac09-c8c40178a9ad} OJS.Workers.Checkers {7f714d0b-ce81-4dd7-b6b2-62080fe22cd8} OJS.Workers.Common False False False False Este proyecto hace referencia a los paquetes NuGet que faltan en este equipo. Use la restauración de paquetes NuGet para descargarlos. Para obtener más información, consulte http://go.microsoft.com/fwlink/?LinkID=322105. El archivo que falta es {0}. ================================================ FILE: Open Judge System/Tests/OJS.Workers.Checkers.Tests/PrecisionCheckerTests.cs ================================================ namespace OJS.Workers.Checkers.Tests { using System.Globalization; using System.Text; using NUnit.Framework; using OJS.Workers.Common; [TestFixture] public class PrecisionCheckerTests { [Test] public void PrecisionCheckerShouldReturnTrueWhenGivenExactDecimalWithDefaultPrecision() { string receivedOutput = "1.11111111111111111111111111"; string expectedOutput = "1.11111111111111111111111112"; var checker = new PrecisionChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldReturnTrueWhenGivenExactDecimalWithPrecisionOfFive() { string receivedOutput = "1.000004"; string expectedOutput = "1.000003"; var checker = new PrecisionChecker(); checker.SetParameter("5"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldReturnWrongAnswerWhenGivenExactDecimalWithPrecisionOfSixAndDifferentDigitsBeforeTheSixthOne() { string receivedOutput = "1.000004"; string expectedOutput = "1.000003"; var checker = new PrecisionChecker(); checker.SetParameter("6"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void PrecisionCheckerShouldReturnFalseIfNoNumberIsEntered() { string receivedOutput = "Foobar"; string expectedOutput = "1.000003"; var checker = new PrecisionChecker(); checker.SetParameter("6"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void PrecisionCheckerShouldReturnCorrectIfTheAnswerRoundUp() { string receivedOutput = "1.00"; string expectedOutput = "1.009"; var checker = new PrecisionChecker(); checker.SetParameter("2"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldReturnTrueIfTheAnswerRoundUpClose() { string receivedOutput = "1.00"; string expectedOutput = "0.999999"; var checker = new PrecisionChecker(); checker.SetParameter("2"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldReturnTrueIfTheAnswersAreSame() { string receivedOutput = "0.999999"; string expectedOutput = "0.999999"; var checker = new PrecisionChecker(); checker.SetParameter("2"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldReturnFalseIfTheAnswersAreDifferent() { string receivedOutput = "0.123456"; string expectedOutput = "0.999999"; var checker = new PrecisionChecker(); checker.SetParameter("2"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void PrecisionCheckerShouldReturnTrueIfTheAnswersAreSameAndPrecisionIsBiggerThanTheNumbers() { string receivedOutput = "0.999999"; string expectedOutput = "0.999999"; var checker = new PrecisionChecker(); checker.SetParameter("15"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldReturnTrueIfTheAnswersAreHugeNumbersSameAndLowPrecision() { string receivedOutput = "1234567.99"; string expectedOutput = "1234567.9"; var checker = new PrecisionChecker(); checker.SetParameter("1"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldReturnTrueIfAllLinesAreCorrect() { System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("bg-BG"); string receivedOutput = "1.00\n15.89955\n9999.87"; string expectedOutput = "0.999999\n15.8995555\n9999.87000002"; var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldReturnTrueIfAllLinesAreCorrectWithOneExtraEmptyLine() { string receivedOutput = "1.00\n15.89955\n9999.87"; string expectedOutput = "0.999999\n15.8995555\n9999.87000002\n"; var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldNotRespectsDecimalSeparators() { string receivedOutput = "1,1"; string expectedOutput = "1.1"; var checker = new PrecisionChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldReturnCorrectAnswerIfCultureIsBulgarian() { string receivedOutput = "1,00\n15,89955\n9999,87\n"; string expectedOutput = "1.00\n15.89955\n9999.87"; var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckerShouldReturnInvalidLineNumberIfAllLinesAreCorrectWithOneExtraFullLineOnReceivedOutput() { string receivedOutput = "1.00\n15.89955\n9999.87\n99.56"; string expectedOutput = "1.00\n15.89955\n9999.87"; var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void PrecisionCheckerShouldReturnInvalidLineNumberIfAllLinesAreCorrectWithOneExtraFullLineOnExpectedOutput() { string receivedOutput = "1.00\n15.89955\n9999.87"; string expectedOutput = "1.00\n15.89955\n9999.87\n99.56"; var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void PrecisionCheckerShouldReturnInvalidLineNumberIfAllLinesAreCorrectWithALotOfExtraLine() { string receivedOutput = "1.00\n15.89955\n9999.87"; string expectedOutput = "1.00\n15.89955\n9999.87\n\n"; var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void PrecisionCheckerShouldReturnWrongAnsweIfAllLinesAreCorrectWithALotOfExtraLinesAtTheBeginningAndEnd() { string receivedOutput = "\n\n1.00\n15.89955\n9999.87"; string expectedOutput = "1.00\n15.89955\n9999.87\n\n"; var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void PrecisionCheckShouldReturnCorrectAnswerInBiggerSameTextsTest() { var receivedOutput = new StringBuilder(); for (decimal i = 0.000001m; i < 1; i += 0.000001m) { receivedOutput.AppendLine(i.ToString(CultureInfo.InvariantCulture)); } var expectedOutput = new StringBuilder(); for (decimal i = 0.000001m; i < 1; i += 0.000001m) { expectedOutput.AppendLine(i.ToString(CultureInfo.InvariantCulture)); } var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void PrecisionCheckShouldReturnWrongAnswerInBiggerSameTextsWithOneDifferentLineTest() { var receivedOutput = new StringBuilder(); for (decimal i = 0.000001m; i < 1; i += 0.000001m) { receivedOutput.AppendLine(i.ToString(CultureInfo.InvariantCulture)); } receivedOutput.AppendFormat("{0}", 5.5554m); var expectedOutput = new StringBuilder(); for (decimal i = 0.000001m; i < 1; i += 0.000001m) { expectedOutput.AppendLine(i.ToString(CultureInfo.InvariantCulture)); } expectedOutput.AppendFormat("{0}", 5.5553m); var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void PrecisionCheckShouldReturnWrongAnswerInBiggerSameTextsWithTotallyDifferentLinesTest() { var receivedOutput = new StringBuilder(); for (decimal i = 0.000001m; i < 1; i += 0.000001m) { receivedOutput.AppendLine(i.ToString(CultureInfo.InvariantCulture)); } receivedOutput.AppendFormat("{0}", 5.5554m); var expectedOutput = new StringBuilder(); for (decimal i = 0.000001m; i < 1; i += 0.000002m) { expectedOutput.AppendLine(i.ToString(CultureInfo.InvariantCulture)); } expectedOutput.AppendFormat("{0}", 5.5553m); var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void PrecisionCheckShouldReturnCorrectAnswerInBiggerSameTextsWithDifferentPrecisionTest() { var receivedOutput = new StringBuilder(); for (decimal i = 0.000001m; i < 1; i += 0.000001m) { receivedOutput.AppendLine(i.ToString(CultureInfo.InvariantCulture)); } var expectedOutput = new StringBuilder(); for (decimal i = 0.000001m; i < 1; i += 0.000001m) { expectedOutput.AppendLine((i + 0.0000001m).ToString(CultureInfo.InvariantCulture)); } var checker = new PrecisionChecker(); checker.SetParameter("4"); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Checkers.Tests/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Workers.Checkers.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Workers.Checkers.Tests")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("9bf84249-4133-465d-be15-3bdef0445e30")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Tests/OJS.Workers.Checkers.Tests/SortCheckerTests.cs ================================================ namespace OJS.Workers.Checkers.Tests { using System.Text; using NUnit.Framework; using OJS.Workers.Common; [TestFixture] public class SortCheckerTests { [Test] public void SortCheckerShouldReturnTrueWhenGivenExactStrings() { string receivedOutput = "Ивайло"; string expectedOutput = "Ивайло"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnTrueWhenGivenExactStringsWithDifferentNewLineEndings() { string receivedOutput = "Ивайло\n"; string expectedOutput = "Ивайло"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnTrueWhenGivenExactMultiLineStrings() { string receivedOutput = "Ивайло\nFoo\nBar"; string expectedOutput = "Ивайло\nFoo\nBar"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnTrueWhenGivenExactMultiLineStringsWithDifferentNewLineEndings() { string receivedOutput = "Ивайло\nFoo\nBar"; string expectedOutput = "Ивайло\nFoo\nBar\n"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldRespectsTextCasing() { string receivedOutput = "Ивайло"; string expectedOutput = "ивайло"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void SortCheckerShouldRespectsDecimalSeparators() { string receivedOutput = "1,1"; string expectedOutput = "1.1"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void SortCheckerShouldReturnFalseWhenGivenDifferentStrings() { string receivedOutput = "Foo"; string expectedOutput = "Bar"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void SortCheckershouldReturnInvalidNumberOfLinesWhenReceivedOutputHasMoreLines() { string receivedOutput = "Bar\nFoo"; string expectedOutput = "Bar"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void SortCheckerShouldReturnInvalidNumberOfLinesWhenExpectedOutputHasMoreLines() { string receivedOutput = "Bar"; string expectedOutput = "Bar\nFoo"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void SortCheckerShouldReturnIncorrectNumberOfLinesWhenGivenDifferentMultiLineStringsWithSameText() { string receivedOutput = "Bar\nFoo\n\n"; string expectedOutput = "Bar\nFoo"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void SortCheckerShouldReturnInvalidNumberOfLinesWhenGivenDifferentMultiLineStringsWithSameTextDifferentBlankLines() { string receivedOutput = "Bar\nFoo\n\n"; string expectedOutput = "\n\nBar\nFoo"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void SortCheckerShouldReturnCorrectAnswerInBiggerSameTextsTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnWrongAnswerInBiggerDifferentTextsTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 10; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 10; i > 0; i--) { expectedOutput.AppendLine(i.ToString()); } var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void SortCheckerShouldReturnInvalidNumberOfLinesInBiggerDifferentNumberOfLinesTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 10000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void SortCheckerShouldReturnCorrectAnswerInBiggerReversedTextsTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 1; i <= 100000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 100000; i >= 1; i--) { expectedOutput.AppendLine(i.ToString()); } var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnTrueWhenGivenSameResultsUnsortedMultiLineStrings() { string receivedOutput = "Ивайло\nFoo\nBar"; string expectedOutput = "Ивайло\nBar\nFoo"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnTrueWhenReceivedIsSortedAndExpectedIsNotStrings() { string receivedOutput = "1\n2\n3"; string expectedOutput = "2\n3\n1"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnTrueWhenReceivedIsUnSortedAndExpectedIsSortedStrings() { string receivedOutput = "2\n1\n3"; string expectedOutput = "1\n2\n3"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnTrueWhenBothTextsAreUnsortedStrings() { string receivedOutput = "2\n1\n3"; string expectedOutput = "3\n1\n2"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnTrueWhenReceivedIsSortedAndExpectedIsAlmostStrings() { string receivedOutput = "1\n2\n3\n4\n5\n6\n7\n8\n9"; string expectedOutput = "1\n2\n3\n4\n6\n5\n7\n8\n9"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnTrueWhenReceivedIsAlmostSortedAndExpectedIsFullSortedStrings() { string receivedOutput = "1\n2\n3\n4\n6\n5\n7\n8\n9"; string expectedOutput = "1\n2\n3\n4\n5\n6\n7\n8\n9"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void SortCheckerShouldReturnTrueWhenBothAreTotallyUnsortedStrings() { string receivedOutput = "9\n2\n3\n4\n5\n8\n6\n1\n7"; string expectedOutput = "1\n6\n3\n9\n5\n2\n8\n7\n4"; var checker = new SortChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Checkers.Tests/TrimCheckerTests.cs ================================================ namespace OJS.Workers.Checkers.Tests { using System.Text; using NUnit.Framework; using OJS.Workers.Common; [TestFixture] public class TrimCheckerTests { [Test] public void TrimCheckerShouldReturnTrueWhenGivenExactStrings() { string receivedOutput = "Ивайло"; string expectedOutput = "Ивайло"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnTrueWhenGivenExactStringsWithDifferentNewLineEndings() { string receivedOutput = "Ивайло\n"; string expectedOutput = "Ивайло"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnTrueWhenGivenExactMultiLineStrings() { string receivedOutput = "Ивайло\nFoo\nBar"; string expectedOutput = "Ивайло\nFoo\nBar"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnTrueWhenGivenExactMultiLineStringsWithDifferentNewLineEndings() { string receivedOutput = "Ивайло\nFoo\nBar"; string expectedOutput = "Ивайло\nFoo\nBar\n"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldRespectsTextCasing() { string receivedOutput = "Ивайло"; string expectedOutput = "ивайло"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void TrimCheckerShouldRespectsDecimalSeparators() { string receivedOutput = "1,1"; string expectedOutput = "1.1"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void TrimCheckerShouldReturnFalseWhenGivenDifferentStrings() { string receivedOutput = "Foo"; string expectedOutput = "Bar"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void TrimCheckershouldReturnInvalidNumberOfLinesWhenReceivedOutputHasMoreLines() { string receivedOutput = "Bar\nFoo"; string expectedOutput = "Bar"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void TrimCheckerShouldReturnInvalidNumberOfLinesWhenExpectedOutputHasMoreLines() { string receivedOutput = "Bar"; string expectedOutput = "Bar\nFoo"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenGivenDifferentMultiLineStringsWithSameText() { string receivedOutput = "Bar\nFoo\n\n"; string expectedOutput = "Bar\nFoo"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenGivenDifferentMultiLineStringsWithSameTextDifferentBlankLines() { string receivedOutput = "Bar\nFoo\n\n"; string expectedOutput = "\n\nBar\nFoo"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerInBiggerSameTextsTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnWrongAnswerInBiggerDifferentTextsTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 100000; i > 0; i--) { expectedOutput.AppendLine(i.ToString()); } var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerInBiggerDifferentNumberOfLinesTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 10000; i++) { receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenWhitespaceIsDifferentAtTheEndOfStrings() { string receivedOutput = "Ивайло "; string expectedOutput = "Ивайло "; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenWhitespaceIsDifferentAtTheStartOfStrings() { string receivedOutput = " Ивайло"; string expectedOutput = " Ивайло"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenWhitespaceIsDifferentAtTheStartAndEndOfStrings() { string receivedOutput = " Ивайло "; string expectedOutput = " Ивайло "; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenWhitespaceIsDifferentAtTheStartAndEndOfStringsAndDifferentEndLines() { string receivedOutput = " Ивайло \n"; string expectedOutput = " Ивайло "; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenWhitespaceIsDifferentAtTheStartAndEndOfStringsAndTwoDifferentEndLines() { string receivedOutput = " Ивайло "; string expectedOutput = " Ивайло \n \n"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenEveryLineHasDifferentWhiteSpace() { string receivedOutput = " Ивайло \n Кенов \n Е \n Пич \n"; string expectedOutput = " Ивайло \n Кенов \n Е \n Пич \n"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenLastLineHasDifferentWhiteSpace() { string receivedOutput = " Ивайло \n Кенов \n Е \n Пич \n "; string expectedOutput = " Ивайло \n Кенов \n Е \n Пич \n"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenLastExpectedLineHasDifferentWhiteSpace() { string receivedOutput = " Ивайло \n Кенов \n Е \n Пич \n "; string expectedOutput = " Ивайло \n Кенов \n Е \n Пич \n "; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldRespectsTextCasingWithWhiteSpace() { string receivedOutput = " Николай "; string expectedOutput = " николай "; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void TrimCheckerShouldRespectsDecimalSeparatorsWithSpacing() { string receivedOutput = " 1,1 "; string expectedOutput = " 1.1 "; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void TrimCheckerShouldReturnFalseWhenGivenDifferentStringsWithSpacing() { string receivedOutput = " Foo "; string expectedOutput = " Bar "; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } [Test] public void TrimCheckerShouldReturnInvalidNumberOfLinesWhenReceivedOutputHasMoreLinesWithSpacing() { string receivedOutput = "Bar \n Foo "; string expectedOutput = " Bar "; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.InvalidNumberOfLines)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenGivenDifferentMultiLineStringsWithSameTextWithSpacing() { string receivedOutput = "Bar \n Foo \n \n \n \n\n"; string expectedOutput = "Bar \n Foo "; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnCorrectAnswerWhenGivenDifferentMultiLineStringsWithSameTextDifferentBlankLinesTest() { string receivedOutput = " Bar \n Foo \n \n "; string expectedOutput = "\n \n Bar \n Foo"; var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput, expectedOutput, false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckShouldReturnCorrectAnswerInBiggerSameTextsWithDifferentWhiteSpaceTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 1000; i++) { receivedOutput.Append(new string(' ', i)); receivedOutput.AppendLine(i.ToString()); } StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 1000; i++) { expectedOutput.Append(i.ToString()); expectedOutput.AppendLine(new string(' ', 1000 - i)); } var checker = new TrimChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsTrue(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.Ok)); } [Test] public void TrimCheckerShouldReturnWrongAnswerInBiggerTextsWithLastLineDifferentTest() { StringBuilder receivedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { receivedOutput.AppendLine(i.ToString()); } receivedOutput.Append(1); StringBuilder expectedOutput = new StringBuilder(); for (int i = 0; i < 100000; i++) { expectedOutput.AppendLine(i.ToString()); } expectedOutput.Append(2); var checker = new ExactChecker(); var checkerResult = checker.Check(string.Empty, receivedOutput.ToString(), expectedOutput.ToString(), false); Assert.IsNotNull(checkerResult); Assert.IsFalse(checkerResult.IsCorrect); Assert.IsTrue(checkerResult.ResultType.HasFlag(CheckerResultType.WrongAnswer)); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Checkers.Tests/packages.config ================================================  ================================================ FILE: Open Judge System/Tests/OJS.Workers.Compilers.Tests/CSharpCompilerTests.cs ================================================ namespace OJS.Workers.Compilers.Tests { using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class CSharpCompilerTests { private const string CSharpCompilerPath = @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe"; [Test] public void CSharpCompilerShouldWorkWhenGivenValidSourceCode() { const string Source = @"using System; class Program { static void Main() { Console.WriteLine(""It works!""); } }"; var compiler = new CSharpCompiler(); var result = compiler.Compile(CSharpCompilerPath, FileHelpers.SaveStringToTempFile(Source), string.Empty); Assert.IsTrue(result.IsCompiledSuccessfully, "Compilation is not successful"); Assert.IsFalse(string.IsNullOrWhiteSpace(result.OutputFile), "Output file is null"); Assert.IsTrue(result.OutputFile.EndsWith(".exe"), "Output file does not ends with .exe"); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Compilers.Tests/MsBuildCompilerTests.cs ================================================ namespace OJS.Workers.Compilers.Tests { using System; using NUnit.Framework; using OJS.Common.Extensions; [TestFixture] public class MsBuildCompilerTests { private const string MsBuildCompilerPath = @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe"; [Test] public void MsBuildCompilerShouldWorkWhenGivenValidZippedSolution() { var compiler = new MsBuildCompiler(); var result = compiler.Compile(MsBuildCompilerPath, FileHelpers.SaveByteArrayToTempFile(this.GetSampleSolutionFile()), string.Empty); Assert.IsTrue(result.IsCompiledSuccessfully, "Compilation is not successful"); Assert.IsFalse(string.IsNullOrWhiteSpace(result.OutputFile), "Output file is null"); Assert.IsTrue(result.OutputFile.EndsWith(".exe"), "Output file does not ends with .exe"); } [Test] public void MsBuildCompilerShouldWorkWhenGivenValidZippedProjectInSingleFolder() { var compiler = new MsBuildCompiler(); var result = compiler.Compile(MsBuildCompilerPath, FileHelpers.SaveByteArrayToTempFile(this.GetSampleSolutionWhereTheProjectIsLocatedInSingleFolder()), string.Empty); Assert.IsTrue(result.IsCompiledSuccessfully, "Compilation is not successful"); Assert.IsFalse(string.IsNullOrWhiteSpace(result.OutputFile), "Output file is null"); Assert.IsTrue(result.OutputFile.EndsWith(".exe"), "Output file does not ends with .exe"); } private byte[] GetSampleSolutionFile() { return Convert.FromBase64String( @"UEsDBAoAAAAAANSJWUQAAAAAAAAAAAAAAAAPAAAAU2FtcGxlU29sdXRpb24vUEsDBBQAAAAIALKJ WUTDeUDOigAAALsAAAAZAAAAU2FtcGxlU29sdXRpb24vQXBwLmNvbmZpZ3u/e7+NfUVujkJZalFx Zn6erZKhnoGSQmpecn5KZl66rVJpSZquhZKCvR0vl01yfl5aZnppUWJJZn4eUEABCGyKSxKLSkoL 7BQgfIhYaUFBflFJakpQaV5JZm4qwvQyE5Dxxdmltkp6fq4hbkWJuanl+UXZOmFQFUAFpkoK+jDT 9WHGA63XR7UfAFBLAwQUAAAACADLiVlExM5Do40AAADKAAAAGQAAAFNhbXBsZVNvbHV0aW9uL1By b2dyYW0uY3NVizEKwlAMhvdC7xA6tUsv0NFJUBA6OIcaSvC9pLykFRFP5uCRvIKVCtWPQH7+fHk9 noKRbMCOoMU4BGo1jM4qeXbLM5gZjaWH9mpOscmzpWRxSoIBuoBmcEjaJ4zL7fv3p5mjcweT8gn2 yFJWq/Tjf9iomAaqj4mddixUFluHi6az1UXVrPJ9ifOa5w1QSwMECgAAAAAAsolZRAAAAAAAAAAA AAAAABoAAABTYW1wbGVTb2x1dGlvbi9Qcm9wZXJ0aWVzL1BLAwQUAAAACACyiVlEirAaq3gCAACg BQAAKQAAAFNhbXBsZVNvbHV0aW9uL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzjVRLbhNBEN1H yh1K3sRE2HFiJyhhBY6IvAigOERCiEXPTLXdSU/XqD82cyTOwAKJC3EFqtvjjC1igr1wu/rVq1dT r+b3j5/BKTODae08lv0blBpzr8i83t/bvgnGqxL7YyorpdFO0S5Ujm4XbmI8Wqo2YPt7R0dwhQat 0DAxkmwpYiUQGQUPgg/OYZnpGpSDnIy3pDUW4OeWwmzOvwiSQ7SM9RKdQw8kQXhvVRY8uj6M58LM MIIdthewEDqgA09QUqFkndhUqyLRsQDKlfBcdKn8fFNTf3/vy/p8AW+a063yGrudqSgrjVPSIVJ1 Xnx9EnyJLreqipBuZxdoTEaqWbDiOVhZCVPvBny0VITc/6+2MVW1VbM5Jzwe4dd3gJPB8WhX0q0V BZbCPvxDZ9A+WGwA6SFP0fs4QG7hTjmVaYxTkULzvErxgC6NxtcVn5ThP8q1zjDkYdFkJTZOHX+4 ZruUFRk0nh0AEwk1BTAYzUMgcjYgcyTOvymlpXLFxUQvk6WigA15rYuYzduAQJFE+MS47Yw2rZta emz7dsu9V58ml9Hm7L9UbXIZfbxuXKsMlFzprCzd80pGMH6ryK16YqlbZa+CKrqdfJSNhsVw1Ds7 eSV7ozMc9rIRDnpyMBydn5+eDU4L0Q7iDq2L+7exBUnPhuvjGjrlvFurazuQFGyzVReRLlGmz7W4 J7tm3wgr04ahjb8NShfwPpQZ2jZ6gwu1zk/RzzzRnKW5CvO4v0LrpKhZbKauG0SBUrDt0u2KXJji kbCp5FYKshpWr68IPjg84M7BzWlpIENuNHUGT/i6aaPbOe4P+ofpmT6H4u8u3Dt+oz6J/QNQSwME FAAAAAgAtYlZRFF8qgaLAwAACgoAACQAAABTYW1wbGVTb2x1dGlvbi9TYW1wbGVTb2x1dGlvbi5j c3Byb2q1Vt1u2zYUvh+wd+CEAW6ASkzcpKg3WYUi20GAtjFsd9uFb2jpyObKH42k0njrnmwXe6S9 wkhJ9iR7SY1h1YUAnn+e7/Cc89cff4avHzhD96A0lWLoXQTnHgKRyoyK9dArTe6/8l5HX38VTpX8 GVKDFlIy/cNevu8URpCTkpkFUWsweuhdl5RlHrKWhT1tjCm+w1inG+BEB5ymSmqZmyCVHGdwD0wW oDDXK6eG++fnLzzrEaHwlhdSGdS4HnrfPns7r2yPHwwIF4GeErM5W+4Z7ejOlm/3rhLJuRRBoWSh PZRIkVFTXWD8QLXRz3r/zfSh6d6Zh3Ad+1S5W5ntjZJlUZEs0TrO6bpUxDlvh4FsAB3mWQ8Nh6jX Q140glW5DnGHvTM4ZcTkUvFDWzt6y0wstsn0fYh3rL2JOrs3Jc2i3y6S8dWknwz86+t44F+OBon/ ajLo+/3LOHn5MnkRn08Gv4e4rdOYuStNUZrFtoBo/AAhbp0bibgoRqDpWoCaSJaBiqaqyhEFHeJj bqM2k9K8Ixx0QVKI5oQXDOaSle6yIe5yd560Br5iW8c40ugwG4W6cifKkj5K9aFBObq/DK5C/Aiz UZ1QBjGzcXMQJrq66Ie4S6qqAR+XQ7dCni6GT0eIVkXxKRYOU4fuQT3UMR9h3pAb4crGfMtXtrAj o0qLWofUFquAzEvGGpk2sHeFoZz+avmEaQf97twpDfecohUVy0p/GeIWee8ppwLs1bUhwuhoNL5+ f/P9YhYn4xAfMhudsVJSzcA1isi+QV6YELdpjdiPRAnb0t64dhNdhnh/ducvA9EMGBAN/wdIVbaL bCUF2z4FQA3iZ/LfxHUSAifk/kvl/tYA7zTPGeSg7GwCdCtSVmYw9OZbbaV2PfcpGdumFZwk+BNn wRsqfjlJeEQMqX5zMP9MjqdVW6NjviGqONnRqeHvZxDu5vA4pXZ2FZS1jFgc1rbRBWn7Dv8m1fTt 5a6b3opctrQ+7/qdFC2LtvsHafWeHrfw2DKwcIO5HtaHqQ1MvZLsjX7j+3aDQVxmNN+irSwVqrYO ZMs3Ba2fI5JlNd0Q/QFRC2gGyMUqc2Q2gBqLaGXXlo+IiAyVdl3irtUjagLk3FTfnZVWSNuXyIhC sCsOVEhqnxACt3g8RxoAHe0SjY+gCrluB8iNK7tZge0QUO9XTZpa7aIrG+cG1GOivu+Wut0gj/4G UEsDBBQAAAAIALWJWUTO/PzSfAEAAPMDAAASAAAAU2FtcGxlU29sdXRpb24uc2xupZJPT4MwGMbP I+l3IHiZyWhahlMOHqCjelCzSPTkBaEsNYUS/piYuU/mwY/kV7C4MQdOY7Yb79Pnfd5f3/Lx9g60 ax4VspRJpd/zsg6FHlR1zKUeSFFXXGY65YKNdCqLNFQeVpSNiC2IENCOek0WwmOgrbSV1Dacf7XA McIYQdSMzXhap79YlQXayMIOxECbFfKJRdXQWFDXR7ZPkKliqInxdGx61PZMhAiy6anjU48sjWOV YARhmgvWXsIY9ZWHbgmjMldjGt8CE/+EWsQxPc91THvqEPOMOpZp2S6ZTMjYRdRZGkDzs3iNBrQL IR9DAbTB6iNgUZM6bOOJzBI+r4uwKWYirBK1zrIBzYsNg+oeTNljPX91sxedzO7UcaduDLdMsLBk W5aeokwKrIPxA2uN/QeVLKttrP/tBHZooauGPTOSzHfdY69Er+YihuiAvN6yOoy9swNSvzn3eJx2 7+qRclZUnO36Ty55vKlvZMyUg7pXgb9zwEYB2idQSwMEFAAAAAgA0YlZRPu9+A3lCAAAAEwAABYA AABTYW1wbGVTb2x1dGlvbi52MTIuc3Vv7Vt9bFvVFT9OaZemQPrBSlvazAshFKiD47hunBboy4tN gYRGdfoxZAm5tuM5cWzLH/1QU2mbNm1/jE1jf6xCVOqmTUCF+PhrAyTEh4RUCSn9B03sH2jF/mLS gEl8STj73eNr59mO7fdsl7TJO0/H77777nu/cz/Ouefed3x5bsPHf3512xUqowdpFeXm19IaTZ4F 3Fa4WE90k8zLzc/Pi6xV4HmTbig6RAkcGbKSh+I4p+g0GaHNtLrY57fWKfvKlx2P7XPMWXaIiw35 vHEgJmiKHgH6JFIeOkVGaDO1WQT2Vjn29Dyj5ocv0wQFKE3TNEpRnDN0GL9hShXz03Xe1QP8bTj/ 0AD+MLhdpo8CN04h1PwkjQEzDo6wBH00zvfiuAqRFzkBmqFwmUQu4N+C880G8BVZnrj9iL6bby0J eyDaZDtY9Mvt4DvAW6St6ML5R2Ar+MfgbvCd3JZEd8kyJi0//b/87f4F/d/YMv0vmXP0PPOwqf9F /S+022ppBwq6+wOph1tboI9rpP63S7xa+r92hfkQS025MhbjYI2m/wV3yLQYM2Ks3Sqv18tpXKQ3 4Xyb1IPN0uZvkfZ/m+x/MR/skOVr2f9e8N3gneB7wPeC79PI0yfTdpz7wQ7wANgJ3s06QbQHPAh2 g4c0zz7Avu3CtZZHkO8BezX3lzuNwKIcpyxFpNU5CiuToSD9tMLSLE5W2J+tsu/nddqfh2R5QeX4 w+AwZJimJGxilOekWnLsBH67xm6QDtoHfqYKvph/gkglgRuFBPE6rdAL/HVSX/Ti75W2cDF8r5wP fMDOUoplqUW90v9dbQD/fvBVuZA7CJQMxRhVcATIGR4DYcgWhQT15z9hA7oM4It14/syPcz+xzRm tgCwpjXo+mg78C2aOUPPM6ukbaFF5n8fRn6CUqwD2Tpjj/L1N+x/tGn634vZ2EN22C4P1iX9ZIMl s+PsRaofxwiunyx6SZWtM9QAvkX2AenGn8D1GO4HKFnpfxjGJw3+EbxvgsdADHqQgPb5WA9OoD+C OkZBN/A3yrlGL/5+DX6t8S9sQf816H+x/vyEWkdG8bV0EK0+hb6NoM1Vtnei5nmre4Rn0Lrtb7lJ zut68TvBv5BplWKsgQItCuSTFVLUpkbaP6cpdxgoMSAGKMR+dkHTwhh9GR0zYLe0v9cKv956qLfJ +jdLN0t70ih9pq6lZuhNSxA20E9ZuW5Lk581eZotSgCrWT+vroQ1nymOKT/blzTyAihlZcufpRDP +FZysAUcIH9Fb/jJx6uwJJ4K8xwdo2zRU6h3N/+2iFzJ9eGdaTp+/ldXH/8q/Mtjf9j8a8dzf/wJ LbL+qVX/Tz+NTr68b/R/9h07p+Y+cr5HBmmp7X8rqBH8VtKNjN/o+q9T7qGI/I3yrHf91yXLG13/ 7dLIdL9M613/7dU8+6Bcgyy2Blxp5BnzTlAT5FF949QEHZvroGaop2IFkYYFP0J2tmJ9/FvPF3+L buw5pJkZuNn5G+3XQZe++Pf2F954duz3T/e8OPnuhW8KLxSG5Eom9xf175c3vLSNLlzqnH+3DKxZ egS8Ll8HC22v1XZ1bn+YfwnzxWvqVCQrBkRaI1e6TK56d4W8NSt2WFbqgJ1KD5vOVPlRQj7qWfed ct9Tbx949V8X5zb97WjnKF1+/fNjv+l+zfPi0AfBc1+d2lEoOTh52zu5d7pG/3o+9NKfuv7rrlbS CIm9hzHUNsb1za/dUtzwyaLmET3Aa34xC4g54gw6QoW/sxtejQMpNyo7jEPhlBM+jxu5NswfXqQc SDmQqyDPhUNFJypk53tnoYEhOlmGe5B3j7SonURVZMsPAlG2nXpbLNteUlpe20OQOMY7dEI1ZnEv DnWwotw4RlofTdJwcQdxGCVDJe3wUMvlWdg/MypLfiQoeLsX0uxhD7ifZRHpgaL/K1RB4XuKVAqB L+QWUohDyKR3JHTw95cgj9YTkF2FlBHZ/7cQ1ajP3kXH/9iqvB9moQ8tI0N2HGf6Vc9ur0N124aH FbfNOeJWbYNet8PmcCqqy6UOKHav++ysLzCTjIV9iVg2E03E/aWXfcF0MpWYmg0O+bPpcCrtj0en E7HAaX8oEczOhOOZtP9ENJ0NxKzpTDYUTVgd9v4Bv3gkHMS9NL8sLV9WfolikVRgBhizs2cUl7rH 6VQGbXaPU7E5varLNjjoUmx2l9MxOGDf7XTtcZ4Vxr0wb0T3L+uKjizj2nWMFx950phI4wWRalbX v/D+cjXZQpa26g5QGzVMrXBn2lqcZ4QKJNZ9P+P9uKEKL9PKXyXy7ocVq7JTsM0urMz8NMa7tKKs cEwmOY7gSIkT5CtxgvrJwT65H6VU/AbZUgoXR3zp8AP/6SWX4QR+g/wNQOwKH2epfve9SxXgXekZ PBnUyFa4vn4kyucKiX67xBKJ3fsge74hHd8NWrUPZZF9cT2tIL9P+7XU+7/N7n+udGp0/y+3DOM/ VuL+XyviPyxm/EfD8R/LIP7D8PeHFsd/GMY34z/yfbBMvv/z+DcS/5Ezv/8Xyx1Aq4cYO47RFcOv l/3JkPRj61F3k/hihy4I/YtwvbNs+0Zle4zwWA+0vP5rec84T+Xec2H0pTj/YN15oK8B/HaN/pf2 9wSusmyHCvHwKbaMBRkqyd5k+1eff04D+Ti3gp75Z1OD+leOP4bfGa736ZLY+GojcZfE7zSAb2O7 b8T/0EpSSk7g387zkH78XYv0v9DzJFuCFMtRaemr27/1ck7Riy/8la/zScbNMGKcV6ELa/XSkVnN Kg/J9r+j4f4vXRVrW3qcdwaiNTUQ498i1hsdBvC75L65oFr4hf+C1LJD0H/LGs1/H8lg/Re3P5O4 irD/V0v3iceScf0X8Rr/aVte8Z8bGoz/bAU1Un+6TvDN+A8z/sOM/8DtJzTxHz21CvahxWMU11/w mgZg6I2/GKXUpUeVe85NPfb8Py/8/FDuHxeNRWVUe75ZMuM3Vnb8hhm/YcZvmPEbN0btrqv4jQ4Z tGDGbzCZ8Rtm/IYZv2GcVnr8xv8BUEsBAh8ACgAAAAAA1IlZRAAAAAAAAAAAAAAAAA8AJAAAAAAA AAAQAAAAAAAAAFNhbXBsZVNvbHV0aW9uLwoAIAAAAAAAAQAYAMClP048Ms8BwKU/TjwyzwHnLV0n PDLPAVBLAQIfABQAAAAIALKJWUTDeUDOigAAALsAAAAZACQAAAAAAAAAIAAAAC0AAABTYW1wbGVT b2x1dGlvbi9BcHAuY29uZmlnCgAgAAAAAAABABgAqyq+JzwyzwGOA74nPDLPAY4Dvic8Ms8BUEsB Ah8AFAAAAAgAy4lZRMTOQ6ONAAAAygAAABkAJAAAAAAAAAAgAAAA7gAAAFNhbXBsZVNvbHV0aW9u L1Byb2dyYW0uY3MKACAAAAAAAAEAGAAs75VDPDLPASzvlUM8Ms8BxVG+JzwyzwFQSwECHwAKAAAA AACyiVlEAAAAAAAAAAAAAAAAGgAkAAAAAAAAABAAAACyAQAAU2FtcGxlU29sdXRpb24vUHJvcGVy dGllcy8KACAAAAAAAAEAGABegs4nPDLPAV6Czic8Ms8BEEC9JzwyzwFQSwECHwAUAAAACACyiVlE irAaq3gCAACgBQAAKQAkAAAAAAAAACAAAADqAQAAU2FtcGxlU29sdXRpb24vUHJvcGVydGllcy9B c3NlbWJseUluZm8uY3MKACAAAAAAAAEAGAAfDc4nPDLPAR8Nzic8Ms8BW7W9JzwyzwFQSwECHwAU AAAACAC1iVlEUXyqBosDAAAKCgAAJAAkAAAAAAAAACAAAACpBAAAU2FtcGxlU29sdXRpb24vU2Ft cGxlU29sdXRpb24uY3Nwcm9qCgAgAAAAAAABABgA2WqJKzwyzwEVx74nPDLPARXHvic8Ms8BUEsB Ah8AFAAAAAgAtYlZRM78/NJ8AQAA8wMAABIAJAAAAAAAAAAgAAAAdggAAFNhbXBsZVNvbHV0aW9u LnNsbgoAIAAAAAAAAQAYANrxiis8Ms8BzY+nJzwyzwHNj6cnPDLPAVBLAQIfABQAAAAIANGJWUT7 vfgN5QgAAABMAAAWACQAAAAAAAAAIgAAACIKAABTYW1wbGVTb2x1dGlvbi52MTIuc3VvCgAgAAAA AAABABgA0PpASzwyzwH0GIsrPDLPAfQYiys8Ms8BUEsFBgAAAAAIAAgAYAMAADsTAAAAAA=="); } private byte[] GetSampleSolutionWhereTheProjectIsLocatedInSingleFolder() { return Convert.FromBase64String( @"UEsDBAoAAAAAAAxiY0QAAAAAAAAAAAAAAAAPAAAAU2FtcGxlU29sdXRpb24vUEsDBBQAAAAIALKJ WUTDeUDOigAAALsAAAAZAAAAU2FtcGxlU29sdXRpb24vQXBwLmNvbmZpZ3u/e7+NfUVujkJZalFx Zn6erZKhnoGSQmpecn5KZl66rVJpSZquhZKCvR0vl01yfl5aZnppUWJJZn4eUEABCGyKSxKLSkoL 7BQgfIhYaUFBflFJakpQaV5JZm4qwvQyE5Dxxdmltkp6fq4hbkWJuanl+UXZOmFQFUAFpkoK+jDT 9WHGA63XR7UfAFBLAwQUAAAACADLiVlExM5Do40AAADKAAAAGQAAAFNhbXBsZVNvbHV0aW9uL1By b2dyYW0uY3NVizEKwlAMhvdC7xA6tUsv0NFJUBA6OIcaSvC9pLykFRFP5uCRvIKVCtWPQH7+fHk9 noKRbMCOoMU4BGo1jM4qeXbLM5gZjaWH9mpOscmzpWRxSoIBuoBmcEjaJ4zL7fv3p5mjcweT8gn2 yFJWq/Tjf9iomAaqj4mddixUFluHi6az1UXVrPJ9ifOa5w1QSwMECgAAAAAAsolZRAAAAAAAAAAA AAAAABoAAABTYW1wbGVTb2x1dGlvbi9Qcm9wZXJ0aWVzL1BLAwQUAAAACACyiVlEirAaq3gCAACg BQAAKQAAAFNhbXBsZVNvbHV0aW9uL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzjVRLbhNBEN1H yh1K3sRE2HFiJyhhBY6IvAigOERCiEXPTLXdSU/XqD82cyTOwAKJC3EFqtvjjC1igr1wu/rVq1dT r+b3j5/BKTODae08lv0blBpzr8i83t/bvgnGqxL7YyorpdFO0S5Ujm4XbmI8Wqo2YPt7R0dwhQat 0DAxkmwpYiUQGQUPgg/OYZnpGpSDnIy3pDUW4OeWwmzOvwiSQ7SM9RKdQw8kQXhvVRY8uj6M58LM MIIdthewEDqgA09QUqFkndhUqyLRsQDKlfBcdKn8fFNTf3/vy/p8AW+a063yGrudqSgrjVPSIVJ1 Xnx9EnyJLreqipBuZxdoTEaqWbDiOVhZCVPvBny0VITc/6+2MVW1VbM5Jzwe4dd3gJPB8WhX0q0V BZbCPvxDZ9A+WGwA6SFP0fs4QG7hTjmVaYxTkULzvErxgC6NxtcVn5ThP8q1zjDkYdFkJTZOHX+4 ZruUFRk0nh0AEwk1BTAYzUMgcjYgcyTOvymlpXLFxUQvk6WigA15rYuYzduAQJFE+MS47Yw2rZta emz7dsu9V58ml9Hm7L9UbXIZfbxuXKsMlFzprCzd80pGMH6ryK16YqlbZa+CKrqdfJSNhsVw1Ds7 eSV7ozMc9rIRDnpyMBydn5+eDU4L0Q7iDq2L+7exBUnPhuvjGjrlvFurazuQFGyzVReRLlGmz7W4 J7tm3wgr04ahjb8NShfwPpQZ2jZ6gwu1zk/RzzzRnKW5CvO4v0LrpKhZbKauG0SBUrDt0u2KXJji kbCp5FYKshpWr68IPjg84M7BzWlpIENuNHUGT/i6aaPbOe4P+ofpmT6H4u8u3Dt+oz6J/QNQSwME FAAAAAgAtYlZRFF8qgaLAwAACgoAACQAAABTYW1wbGVTb2x1dGlvbi9TYW1wbGVTb2x1dGlvbi5j c3Byb2q1Vt1u2zYUvh+wd+CEAW6ASkzcpKg3WYUi20GAtjFsd9uFb2jpyObKH42k0njrnmwXe6S9 wkhJ9iR7SY1h1YUAnn+e7/Cc89cff4avHzhD96A0lWLoXQTnHgKRyoyK9dArTe6/8l5HX38VTpX8 GVKDFlIy/cNevu8URpCTkpkFUWsweuhdl5RlHrKWhT1tjCm+w1inG+BEB5ymSmqZmyCVHGdwD0wW oDDXK6eG++fnLzzrEaHwlhdSGdS4HnrfPns7r2yPHwwIF4GeErM5W+4Z7ejOlm/3rhLJuRRBoWSh PZRIkVFTXWD8QLXRz3r/zfSh6d6Zh3Ad+1S5W5ntjZJlUZEs0TrO6bpUxDlvh4FsAB3mWQ8Nh6jX Q140glW5DnGHvTM4ZcTkUvFDWzt6y0wstsn0fYh3rL2JOrs3Jc2i3y6S8dWknwz86+t44F+OBon/ ajLo+/3LOHn5MnkRn08Gv4e4rdOYuStNUZrFtoBo/AAhbp0bibgoRqDpWoCaSJaBiqaqyhEFHeJj bqM2k9K8Ixx0QVKI5oQXDOaSle6yIe5yd560Br5iW8c40ugwG4W6cifKkj5K9aFBObq/DK5C/Aiz UZ1QBjGzcXMQJrq66Ie4S6qqAR+XQ7dCni6GT0eIVkXxKRYOU4fuQT3UMR9h3pAb4crGfMtXtrAj o0qLWofUFquAzEvGGpk2sHeFoZz+avmEaQf97twpDfecohUVy0p/GeIWee8ppwLs1bUhwuhoNL5+ f/P9YhYn4xAfMhudsVJSzcA1isi+QV6YELdpjdiPRAnb0t64dhNdhnh/ducvA9EMGBAN/wdIVbaL bCUF2z4FQA3iZ/LfxHUSAifk/kvl/tYA7zTPGeSg7GwCdCtSVmYw9OZbbaV2PfcpGdumFZwk+BNn wRsqfjlJeEQMqX5zMP9MjqdVW6NjviGqONnRqeHvZxDu5vA4pXZ2FZS1jFgc1rbRBWn7Dv8m1fTt 5a6b3opctrQ+7/qdFC2LtvsHafWeHrfw2DKwcIO5HtaHqQ1MvZLsjX7j+3aDQVxmNN+irSwVqrYO ZMs3Ba2fI5JlNd0Q/QFRC2gGyMUqc2Q2gBqLaGXXlo+IiAyVdl3irtUjagLk3FTfnZVWSNuXyIhC sCsOVEhqnxACt3g8RxoAHe0SjY+gCrluB8iNK7tZge0QUO9XTZpa7aIrG+cG1GOivu+Wut0gj/4G UEsBAh8ACgAAAAAADGJjRAAAAAAAAAAAAAAAAA8AJAAAAAAAAAAQAAAAAAAAAFNhbXBsZVNvbHV0 aW9uLwoAIAAAAAAAAQAYAPbhgqHJNs8B9uGCock2zwHnLV0nPDLPAVBLAQIfABQAAAAIALKJWUTD eUDOigAAALsAAAAZACQAAAAAAAAAIAAAAC0AAABTYW1wbGVTb2x1dGlvbi9BcHAuY29uZmlnCgAg AAAAAAABABgAqyq+JzwyzwGOA74nPDLPAY4Dvic8Ms8BUEsBAh8AFAAAAAgAy4lZRMTOQ6ONAAAA ygAAABkAJAAAAAAAAAAgAAAA7gAAAFNhbXBsZVNvbHV0aW9uL1Byb2dyYW0uY3MKACAAAAAAAAEA GAAs75VDPDLPASzvlUM8Ms8BxVG+JzwyzwFQSwECHwAKAAAAAACyiVlEAAAAAAAAAAAAAAAAGgAk AAAAAAAAABAAAACyAQAAU2FtcGxlU29sdXRpb24vUHJvcGVydGllcy8KACAAAAAAAAEAGABegs4n PDLPAV6Czic8Ms8BEEC9JzwyzwFQSwECHwAUAAAACACyiVlEirAaq3gCAACgBQAAKQAkAAAAAAAA ACAAAADqAQAAU2FtcGxlU29sdXRpb24vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKACAAAAAA AAEAGAAfDc4nPDLPAR8Nzic8Ms8BW7W9JzwyzwFQSwECHwAUAAAACAC1iVlEUXyqBosDAAAKCgAA JAAkAAAAAAAAACAAAACpBAAAU2FtcGxlU29sdXRpb24vU2FtcGxlU29sdXRpb24uY3Nwcm9qCgAg AAAAAAABABgA2WqJKzwyzwEVx74nPDLPARXHvic8Ms8BUEsFBgAAAAAGAAYAlAIAAHYIAAAAAA=="); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Compilers.Tests/OJS.Workers.Compilers.Tests.csproj ================================================  Debug AnyCPU {A6A4AB27-2B67-4E8D-BAA6-2FDBB8366CCE} Library Properties OJS.Workers.Compilers.Tests OJS.Workers.Compilers.Tests v4.5 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest ..\..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.interfaces.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.framework.dll True ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.util.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\NUnit.VisualStudio.TestAdapter.dll False {69B10B02-22CF-47D6-B5F3-8A5FFB7DC771} OJS.Common {7F714D0B-CE81-4DD7-B6B2-62080FE22CD8} OJS.Workers.Common {8570183B-9D7A-408D-9EA6-F86F59B05A10} OJS.Workers.Compilers False False False False ================================================ FILE: Open Judge System/Tests/OJS.Workers.Compilers.Tests/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Workers.Compilers.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Workers.Compilers.Tests")] [assembly: AssemblyCopyright("Copyright © 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("f46c097b-0515-43ca-9e19-a6fa05ffe1c8")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Tests/OJS.Workers.Compilers.Tests/packages.config ================================================  ================================================ FILE: Open Judge System/Tests/OJS.Workers.ExecutionStrategies.Tests/JsonExecutionResultTests.cs ================================================ namespace OJS.Workers.ExecutionStrategies.Tests { using NUnit.Framework; [TestFixture] public class JsonExecutionResultTests { private const string ParseErrorMessage = "Invalid console output!"; [Test] public void MochaExecutionResultParseShouldReturnPassedWithCorrectPassesJSONString() { var jsonString = "{stats: {passes: 1}}"; var result = JsonExecutionResult.Parse(jsonString); Assert.IsTrue(result.Passed); Assert.IsNullOrEmpty(result.Error); } [Test] public void MochaExecutionResultParseShouldReturnNotPassedWithCorrectErrorWithCorrectNoPassesJSONString() { var jsonString = "{stats: {passes: 0}}"; var result = JsonExecutionResult.Parse(jsonString); Assert.IsFalse(result.Passed); Assert.AreEqual(ParseErrorMessage, result.Error); } [Test] public void MochaExecutionResultParseShouldReturnNotPassedWithCorrectErrorWithCorrectNoPassesAndFailiureJSONString() { var jsonString = "{stats: {passes: 0}, failures: [{ err: { message: \"Custom error\" } }]}"; var result = JsonExecutionResult.Parse(jsonString); Assert.IsFalse(result.Passed); Assert.AreEqual("Custom error", result.Error); } [Test] public void MochaExecutionResultParseShouldReturnNotPassedWithCorrectErrorInvalidJSONString() { var jsonString = "{stats: {passes: 1}"; var result = JsonExecutionResult.Parse(jsonString); Assert.IsFalse(result.Passed); Assert.AreEqual(ParseErrorMessage, result.Error); } [Test] public void MochaExecutionResultParseShouldReturnNotPassedWithCorrectErrorInvalidTwoObjectsInJSONString() { var jsonString = "{stats: {passes: 1}} {stats: {passes: 1}}"; var result = JsonExecutionResult.Parse(jsonString); Assert.IsFalse(result.Passed); Assert.AreEqual(ParseErrorMessage, result.Error); } [Test] public void MochaExecutionResultParseShouldReturnNotPassedWithCorrectErrorCommentInJSONString() { var jsonString = "{stats: {passes: 1}} /* comment */ {stats: {passes: 1}}"; var result = JsonExecutionResult.Parse(jsonString); Assert.IsFalse(result.Passed); Assert.AreEqual(ParseErrorMessage, result.Error); } [Test] public void MochaExecutionResultParseShouldReturnNotPassedWithCorrectErrorDoubleCommentInJSONString() { var jsonString = "{stats: {passes: 1}} //** comment **// {stats: {passes: 1}}"; var result = JsonExecutionResult.Parse(jsonString); Assert.IsFalse(result.Passed); Assert.AreEqual(ParseErrorMessage, result.Error); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.ExecutionStrategies.Tests/OJS.Workers.ExecutionStrategies.Tests.csproj ================================================  Debug AnyCPU {1A12AF9D-5BD6-455E-924E-54E686A2F270} Library Properties OJS.Workers.ExecutionStrategies.Tests OJS.Workers.ExecutionStrategies.Tests v4.5 512 ..\..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.interfaces.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.framework.dll True ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.util.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\NUnit.VisualStudio.TestAdapter.dll False {69966098-e5b2-46cd-88e9-1f79b245ade0} OJS.Workers.ExecutionStrategies ================================================ FILE: Open Judge System/Tests/OJS.Workers.ExecutionStrategies.Tests/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Workers.ExecutionStrategies.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Workers.ExecutionStrategies.Tests")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("13f1a05e-fa2a-4e2f-ab45-55e01017c76b")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Tests/OJS.Workers.ExecutionStrategies.Tests/packages.config ================================================  ================================================ FILE: Open Judge System/Tests/OJS.Workers.Executors.Tests/BaseExecutorsTestClass.cs ================================================ namespace OJS.Workers.Executors.Tests { using System; using System.CodeDom.Compiler; using System.IO; using Microsoft.CSharp; using NUnit.Framework; public abstract class BaseExecutorsTestClass { private readonly string exeDirectory = string.Format(@"{0}\Exe\", Environment.CurrentDirectory); public string CreateExe(string exeName, string sourceString) { Directory.CreateDirectory(this.exeDirectory); var outputExePath = this.exeDirectory + exeName; if (File.Exists(outputExePath)) { File.Delete(outputExePath); } var codeProvider = new CSharpCodeProvider(); var parameters = new CompilerParameters { GenerateExecutable = true, OutputAssembly = outputExePath, }; parameters.ReferencedAssemblies.Add("System.dll"); parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, sourceString); foreach (var error in results.Errors) { Console.WriteLine(error.ToString()); } Assert.IsFalse(results.Errors.HasErrors, "Code compilation contains errors!"); return outputExePath; } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Executors.Tests/OJS.Workers.Executors.Tests.csproj ================================================  Debug AnyCPU {5054FE58-791D-41EA-9ED9-911788A7E631} Library Properties OJS.Workers.Executors.Tests OJS.Workers.Executors.Tests v4.5 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest ..\..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.interfaces.dll False ..\..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.util.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\NUnit.VisualStudio.TestAdapter.dll False {7f714d0b-ce81-4dd7-b6b2-62080fe22cd8} OJS.Workers.Common {cda78d62-7210-45ca-b3e5-9f6a5dea5734} OJS.Workers.Executors False False False False Este proyecto hace referencia a los paquetes NuGet que faltan en este equipo. Use la restauración de paquetes NuGet para descargarlos. Para obtener más información, consulte http://go.microsoft.com/fwlink/?LinkID=322105. El archivo que falta es {0}. ================================================ FILE: Open Judge System/Tests/OJS.Workers.Executors.Tests/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Workers.Executors.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Workers.Executors.Tests")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("22c18b85-f57d-401f-aed5-9137a35cf195")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Tests/OJS.Workers.Executors.Tests/RestrictedProcessSecurityTests.cs ================================================ namespace OJS.Workers.Executors.Tests { using System; using System.Diagnostics; using System.Linq; using System.Threading; using System.Windows.Forms; using NUnit.Framework; using OJS.Workers.Common; [TestFixture] public class RestrictedProcessSecurityTests : BaseExecutorsTestClass { [Test] public void RestrictedProcessShouldNotBeAbleToCreateFiles() { const string CreateFileSourceCode = @"using System; using System.IO; class Program { public static void Main() { File.OpenWrite(""test.txt""); } }"; var exePath = this.CreateExe("RestrictedProcessShouldNotBeAbleToCreateFiles.exe", CreateFileSourceCode); var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, string.Empty, 1000, 32 * 1024 * 1024); Assert.IsNotNull(result); Assert.IsTrue(result.Type == ProcessExecutionResultType.RunTimeError, "No exception is thrown!"); } [Test] [Apartment(ApartmentState.STA)] public void RestrictedProcessShouldNotBeAbleToReadClipboard() { const string ReadClipboardSourceCode = @"using System; using System.Windows.Forms; class Program { public static void Main() { if (string.IsNullOrEmpty(Clipboard.GetText())) { throw new Exception(""Clipboard empty!""); } } }"; Clipboard.SetText("clipboard test"); var exePath = this.CreateExe("RestrictedProcessShouldNotBeAbleToReadClipboard.exe", ReadClipboardSourceCode); var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, string.Empty, 1500, 32 * 1024 * 1024); Assert.IsNotNull(result); Assert.IsTrue(result.Type == ProcessExecutionResultType.RunTimeError, "No exception is thrown!"); } [Test] public void RestrictedProcessShouldNotBeAbleToWriteToClipboard() { const string WriteToClipboardSourceCode = @"using System; using System.Windows.Forms; class Program { public static void Main() { Clipboard.SetText(""i did it""); } }"; var exePath = this.CreateExe("RestrictedProcessShouldNotBeAbleToWriteToClipboard.exe", WriteToClipboardSourceCode); var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, string.Empty, 1500, 32 * 1024 * 1024); Assert.IsNotNull(result); Assert.IsTrue(result.Type == ProcessExecutionResultType.RunTimeError, "No exception is thrown!"); Assert.AreNotEqual("i did it", Clipboard.GetText()); } [Test] public void RestrictedProcessShouldNotBeAbleToStartProcess() { const string StartNotepadProcessSourceCode = @"using System; using System.Diagnostics; class Program { public static void Main() { Process.Start(string.Format(""{0}\\notepad.exe"", Environment.SystemDirectory)); } }"; var notepadsBefore = Process.GetProcessesByName("notepad.exe").Count(); var exePath = this.CreateExe("RestrictedProcessShouldNotBeAbleToStartProcess.exe", StartNotepadProcessSourceCode); var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, string.Empty, 1500, 32 * 1024 * 1024); var notepadsAfter = Process.GetProcessesByName("notepad.exe").Count(); Assert.IsNotNull(result); Assert.IsTrue(result.Type == ProcessExecutionResultType.RunTimeError, "No exception is thrown!"); Assert.AreEqual(notepadsBefore, notepadsAfter); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Executors.Tests/RestrictedProcessTests.cs ================================================ namespace OJS.Workers.Executors.Tests { using System; using NUnit.Framework; using OJS.Workers.Common; [TestFixture] public class RestrictedProcessTests : BaseExecutorsTestClass { private const string ReadInputAndThenOutputSourceCode = @"using System; class Program { public static void Main() { var line = Console.ReadLine(); Console.WriteLine(line); } }"; private const string Consuming50MbOfMemorySourceCode = @"using System; using System.Windows.Forms; class Program { public static void Main() { var array = new int[50 * 1024 * 1024 / 4]; for (int i = 0; i < array.Length; i++) { array[i] = i; } Console.WriteLine(array[12345]); } }"; [Test] public void RestrictedProcessShouldStopProgramAfterTimeIsEnded() { const string TimeLimitSourceCode = @"using System; using System.Threading; class Program { public static void Main() { Thread.Sleep(150); } }"; var exePath = this.CreateExe("RestrictedProcessShouldStopProgramAfterTimeIsEnded.exe", TimeLimitSourceCode); var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, string.Empty, 100, 32 * 1024 * 1024); Assert.IsNotNull(result); Assert.IsTrue(result.Type == ProcessExecutionResultType.TimeLimit); } [Test] public void RestrictedProcessShouldSendInputDataToProcess() { var exePath = this.CreateExe("RestrictedProcessShouldSendInputDataToProcess.exe", ReadInputAndThenOutputSourceCode); const string InputData = "SomeInputData!!@#$%^&*(\n"; var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, InputData, 2000, 32 * 1024 * 1024); Assert.IsNotNull(result); Assert.AreEqual(InputData.Trim(), result.ReceivedOutput.Trim()); } [Test] public void RestrictedProcessShouldWorkWithCyrillic() { var exePath = this.CreateExe("RestrictedProcessShouldWorkWithCyrillic.exe", ReadInputAndThenOutputSourceCode); const string InputData = "Николай\n"; var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, InputData, 2000, 32 * 1024 * 1024); Assert.IsNotNull(result); Assert.AreEqual(InputData.Trim(), result.ReceivedOutput.Trim()); } [Test] public void RestrictedProcessShouldOutputProperLengthForCyrillicText() { const string ReadInputAndThenOutputTheLengthSourceCode = @"using System; class Program { public static void Main() { var line = Console.ReadLine(); Console.WriteLine(line.Length); } }"; var exePath = this.CreateExe("RestrictedProcessShouldOutputProperLengthForCyrillicText.exe", ReadInputAndThenOutputTheLengthSourceCode); const string InputData = "Николай\n"; var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, InputData, 2000, 32 * 1024 * 1024); Assert.IsNotNull(result); Assert.AreEqual("7", result.ReceivedOutput.Trim()); } [Test] public void RestrictedProcessShouldReceiveCyrillicText() { const string ReadInputAndThenCheckTheTextToContainCyrillicLettersSourceCode = @"using System; class Program { public static void Main() { var line = Console.ReadLine(); Console.WriteLine((line.Contains(""а"") || line.Contains(""е""))); } }"; var exePath = this.CreateExe("RestrictedProcessShouldReceiveCyrillicText.exe", ReadInputAndThenCheckTheTextToContainCyrillicLettersSourceCode); const string InputData = "абвгдежзийклмнопрстуфхцчшщъьюя\n"; var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, InputData, 2000, 32 * 1024 * 1024); Assert.IsNotNull(result); Assert.AreEqual("True", result.ReceivedOutput.Trim()); } [Test] public void RestrictedProcessShouldNotBlockWhenEnterEndlessLoop() { const string EndlessLoopSourceCode = @"using System; class Program { public static void Main() { while(true) { } } }"; var exePath = this.CreateExe("RestrictedProcessShouldNotBlockWhenEnterEndlessLoop.exe", EndlessLoopSourceCode); var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, string.Empty, 50, 32 * 1024 * 1024); Assert.IsNotNull(result); Assert.IsTrue(result.Type == ProcessExecutionResultType.TimeLimit); } [Test] public void RestrictedProcessStandardErrorContentShouldContainExceptions() { const string ThrowExceptionSourceCode = @"using System; using System.Windows.Forms; class Program { public static void Main() { throw new Exception(""Exception message!""); } }"; var exePath = this.CreateExe("RestrictedProcessShouldStandardErrorContentShouldContainExceptions.exe", ThrowExceptionSourceCode); var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, string.Empty, 500, 32 * 1024 * 1024); Assert.IsNotNull(result); Assert.IsTrue(result.Type == ProcessExecutionResultType.RunTimeError, "No exception is thrown!"); Assert.IsTrue(result.ErrorOutput.Contains("Exception message!")); } [Test] public void RestrictedProcessShouldReturnCorrectAmountOfUsedMemory() { var exePath = this.CreateExe("RestrictedProcessShouldReturnCorrectAmountOfUsedMemory.exe", Consuming50MbOfMemorySourceCode); var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, string.Empty, 5000, 100 * 1024 * 1024); Console.WriteLine(result.MemoryUsed); Assert.IsNotNull(result); Assert.IsTrue(result.MemoryUsed > 50 * 1024 * 1024); } [Test] public void RestrictedProcessShouldReturnMemoryLimitWhenNeeded() { var exePath = this.CreateExe("RestrictedProcessShouldReturnMemoryLimitWhenNeeded.exe", Consuming50MbOfMemorySourceCode); var process = new RestrictedProcessExecutor(); var result = process.Execute(exePath, string.Empty, 5000, 30 * 1024 * 1024); Console.WriteLine(result.MemoryUsed); Assert.IsNotNull(result); Assert.IsTrue(result.Type == ProcessExecutionResultType.MemoryLimit); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Executors.Tests/packages.config ================================================  ================================================ FILE: Open Judge System/Tests/OJS.Workers.Tools.Tests/AntiCheat/SortAndTrimLinesVisitorTests.cs ================================================ namespace OJS.Workers.Tools.Tests.AntiCheat { using System; using System.Linq; using NUnit.Framework; using OJS.Workers.Tools.AntiCheat; [TestFixture] public class SortAndTrimLinesVisitorTests { [Test] public void TestWith9LinesInRevertedOrder() { var data = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var input = string.Join(Environment.NewLine, data.Reverse()); var expectedOutput = string.Join(Environment.NewLine, data) + Environment.NewLine; var visitor = new SortAndTrimLinesVisitor(); var result = visitor.Visit(input); Assert.AreEqual(expectedOutput, result); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Tools.Tests/OJS.Workers.Tools.Tests.csproj ================================================  Debug AnyCPU {EE0CE0F5-BAF8-4AA9-83E8-84881CDABFB1} Library Properties OJS.Workers.Tools.Tests OJS.Workers.Tools.Tests v4.5 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest ..\..\ true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.core.interfaces.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.framework.dll True ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\nunit.util.dll False ..\..\packages\NUnitTestAdapter.WithFramework.2.0.0\lib\NUnit.VisualStudio.TestAdapter.dll False {a1f48412-495a-434c-bdd0-e70aedad6897} OJS.Workers.Tools False False False False ================================================ FILE: Open Judge System/Tests/OJS.Workers.Tools.Tests/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Workers.Tools.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Workers.Tools.Tests")] [assembly: AssemblyCopyright("Copyright © 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("214c40d8-a030-40c5-98e8-8057c596f7c5")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Tests/OJS.Workers.Tools.Tests/Similarity/SimilarityFinderDiffTextTests.cs ================================================ namespace OJS.Workers.Tools.Tests.Similarity { using System.Collections.Generic; using System.Text; using NUnit.Framework; using OJS.Workers.Tools.Similarity; /// /// Tests are adapted from the original code (http://www.mathertel.de/Diff/) /// [TestFixture] public class SimilarityFinderDiffTextTests { [Test] public void TestWhenAllLinesAreDifferent() { var firstText = "a,b,c,d,e,f,g,h,i,j,k,l".Replace(',', '\n'); var secondText = "0,1,2,3,4,5,6,7,8,9".Replace(',', '\n'); Assert.AreEqual("12.10.0.0*", TestHelper(new SimilarityFinder().DiffText(firstText, secondText, false, false, false))); } [Test] public void TestWhenAllLinesAreTheSame() { const string TextForSplit = "a,b,c,d,e,f,g,h,i,j,k,l"; var firstText = TextForSplit.Replace(',', '\n'); var secondText = TextForSplit.Replace(',', '\n'); Assert.AreEqual(string.Empty, TestHelper(new SimilarityFinder().DiffText(firstText, secondText, false, false, false))); } [Test] public void TestWhenSnakeCase() { var firstText = "a,b,c,d,e,f".Replace(',', '\n'); var secondText = "b,c,d,e,f,x".Replace(',', '\n'); Assert.AreEqual("1.0.0.0*0.1.6.5*", TestHelper(new SimilarityFinder().DiffText(firstText, secondText, false, false, false))); } [Test] public void TestOneChangeWithinLongChainOfRepeats() { var firstText = "a,a,a,a,a,a,a,a,a,a".Replace(',', '\n'); var secondText = "a,a,a,a,-,a,a,a,a,a".Replace(',', '\n'); Assert.AreEqual("0.1.4.4*1.0.9.10*", TestHelper(new SimilarityFinder().DiffText(firstText, secondText, false, false, false))); } [Test] public void TestSomeDifferences() { var firstText = "a,b,-,c,d,e,f,f".Replace(',', '\n'); var secondText = "a,b,x,c,e,f".Replace(',', '\n'); Assert.AreEqual("1.1.2.2*1.0.4.4*1.0.7.6*", TestHelper(new SimilarityFinder().DiffText(firstText, secondText, false, false, false))); } [Test] public void TestReproduceScenario20020920() { var firstText = "c1,a,c2,b,c,d,e,g,h,i,j,c3,k,l".Replace(',', '\n'); var secondText = "C1,a,C2,b,c,d,e,I1,e,g,h,i,j,C3,k,I2,l".Replace(',', '\n'); Assert.AreEqual("1.1.0.0*1.1.2.2*0.2.7.7*1.1.11.13*0.1.13.15*", TestHelper(new SimilarityFinder().DiffText(firstText, secondText, false, false, false))); } [Test] public void TestReproduceScenario20030207() { var firstText = "F".Replace(',', '\n'); var secondText = "0,F,1,2,3,4,5,6,7".Replace(',', '\n'); Assert.AreEqual("0.1.0.0*0.7.1.2*", TestHelper(new SimilarityFinder().DiffText(firstText, secondText, false, false, false))); } [Test] public void TestReproduceScenarioMuegel() { var firstText = "HELLO\nWORLD".Replace(',', '\n'); var secondText = "\n\nhello\n\n\n\nworld\n".Replace(',', '\n'); Assert.AreEqual("2.8.0.0*", TestHelper(new SimilarityFinder().DiffText(firstText, secondText, false, false, false))); } [Test] public void TestCaseInsensitiveWithTrimLines() { var firstText = "HELLO\nWORLD ".Replace(',', '\n'); var secondText = " hello \n world ".Replace(',', '\n'); Assert.AreEqual(string.Empty, TestHelper(new SimilarityFinder().DiffText(firstText, secondText, true, true, true))); } private static string TestHelper(IEnumerable differences) { var ret = new StringBuilder(); foreach (var difference in differences) { ret.Append(difference.DeletedA + "." + difference.InsertedB + "." + difference.StartA + "." + difference.StartB + "*"); } return ret.ToString(); } } } ================================================ FILE: Open Judge System/Tests/OJS.Workers.Tools.Tests/packages.config ================================================  ================================================ FILE: Open Judge System/Tools/SandboxExecutorProofOfConcept/App.config ================================================ 
================================================ FILE: Open Judge System/Tools/SandboxExecutorProofOfConcept/GlobalConstants.cs ================================================ namespace SandboxExecutorProofOfConcept { internal class GlobalConstants { public const string SampleJavaScriptCode = @" var EOL = require('os').EOL; DataView = undefined; DTRACE_NET_SERVER_CONNECTION = undefined; // DTRACE_NET_STREAM_END = undefined; DTRACE_NET_SOCKET_READ = undefined; DTRACE_NET_SOCKET_WRITE = undefined; DTRACE_HTTP_SERVER_REQUEST = undefined; DTRACE_HTTP_SERVER_RESPONSE = undefined; DTRACE_HTTP_CLIENT_REQUEST = undefined; DTRACE_HTTP_CLIENT_RESPONSE = undefined; COUNTER_NET_SERVER_CONNECTION = undefined; COUNTER_NET_SERVER_CONNECTION_CLOSE = undefined; COUNTER_HTTP_SERVER_REQUEST = undefined; COUNTER_HTTP_SERVER_RESPONSE = undefined; COUNTER_HTTP_CLIENT_REQUEST = undefined; COUNTER_HTTP_CLIENT_RESPONSE = undefined; global = undefined; process.argv = undefined; process.versions = undefined; process.env = { NODE_DEBUG: false }; process.addListener = undefined; process.EventEmitter = undefined; process.mainModule = undefined; process.removeListener = undefined; process.config = undefined; process.on = undefined; process.openStdin = undefined; process.chdir = undefined; process.cwd = undefined; process.umask = undefined; GLOBAL = undefined; root = undefined; setTimeout = undefined; setInterval = undefined; clearTimeout = undefined; clearInterval = undefined; setImmediate = undefined; clearImmediate = undefined; module = undefined; require = undefined; msg = undefined; delete DataView; delete DTRACE_NET_SERVER_CONNECTION; // delete DTRACE_NET_STREAM_END; delete DTRACE_NET_SOCKET_READ; delete DTRACE_NET_SOCKET_WRITE; delete DTRACE_HTTP_SERVER_REQUEST; delete DTRACE_HTTP_SERVER_RESPONSE; delete DTRACE_HTTP_CLIENT_REQUEST; delete DTRACE_HTTP_CLIENT_RESPONSE; delete COUNTER_NET_SERVER_CONNECTION; delete COUNTER_NET_SERVER_CONNECTION_CLOSE; delete COUNTER_HTTP_SERVER_REQUEST; delete COUNTER_HTTP_SERVER_RESPONSE; delete COUNTER_HTTP_CLIENT_REQUEST; delete COUNTER_HTTP_CLIENT_RESPONSE; delete global; delete process.argv; delete process.versions; delete GLOBAL; delete root; delete setTimeout; delete setInterval; delete clearTimeout; delete clearInterval; delete setImmediate; delete clearImmediate; delete module; delete require; delete msg; var content = ''; process.stdin.resume(); process.stdin.on('data', function(buf) { content += buf.toString(); }); process.stdin.on('end', function() { var inputData = content.trim().split(EOL); console.log(code.f(inputData)); }); var code = { f:function solve(content) { // !!! User code starts here var answer = ''; for(var i = 0; i < content.length; i++) { answer += content[i]; } return answer + 'new'; // !!! User code ends here } }; function x() { console.log(this); } x();"; } } ================================================ FILE: Open Judge System/Tools/SandboxExecutorProofOfConcept/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("SandboxExecutorProofOfConcept")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("SandboxExecutorProofOfConcept")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("f5ad29b1-15fe-456e-a4c9-cf622ec22c96")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Tools/SandboxExecutorProofOfConcept/SandboxExecutorProofOfConcept.csproj ================================================  Debug AnyCPU {EB599E35-73C7-4FD7-BA38-BE6FB6E60C8E} Exe Properties SandboxExecutorProofOfConcept SandboxExecutorProofOfConcept v4.5 512 AnyCPU true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset AnyCPU pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset {69B10B02-22CF-47D6-B5F3-8A5FFB7DC771} OJS.Common {7f714d0b-ce81-4dd7-b6b2-62080fe22cd8} OJS.Workers.Common {CDA78D62-7210-45CA-B3E5-9F6A5DEA5734} OJS.Workers.Executors {d51f7d60-421c-44b2-9422-2610066cb82d} SandboxTarget ================================================ FILE: Open Judge System/Tools/SandboxExecutorProofOfConcept/SandboxExecutorProofOfConceptProgram.cs ================================================ namespace SandboxExecutorProofOfConcept { using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Threading; using OJS.Common.Extensions; using OJS.Workers.Executors; using OJS.Workers.Executors.Process; internal class SandboxExecutorProofOfConceptProgram { private const string ProcessInfoFormat = "{0,-25} {1}"; private const string ProcessInfoTimeFormat = "{0,-25} {1:O}"; private static readonly string SandboxTargetExecutablePath = Environment.CurrentDirectory + @"\SandboxTarget.exe"; private static void Main() { // TODO: Agents should be run with ProcessPriorityClass.RealTime Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime; Console.WriteLine(Process.GetCurrentProcess().PriorityClass); // RunNodeJs(); // ThreadWork(); for (int i = 0; i < 1; i++) { var thread = new Thread(ThreadWork); thread.Start(); Thread.Sleep(100); } //// ExecuteProcessWithDifferentUser(SandboxTargetExecutablePath, ("Ю".Repeat(1024) + "").Repeat(20 * 1024) + "\n", 2000, 256 * 1024 * 1024); Console.ReadLine(); } private static void RunNodeJs() { const string NodeJsExe = @"C:\Program Files\nodejs\node.exe"; const string JsFilePath = @"C:\Temp\code.js"; const string JsFileWorkingDirectory = @"C:\Temp"; File.WriteAllText(JsFilePath, GlobalConstants.SampleJavaScriptCode); var process = new RestrictedProcess(NodeJsExe, JsFileWorkingDirectory, new List() { JsFilePath }); process.StandardInput.WriteLine("Vasko" + Environment.NewLine + "Niki2" + Environment.NewLine + "Niki3"); process.Start(1000, 100 * 1024 * 1024); process.StandardInput.Close(); var output = process.StandardOutput.ReadToEnd(); var error = process.StandardError.ReadToEnd(); Console.WriteLine(output); Console.WriteLine(error); Console.WriteLine(process.ExitCode); } private static void ThreadWork() { StartRestrictedProcess(SandboxTargetExecutablePath, "Ю".Repeat(1024).Repeat(25 * 1024) + "\n", 5000, 256 * 1024 * 1024); } private static void StartRestrictedProcess(string applicationPath, string textToWrite, int timeLimit, int memoryLimit) { var restrictedProcessExecutor = new RestrictedProcessExecutor(); Console.WriteLine("-------------------- Starting RestrictedProcess... --------------------"); var result = restrictedProcessExecutor.Execute(applicationPath, textToWrite, timeLimit, memoryLimit); Console.WriteLine("------------ Process output: {0} symbols. First 2048 symbols: ------------ ", result.ReceivedOutput.Length); Console.WriteLine(result.ReceivedOutput.Substring(0, Math.Min(2048, result.ReceivedOutput.Length))); if (!string.IsNullOrWhiteSpace(result.ErrorOutput)) { Console.WriteLine( "------------ Process error: {0} symbols. First 2048 symbols: ------------ ", result.ErrorOutput.Length); Console.WriteLine(result.ErrorOutput.Substring(0, Math.Min(2048, result.ErrorOutput.Length))); } Console.WriteLine("------------ Process info ------------ "); Console.WriteLine(ProcessInfoFormat, "Type:", result.Type); Console.WriteLine(ProcessInfoFormat, "ExitCode:", string.Format("{0} ({1})", result.ExitCode, new Win32Exception(result.ExitCode).Message)); Console.WriteLine(ProcessInfoFormat, "Total time:", result.TimeWorked); Console.WriteLine(ProcessInfoFormat, "PrivilegedProcessorTime:", result.PrivilegedProcessorTime); Console.WriteLine(ProcessInfoFormat, "UserProcessorTime:", result.UserProcessorTime); Console.WriteLine(ProcessInfoFormat, "Memory:", string.Format("{0:0.00}MB", result.MemoryUsed / 1024.0 / 1024.0)); Console.WriteLine(new string('-', 79)); } } } ================================================ FILE: Open Judge System/Tools/SandboxExecutorProofOfConcept/packages.config ================================================  ================================================ FILE: Open Judge System/Tools/SandboxTarget/App.config ================================================  ================================================ FILE: Open Judge System/Tools/SandboxTarget/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("SandboxTarget")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("SandboxTarget")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("ad096ced-92f2-4d6b-99c2-ed99a8bc2775")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Tools/SandboxTarget/SandboxTarget.csproj ================================================  Debug AnyCPU {D51F7D60-421C-44B2-9422-2610066CB82D} Exe Properties SandboxTarget SandboxTarget v4.5 512 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true AnyCPU true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset AnyCPU pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset False Microsoft .NET Framework 4.5 %28x86 and x64%29 true False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 false ================================================ FILE: Open Judge System/Tools/SandboxTarget/SandboxTargetProgram.cs ================================================ namespace SandboxTarget { using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Threading; using System.Windows.Forms; internal class SandboxTargetProgram { [STAThread] private static void Main() { // JustDoSomeCpuWork(); //// TODO: Console.OutputEncoding = Encoding.UTF8; WriteLine("Hi, I am an instance of SandboxTargetProgram!"); WriteLine(string.Format("Environment.UserName: {0}", Environment.UserName)); WriteLine(string.Format("Environment.CurrentDirectory: {0}", Environment.CurrentDirectory)); WriteLine(string.Format("Environment.OSVersion: {0}", Environment.OSVersion)); WriteLine(string.Format("Environment.Version: {0}", Environment.Version)); WriteLine(string.Format("Process.GetCurrentProcess().Id: {0}", Process.GetCurrentProcess().Id)); WriteLine(string.Format("Process.GetCurrentProcess().PriorityClass: {0}", Process.GetCurrentProcess().PriorityClass)); //// ThreadStart(); ReadWriteConsole(); var actions = new[] { new TryToExecuteParams(x => File.OpenWrite(x), "create file", "file.txt"), new TryToExecuteParams(x => File.OpenWrite(x), "create file", @"C:\file.txt"), new TryToExecuteParams(x => File.OpenWrite(x), "create file", @"C:\Windows\file.txt"), new TryToExecuteParams(x => File.OpenWrite(x), "create file", string.Format("C:\\Users\\{0}\\AppData\\LocalLow\\{1}", Environment.UserName, @"file.txt")), new TryToExecuteParams(x => File.OpenRead(x), "read file", @"C:\Windows\win.ini"), //// TODO: new TryToExecuteParams(x => Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"\Software\AppDataLow\").CreateSubKey("asd"), "create registry key", ""), new TryToExecuteParams(x => Process.Start(x), "start process", string.Format("{0}\\notepad.exe", Environment.SystemDirectory)), // Unit tested new TryToExecuteParams(x => Process.Start("shutdown", x), "run shutdown", "\\?"), new TryToExecuteParams(x => Console.Write(Process.GetProcesses().Count()), "count processes", "\\?"), new TryToExecuteParams(x => new TcpClient().Connect(x, 80), "open socket", "google.com"), new TryToExecuteParams(x => new WebClient().DownloadString(x), "access http resource", "http://google.com"), new TryToExecuteParams(Clipboard.SetText, "write to clipboard", "data"), // Unit tested new TryToExecuteParams( x => { if (string.IsNullOrEmpty(Clipboard.GetText())) { throw new Exception("Clipboard empty!"); } }, "read from clipboard", null), // Unit tested }; int tests = 0; int passed = 0; foreach (var action in actions) { tests++; var result = TryToExecute(action); if (!result) { passed++; } } Console.WriteLine("*** {0} tests run. {1} tests passed. {2} tests failed!!!", tests, passed, tests - passed); // ReadWrite10000LinesFromConsole(); // Write10000SymbolsOnSingleLine(); // for (int i = 0; i < 70; i++) // { // Sleep(1); // } // RecursivelyCheckFileSystemPermissions(@"C:\", 0); // CreateInfiniteAmountOfMemory(); // ThrowException(); // InfiniteLoop(); } private static void JustDoSomeCpuWork() { var data = new long[512]; for (int i = 0; i < data.Length; i++) { for (int j = 0; j < data.Length; j++) { for (int k = 0; k < data.Length; k++) { data[i] += j * k; } } } Console.WriteLine(data[data.Length - 1]); Environment.Exit(0); } private static void ThreadStart() { var threads = new List(); for (int i = 1; i < 100000; i++) { var thread = new Thread(() => Thread.Sleep(100000)); threads.Add(thread); thread.Start(); Console.WriteLine("Thread {0} started", i); } } private static void RecursivelyCheckFileSystemPermissions(string currentDirectory, int level) { Console.Write("{0}\\{1}\\ ", new string(' ', level * 4), new DirectoryInfo(currentDirectory).Name); try { Directory.GetFiles(currentDirectory); Console.Write("++FILES"); } catch { Console.Write("--FILES"); } try { var directories = Directory.GetDirectories(currentDirectory); Console.WriteLine("++DIRS"); foreach (var directory in directories) { RecursivelyCheckFileSystemPermissions(directory, level + 1); } } catch { Console.WriteLine("--DIRS"); } } private static void InfiniteLoop() { WriteLine("Going to infinite loop... bye..."); while (true) { } } private static bool TryToExecute(TryToExecuteParams tryToExecuteParams) { Write(string.Format("* {0} ({1}): ", tryToExecuteParams.Name, tryToExecuteParams.Parameter)); try { tryToExecuteParams.Action(tryToExecuteParams.Parameter); WriteLine(" !!!Success!!!", ConsoleColor.Yellow); return true; } catch (Exception ex) { WriteLine(string.Format(" Exception: {0}", ex.Message), ConsoleColor.Red); return false; } } private static void ReadWriteConsole() { var startTime = DateTime.Now; var line = Console.ReadLine(); var endTime = DateTime.Now; Console.WriteLine("ReadWriteConsole time: {0}", endTime - startTime); Console.WriteLine("Memory consumption: {0:0.000} MB", GC.GetTotalMemory(false) / 1024.0 / 1024.0); WriteLine(string.Format("Input size: {0}. First 5 chars: {1}", line.Length, line.Substring(0, 5)), ConsoleColor.White); } private static void ReadWrite10000LinesFromConsole() { var startTime = DateTime.Now; for (int i = 0; i < 10000; i++) { var line = Console.ReadLine(); Console.WriteLine(line); } var endTime = DateTime.Now; Console.WriteLine("Read10000LinesFromConsole time: {0}", endTime - startTime); Console.WriteLine("Memory consumption: {0:0.000} MB", GC.GetTotalMemory(false) / 1024.0 / 1024.0); } private static void Write10000SymbolsOnSingleLine() { Console.Write(new string('Я', 10 * 1024 * 1024)); } private static void Sleep(double seconds) { Write(string.Format("Going to sleep for {0} seconds... ", seconds)); Thread.Sleep((int)(1000.0 * seconds)); WriteLine(string.Format("Slept {0} seconds!", seconds), ConsoleColor.Yellow); } private static void CreateInfiniteAmountOfMemory() { Console.WriteLine("Start to infinite memory allocation..."); var references = new List(); while (true) { Console.WriteLine("Using: {0:0.000} MB.", GC.GetTotalMemory(false) / 1024M / 1024M); references.Add(new int[250000]); } } private static void ThrowException() { Write("Throwing exception...", ConsoleColor.DarkGray); throw new Win32Exception("This text should be hidden for the user."); } private static void Write(string text = "", ConsoleColor foregroundColor = ConsoleColor.Gray, ConsoleColor backgroundColor = ConsoleColor.Black) { Console.ForegroundColor = foregroundColor; Console.BackgroundColor = backgroundColor; Console.Write(text); } private static void WriteLine(string text = "", ConsoleColor foregroundColor = ConsoleColor.Gray, ConsoleColor backgroundColor = ConsoleColor.Black) { Console.ForegroundColor = foregroundColor; Console.BackgroundColor = backgroundColor; Console.WriteLine(text); } } } ================================================ FILE: Open Judge System/Tools/SandboxTarget/TryToExecuteParams.cs ================================================ namespace SandboxTarget { using System; internal class TryToExecuteParams { public TryToExecuteParams(Action action, string name, string parameter) { this.Action = action; this.Name = name; this.Parameter = parameter; } public Action Action { get; } public string Name { get; } public string Parameter { get; } } } ================================================ FILE: Open Judge System/Tools/SandboxTarget/packages.config ================================================  ================================================ FILE: Open Judge System/Tools/SqlTestingPoC/App.config ================================================ 
================================================ FILE: Open Judge System/Tools/SqlTestingPoC/Program.cs ================================================ namespace SqlTestingPoC { using System; using System.Collections.Generic; using System.Data.SqlServerCe; using System.IO; using MissingFeatures; public static class Program { public static void Main() { var databaseFileName = $"{Guid.NewGuid()}.sdf"; var connectionString = $"DataSource=\"{databaseFileName}\"; Password=\"{Guid.NewGuid()}\";"; using (var en = new SqlCeEngine(connectionString)) { en.CreateDatabase(); } using (var connection = new SqlCeConnection(connectionString)) { connection.Open(); var command = connection.CreateCommand().MultiQuery(); command.CommandText = @" CREATE TABLE [Cities]([Id] [int] NOT NULL, [Name] [ntext] NULL); INSERT [Cities] ([Id], [Name]) VALUES (1, N'Sofia'); INSERT [Cities] ([Id], [Name]) VALUES (2, N'SofiaS'); INSERT [Cities] ([Id], [Name]) VALUES (3, N'NSo;fia'); INSERT [Cities] ([Id], [Name]) VALUES (4, N'NSofiaS'); INSERT [Cities] ([Id], [Name]) VALUES (5, N'Kyustendil'); INSERT [Cities] ([Id], [Name]) VALUES (6, N'S');"; command.ExecuteNonQuery(); var userCommand = connection.CreateCommand().MultiQuery(); userCommand.CommandText = @"SELECT * FROM [Cities] CROSS JOIN [Cities] c1 CROSS JOIN [Cities] c2 CROSS JOIN [Cities] c3 CROSS JOIN [Cities] c4 CROSS JOIN [Cities] c5 CROSS JOIN [Cities] c6 CROSS JOIN [Cities] c7 CROSS JOIN [Cities] c8 CROSS JOIN [Cities] c9 CROSS JOIN [Cities] c10 CROSS JOIN [Cities] c11"; var userResult = new List(); // TODO: Abort on timeout var completed = Code.ExecuteWithTimeLimit( TimeSpan.FromMilliseconds(1000), () => { var reader = userCommand.ExecuteReader(); using (reader) { while (reader.Read()) { for (var i = 0; i < reader.FieldCount; i++) { // TODO: doubles? comma or dot? userResult.Add(reader.GetValue(i).ToString()); } } } }); if (completed) { foreach (var userItem in userResult) { Console.WriteLine(userItem); } } else { Console.WriteLine("Timeout!"); } } File.Delete(databaseFileName); } } } ================================================ FILE: Open Judge System/Tools/SqlTestingPoC/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("SqlTestingPoC")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("SqlTestingPoC")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("2ae356da-fcd4-4601-a533-85042648d7f8")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Tools/SqlTestingPoC/SqlPrepareDatabaseAndRunUserQueryExecutionStrategy.cs ================================================ namespace SqlTestingPoC { using System; using OJS.Workers.ExecutionStrategies; public class SqlPrepareDatabaseAndRunUserQueryExecutionStrategy : IExecutionStrategy { public ExecutionResult Execute(ExecutionContext executionContext) { // Test input = prepare database (first queries) // User code = query to execute // Test output = expected result from user query throw new NotImplementedException(); } } } ================================================ FILE: Open Judge System/Tools/SqlTestingPoC/SqlRunUserQueryAndCheckDatabaseExecutionStrategy.cs ================================================ namespace SqlTestingPoC { using System; using OJS.Workers.ExecutionStrategies; public class SqlRunUserQueryAndCheckDatabaseExecutionStrategy : IExecutionStrategy { public ExecutionResult Execute(ExecutionContext executionContext) { // User code = user queries - prepare database // Test input = query to execute // Test output = expected result from the query throw new NotImplementedException(); } } } ================================================ FILE: Open Judge System/Tools/SqlTestingPoC/SqlTestingPoC.csproj ================================================  Debug AnyCPU {2AE356DA-FCD4-4601-A533-85042648D7F8} Exe Properties SqlTestingPoC SqlTestingPoC v4.5.2 512 true AnyCPU true full false bin\Debug\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset AnyCPU pdbonly true bin\Release\ TRACE prompt 4 ..\..\Rules.ruleset ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll True ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll True ..\..\packages\EntityFramework.SqlServerCompact.6.1.3\lib\net45\EntityFramework.SqlServerCompact.dll True ..\..\packages\Lyare.SqlServerCe.MultiQuery.1.0.0\lib\net40\Lyare.SqlServerCe.MultiQuery.dll True ..\..\packages\MissingFeatures.NET.1.1\lib\MissingFeatures.dll True ..\..\packages\Microsoft.SqlServer.Compact.4.0.8876.1\lib\net40\System.Data.SqlServerCe.dll True {7f714d0b-ce81-4dd7-b6b2-62080fe22cd8} OJS.Workers.Common {69966098-E5B2-46CD-88E9-1F79B245ADE0} OJS.Workers.ExecutionStrategies if not exist "$(TargetDir)x86" md "$(TargetDir)x86" xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\x86\*.*" "$(TargetDir)x86" if not exist "$(TargetDir)amd64" md "$(TargetDir)amd64" xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\amd64\*.*" "$(TargetDir)amd64" ================================================ FILE: Open Judge System/Tools/SqlTestingPoC/packages.config ================================================  ================================================ FILE: Open Judge System/Web/OJS.Web/App_Code/ContestsHelper.cshtml ================================================ @using OJS.Common.Extensions; @helper GetUrl(int contestId, string contestName) { /Contests/@contestId/@contestName.ToUrl() } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/AccountEmails.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class AccountEmails { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal AccountEmails() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.AccountEmails", typeof(AccountEmails).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Hi <strong>{0}</strong>, <br/>To reset your password please click <a href="{1}">{1}</a> or copy and paste the url in your browser.. /// public static string Forgotten_password_body { get { return ResourceManager.GetString("Forgotten_password_body", resourceCulture); } } /// /// Looks up a localized string similar to Forgotten password for {0}. /// public static string Forgotten_password_title { get { return ResourceManager.GetString("Forgotten_password_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/AccountEmails.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/AccountEmails.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Здравей <strong>{0}</strong>, <br/>За да промените паролата си, моля посетете <a href="{1}">{1}</a> или копирайте адреса и го отворете в нов прозорец. Забравена парола за {0} ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/AccountEmails.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Hi <strong>{0}</strong>, <br/>To reset your password please click <a href="{1}">{1}</a> or copy and paste the url in your browser. Forgotten password for {0} ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/ViewModels/AccountViewModels.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class AccountViewModels { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal AccountViewModels() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.ViewModels.AccountViewModels", typeof(AccountViewModels).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Current password. /// public static string Current_password { get { return ResourceManager.GetString("Current_password", resourceCulture); } } /// /// Looks up a localized string similar to Email address. /// public static string Email { get { return ResourceManager.GetString("Email", resourceCulture); } } /// /// Looks up a localized string similar to This email has already been registered. /// public static string Email_already_registered { get { return ResourceManager.GetString("Email_already_registered", resourceCulture); } } /// /// Looks up a localized string similar to Confirm your email. /// public static string Email_confirm { get { return ResourceManager.GetString("Email_confirm", resourceCulture); } } /// /// Looks up a localized string similar to Please double check the email address that you entered. /// public static string Email_confirmation_invalid { get { return ResourceManager.GetString("Email_confirmation_invalid", resourceCulture); } } /// /// Looks up a localized string similar to Please confirm your email. /// public static string Email_confirmation_required { get { return ResourceManager.GetString("Email_confirmation_required", resourceCulture); } } /// /// Looks up a localized string similar to Invalid email address. /// public static string Email_invalid { get { return ResourceManager.GetString("Email_invalid", resourceCulture); } } /// /// Looks up a localized string similar to Please enter your email address. /// public static string Email_required { get { return ResourceManager.GetString("Email_required", resourceCulture); } } /// /// Looks up a localized string similar to Please confirm your new password. /// public static string Enter_new_password_confirmation { get { return ResourceManager.GetString("Enter_new_password_confirmation", resourceCulture); } } /// /// Looks up a localized string similar to Please enter your new password. /// public static string Enter_new_password_validation { get { return ResourceManager.GetString("Enter_new_password_validation", resourceCulture); } } /// /// Looks up a localized string similar to Please enter your password. /// public static string Enter_password { get { return ResourceManager.GetString("Enter_password", resourceCulture); } } /// /// Looks up a localized string similar to Please enter your current password. /// public static string Enter_password_validation { get { return ResourceManager.GetString("Enter_password_validation", resourceCulture); } } /// /// Looks up a localized string similar to Incorrect password. /// public static string Incorrect_password { get { return ResourceManager.GetString("Incorrect_password", resourceCulture); } } /// /// Looks up a localized string similar to Invalid username or password. /// public static string Invalid_username_or_password { get { return ResourceManager.GetString("Invalid_username_or_password", resourceCulture); } } /// /// Looks up a localized string similar to New password. /// public static string New_password { get { return ResourceManager.GetString("New_password", resourceCulture); } } /// /// Looks up a localized string similar to The new password and confirmation password do not match. /// public static string New_password_confirm_password_not_matching_validation { get { return ResourceManager.GetString("New_password_confirm_password_not_matching_validation", resourceCulture); } } /// /// Looks up a localized string similar to Confirm new password. /// public static string New_password_confirmation { get { return ResourceManager.GetString("New_password_confirmation", resourceCulture); } } /// /// Looks up a localized string similar to Password. /// public static string Password { get { return ResourceManager.GetString("Password", resourceCulture); } } /// /// Looks up a localized string similar to Confirm your password. /// public static string Password_confirm { get { return ResourceManager.GetString("Password_confirm", resourceCulture); } } /// /// Looks up a localized string similar to Incorrect password. /// public static string Password_incorrect { get { return ResourceManager.GetString("Password_incorrect", resourceCulture); } } /// /// Looks up a localized string similar to The password must be at least {2} characters long.. /// public static string Password_length_validation_message { get { return ResourceManager.GetString("Password_length_validation_message", resourceCulture); } } /// /// Looks up a localized string similar to Please enter your password. /// public static string Password_required { get { return ResourceManager.GetString("Password_required", resourceCulture); } } /// /// Looks up a localized string similar to The passwords don't match. /// public static string Passwords_dont_match { get { return ResourceManager.GetString("Passwords_dont_match", resourceCulture); } } /// /// Looks up a localized string similar to Remember me?. /// public static string Remember_me { get { return ResourceManager.GetString("Remember_me", resourceCulture); } } /// /// Looks up a localized string similar to This username is not available. /// public static string User_already_registered { get { return ResourceManager.GetString("User_already_registered", resourceCulture); } } /// /// Looks up a localized string similar to Username. /// public static string Username { get { return ResourceManager.GetString("Username", resourceCulture); } } /// /// Looks up a localized string similar to Confirm the new username. /// public static string Username_confirmation { get { return ResourceManager.GetString("Username_confirmation", resourceCulture); } } /// /// Looks up a localized string similar to The usernames do not match. /// public static string Username_confirmation_incorrect { get { return ResourceManager.GetString("Username_confirmation_incorrect", resourceCulture); } } /// /// Looks up a localized string similar to The username can contain only latin characters, numbers and the symbols '.' or '_'. The username must start with a letter and end with a letter or number.. /// public static string Username_regex_validation { get { return ResourceManager.GetString("Username_regex_validation", resourceCulture); } } /// /// Looks up a localized string similar to Username is required. /// public static string Username_required { get { return ResourceManager.GetString("Username_required", resourceCulture); } } /// /// Looks up a localized string similar to The username must be between {2} and {1} characters long. /// public static string Username_validation { get { return ResourceManager.GetString("Username_validation", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/ViewModels/AccountViewModels.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/ViewModels/AccountViewModels.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Парола Имейл адрес Невалиден имейл адрес Моля въвете имейл адрес Моля потвърдете новата си парола Моля въведете новата си парола Моля въведете парола Моля въведете текущата си парола Невалидно име или парола Нова парола Потвърдете новата парола Новата парола не съвпада с потвърдената нова парола Парола Паролите не съвпадат Потвърдете паролата Паролата трябва да бъде поне {2} символа Запомни ме Потребителско име Потребителското име е задължително Потребителското име трябва да бъде между {2} и {1} символа Този имейл е вече регистриран Това потребителско име е заето Грешна парола Потвърди имейла Моля проверете дали сте въвели правилно имейла си и в двете полета Моля потвърдете имейла си Моля въвете паролата си Грешна парола Потребителското име може да съдържа само латински букви, цифри и знаците точка и долна черта. Потребителското име трябва да започва с буква и да завършва с буква или цифра. Потвърдете новото си потребителско име Потребителските имена не съвпадат ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/ViewModels/AccountViewModels.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Current password Email address Invalid email address Please enter your email address Please confirm your new password Please enter your new password Please enter your password Please enter your current password Invalid username or password New password Confirm new password The new password and confirmation password do not match Password The passwords don't match Confirm your password The password must be at least {2} characters long. Remember me? Username Username is required The username must be between {2} and {1} characters long This email has already been registered This username is not available Incorrect password Confirm your email Please double check the email address that you entered Please confirm your email Please enter your password Incorrect password The username can contain only latin characters, numbers and the symbols '.' or '_'. The username must start with a letter and end with a letter or number. Confirm the new username The usernames do not match ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangeEmailView.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ChangeEmailView { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ChangeEmailView() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.ChangeEmailView", typeof(ChangeEmailView).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Cancel. /// public static string Cancel { get { return ResourceManager.GetString("Cancel", resourceCulture); } } /// /// Looks up a localized string similar to Save. /// public static string Save { get { return ResourceManager.GetString("Save", resourceCulture); } } /// /// Looks up a localized string similar to Change your email address. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangeEmailView.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangeEmailView.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Отказ Запази Промяна на имейл адрес ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangeEmailView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Cancel Save Change your email address ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangePasswordView.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ChangePasswordView { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ChangePasswordView() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.ChangePasswordView", typeof(ChangePasswordView).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Password updated successfully.. /// public static string Password_updated { get { return ResourceManager.GetString("Password_updated", resourceCulture); } } /// /// Looks up a localized string similar to Save. /// public static string Submit { get { return ResourceManager.GetString("Submit", resourceCulture); } } /// /// Looks up a localized string similar to Update your password. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangePasswordView.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangePasswordView.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Паролата беше успешно обновена. Запази Промяна на паролата ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangePasswordView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Password updated successfully. Save Update your password ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangeUsernameView.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangeUsernameView.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Промени потребителско име Потребителското име беше променено. Моля, влезте с новото потребителско име. Това потребителско име е заето ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangeUsernameView.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ChangeUsernameView { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ChangeUsernameView() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.ChangeUsernameView", typeof(ChangeUsernameView).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Update username. /// public static string Update { get { return ResourceManager.GetString("Update", resourceCulture); } } /// /// Looks up a localized string similar to Username was successfully changed. Please log in using your new username.. /// public static string Username_changed { get { return ResourceManager.GetString("Username_changed", resourceCulture); } } /// /// Looks up a localized string similar to This username is not available. /// public static string Username_not_available { get { return ResourceManager.GetString("Username_not_available", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ChangeUsernameView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Update username Username was successfully changed. Please log in using your new username. This username is not available ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Disassociate.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Disassociate { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Disassociate() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.Disassociate", typeof(Disassociate).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to An error occured. /// public static string Error { get { return ResourceManager.GetString("Error", resourceCulture); } } /// /// Looks up a localized string similar to The external login was removed. /// public static string External_login_removed { get { return ResourceManager.GetString("External_login_removed", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Disassociate.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Disassociate.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Възникна грешка Външния логин беше премахнат ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Disassociate.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 An error occured The external login was removed ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginCallback.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginCallback.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Този имейл адрес е вече регистриран. Моля използвайте <a href="/Account/ForgottenPassword">"Забравена парола"</a> за да получите детайлите за своя акаунт. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginCallback.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ExternalLoginCallback { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ExternalLoginCallback() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.ExternalLoginCallback", typeof(ExternalLoginCallback).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to You have already registered with this email address. Please log in or use the <a href="/Account/ForgottenPassword">forgotten password</a> feature.. /// public static string Email_already_registered { get { return ResourceManager.GetString("Email_already_registered", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginCallback.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 You have already registered with this email address. Please log in or use the <a href="/Account/ForgottenPassword">forgotten password</a> feature. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginConfirmation.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ExternalLoginConfirmation { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ExternalLoginConfirmation() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.ExternalLoginConfirmation", typeof(ExternalLoginConfirmation).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Your email has already been registered. Please use the forgot your details feature to obtain your login details.. /// public static string Email_already_registered { get { return ResourceManager.GetString("Email_already_registered", resourceCulture); } } /// /// Looks up a localized string similar to Please enter a username and click on Register to log into the system. /// public static string Enter_username_and_register { get { return ResourceManager.GetString("Enter_username_and_register", resourceCulture); } } /// /// Looks up a localized string similar to An error occured. /// public static string Error { get { return ResourceManager.GetString("Error", resourceCulture); } } /// /// Looks up a localized string similar to Link you account with your {0} account.. /// public static string Link_account { get { return ResourceManager.GetString("Link_account", resourceCulture); } } /// /// Looks up a localized string similar to Register. /// public static string Register { get { return ResourceManager.GetString("Register", resourceCulture); } } /// /// Looks up a localized string similar to You will log in using. /// public static string Successfully_logged_in { get { return ResourceManager.GetString("Successfully_logged_in", resourceCulture); } } /// /// Looks up a localized string similar to This username is not available. /// public static string User_already_registered { get { return ResourceManager.GetString("User_already_registered", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginConfirmation.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginConfirmation.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Вашият имейл е вече регистриран. Моля използвайте услугата "Забравена парола" Моля въведете потребителско име за сайта и натиснете бутона "Регистрация" за да влезнете в системата. Възникна грешка Свържете акаунта си, използвайки своя {0} акаунт. Регистрация Ще влезете чрез Това потребителско име е заето ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginConfirmation.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Your email has already been registered. Please use the forgot your details feature to obtain your login details. Please enter a username and click on Register to log into the system An error occured Link you account with your {0} account. Register You will log in using This username is not available ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginFailure.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ExternalLoginFailure { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ExternalLoginFailure() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.ExternalLoginFailure", typeof(ExternalLoginFailure).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Error. /// public static string Error { get { return ResourceManager.GetString("Error", resourceCulture); } } /// /// Looks up a localized string similar to Login was unsuccessful.. /// public static string Unsuccessful_login { get { return ResourceManager.GetString("Unsuccessful_login", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginFailure.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginFailure.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Грешка Неуспешен логин. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ExternalLoginFailure.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Error Login was unsuccessful. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ForgottenPassword.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ForgottenPassword { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ForgottenPassword() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.ForgottenPassword", typeof(ForgottenPassword).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to This email or username is not registered. /// public static string Email_or_username_not_registered { get { return ResourceManager.GetString("Email_or_username_not_registered", resourceCulture); } } /// /// Looks up a localized string similar to Please enter your email or username. /// public static string Email_or_username_required { get { return ResourceManager.GetString("Email_or_username_required", resourceCulture); } } /// /// Looks up a localized string similar to This email is registered more than once. /// public static string Email_registered_more_than_once { get { return ResourceManager.GetString("Email_registered_more_than_once", resourceCulture); } } /// /// Looks up a localized string similar to Instructions on how to obtain your password were sent to your email address.. /// public static string Email_sent { get { return ResourceManager.GetString("Email_sent", resourceCulture); } } /// /// Looks up a localized string similar to Please enter your email to reset your password.. /// public static string EnterYourEmail { get { return ResourceManager.GetString("EnterYourEmail", resourceCulture); } } /// /// Looks up a localized string similar to Username or email. /// public static string Label { get { return ResourceManager.GetString("Label", resourceCulture); } } /// /// Looks up a localized string similar to Submit. /// public static string Submit { get { return ResourceManager.GetString("Submit", resourceCulture); } } /// /// Looks up a localized string similar to Forgotten password. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ForgottenPassword.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ForgottenPassword.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Въведеното потребителско име или имейл не е регистрирано Моля въведете имейл или потребителско име Този имейл е регистриран повече от веднъж Изпратихме инструкции как да си промените паролата на имейла, който сте регистрирали. Въведете имейл адреса си. Потребителско име или имейл Изпрати Забравена парола ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/ForgottenPassword.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 This email or username is not registered Please enter your email or username This email is registered more than once Instructions on how to obtain your password were sent to your email address. Please enter your email to reset your password. Username or email Submit Forgotten password ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/General.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class General { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal General() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.General", typeof(General).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to The captcha is invalid. /// public static string Captcha_invalid { get { return ResourceManager.GetString("Captcha_invalid", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/General.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/General.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Невалиден код за валидация ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/General.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 The captcha is invalid ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Login.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Login { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Login() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.Login", typeof(Login).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Forgot your password?. /// public static string Forgotten_password { get { return ResourceManager.GetString("Forgotten_password", resourceCulture); } } /// /// Looks up a localized string similar to if you are not already registered.. /// public static string If_not_already_registered { get { return ResourceManager.GetString("If_not_already_registered", resourceCulture); } } /// /// Looks up a localized string similar to Log in. /// public static string Log_in { get { return ResourceManager.GetString("Log_in", resourceCulture); } } /// /// Looks up a localized string similar to Log in using your username and password.. /// public static string Login_using_username_and_password { get { return ResourceManager.GetString("Login_using_username_and_password", resourceCulture); } } /// /// Looks up a localized string similar to Register. /// public static string Register { get { return ResourceManager.GetString("Register", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Login.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Login.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ако още не си се регистрирал. Влезте с потребителско име и парола Вход Регистрирай се Забравена парола ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Login.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 if you are not already registered. Log in using your username and password. Log in Register Forgot your password? ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Manage.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Manage { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Manage() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.Manage", typeof(Manage).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Change your password. /// public static string Change_password { get { return ResourceManager.GetString("Change_password", resourceCulture); } } /// /// Looks up a localized string similar to The password was updated. /// public static string Password_updated { get { return ResourceManager.GetString("Password_updated", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Manage.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Manage.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Промени паролата Паролата беше обновена ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Manage.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Change your password The password was updated ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/ChangePassword.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views.Partial { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ChangePassword { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ChangePassword() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.Partial.ChangePassword", typeof(ChangePassword).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Change password. /// public static string Change_password { get { return ResourceManager.GetString("Change_password", resourceCulture); } } /// /// Looks up a localized string similar to You are currently logged in as. /// public static string Currently_logged_in_as { get { return ResourceManager.GetString("Currently_logged_in_as", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/ChangePassword.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/ChangePassword.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Промяна на парола В момента сте логнати като ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/ChangePassword.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Change password You are currently logged in as ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/ExternalLoginsList.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views.Partial { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ExternalLoginsList { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ExternalLoginsList() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.Partial.ExternalLoginsList", typeof(ExternalLoginsList).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Use another method to log in. /// public static string Alternate_login_method { get { return ResourceManager.GetString("Alternate_login_method", resourceCulture); } } /// /// Looks up a localized string similar to Log in with your {0} account. /// public static string External_login_message { get { return ResourceManager.GetString("External_login_message", resourceCulture); } } /// /// Looks up a localized string similar to External login services are currently unavailable. /// public static string External_login_unavailable { get { return ResourceManager.GetString("External_login_unavailable", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/ExternalLoginsList.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/ExternalLoginsList.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Използвай друг начин за вход Вход с вашия {0} акаунт В момента не може да се влезне с външни услуги ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/ExternalLoginsList.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Use another method to log in Log in with your {0} account External login services are currently unavailable ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/RemoveAccount.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views.Partial { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class RemoveAccount { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal RemoveAccount() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.Partial.RemoveAccount", typeof(RemoveAccount).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Registered login methods. /// public static string Registered_login_methods { get { return ResourceManager.GetString("Registered_login_methods", resourceCulture); } } /// /// Looks up a localized string similar to Remove. /// public static string Remove_login_button { get { return ResourceManager.GetString("Remove_login_button", resourceCulture); } } /// /// Looks up a localized string similar to Remove logging in with {0} from your account. /// public static string Remove_login_title { get { return ResourceManager.GetString("Remove_login_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/RemoveAccount.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/RemoveAccount.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Регистрирани методи за вход Премахни Премахни влизането с {0} акаунт ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/RemoveAccount.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Registered login methods Remove Remove logging in with {0} from your account ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/SetPassword.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views.Partial { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SetPassword { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SetPassword() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.Partial.SetPassword", typeof(SetPassword).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Create an account. /// public static string Create_account { get { return ResourceManager.GetString("Create_account", resourceCulture); } } /// /// Looks up a localized string similar to You do not have a password for the website. Please add a password for added security.. /// public static string No_username_or_password { get { return ResourceManager.GetString("No_username_or_password", resourceCulture); } } /// /// Looks up a localized string similar to Save password. /// public static string Save_password { get { return ResourceManager.GetString("Save_password", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/SetPassword.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/SetPassword.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Създай парола Нямате парола за вход в уебсайта. Моля добавете парола за да по-голяма сигурност. Запази паролата ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Partial/SetPassword.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Create an account You do not have a password for the website. Please add a password for added security. Save password ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Register.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Account.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Register { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Register() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Account.Views.Register", typeof(Register).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Register. /// public static string Register_button { get { return ResourceManager.GetString("Register_button", resourceCulture); } } /// /// Looks up a localized string similar to Register. /// public static string Register_title { get { return ResourceManager.GetString("Register_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Register.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Register.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Регистрация Регистрация ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Account/Views/Register.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Register Register ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AccessLogs/ViewModels/AccessLogGridViewModel.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.AccessLogs.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class AccessLogGridViewModel { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal AccessLogGridViewModel() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.AccessLogs.ViewModels.AccessLogG" + "ridViewModel", typeof(AccessLogGridViewModel).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to IP. /// public static string Ip { get { return ResourceManager.GetString("Ip", resourceCulture); } } /// /// Looks up a localized string similar to POST params. /// public static string Post_params { get { return ResourceManager.GetString("Post_params", resourceCulture); } } /// /// Looks up a localized string similar to Request. /// public static string Request_type { get { return ResourceManager.GetString("Request_type", resourceCulture); } } /// /// Looks up a localized string similar to URL. /// public static string Url { get { return ResourceManager.GetString("Url", resourceCulture); } } /// /// Looks up a localized string similar to UserName. /// public static string UserName { get { return ResourceManager.GetString("UserName", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AccessLogs/ViewModels/AccessLogGridViewModel.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AccessLogs/ViewModels/AccessLogGridViewModel.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 IP POST параметри Заявка URL Име ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AccessLogs/ViewModels/AccessLogGridViewModel.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 IP POST params Request URL UserName ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AccessLogs/Views/AccessLogsIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.AccessLogs.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class AccessLogsIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal AccessLogsIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.AccessLogs.Views.AccessLogsIndex" + "", typeof(AccessLogsIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Access logs. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AccessLogs/Views/AccessLogsIndex.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AccessLogs/Views/AccessLogsIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Логове за достъп ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AccessLogs/Views/AccessLogsIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Access logs ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AdministrationGeneral.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class AdministrationGeneral { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal AdministrationGeneral() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.AdministrationGeneral", typeof(AdministrationGeneral).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back to navigation. /// public static string Back_to_navigation { get { return ResourceManager.GetString("Back_to_navigation", resourceCulture); } } /// /// Looks up a localized string similar to Cancel. /// public static string Cancel { get { return ResourceManager.GetString("Cancel", resourceCulture); } } /// /// Looks up a localized string similar to Change. /// public static string Change { get { return ResourceManager.GetString("Change", resourceCulture); } } /// /// Looks up a localized string similar to Create. /// public static string Create { get { return ResourceManager.GetString("Create", resourceCulture); } } /// /// Looks up a localized string similar to Created on. /// public static string Created_on { get { return ResourceManager.GetString("Created_on", resourceCulture); } } /// /// Looks up a localized string similar to Delete. /// public static string Delete { get { return ResourceManager.GetString("Delete", resourceCulture); } } /// /// Looks up a localized string similar to Do you want to delete this item?. /// public static string Delete_prompt { get { return ResourceManager.GetString("Delete_prompt", resourceCulture); } } /// /// Looks up a localized string similar to Export To Excel. /// public static string Export_to_excel { get { return ResourceManager.GetString("Export_to_excel", resourceCulture); } } /// /// Looks up a localized string similar to Drag and drop here the title of the column you wish to group by. /// public static string Group_by_message { get { return ResourceManager.GetString("Group_by_message", resourceCulture); } } /// /// Looks up a localized string similar to Modified on. /// public static string Modified_on { get { return ResourceManager.GetString("Modified_on", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AdministrationGeneral.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AdministrationGeneral.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Обратно към навигацията Отказ Промяна Създай Дата на създаване Изтриване Наистина ли искате да изтриете елемента? Експортиране в Ексел Хванете заглавието на колона и го преместете тук, за да групирате по тази колона. Дата на промяна ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AdministrationGeneral.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back to navigation Cancel Change Create Created on Delete Do you want to delete this item? Export To Excel Drag and drop here the title of the column you wish to group by Modified on ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AntiCheat/Views/AntiCheatViews.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.AntiCheat.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class AntiCheatViews { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal AntiCheatViews() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.AntiCheat.Views.AntiCheatViews", typeof(AntiCheatViews).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to By IP. /// public static string By_ip_page_title { get { return ResourceManager.GetString("By_ip_page_title", resourceCulture); } } /// /// Looks up a localized string similar to By submission similarity. /// public static string By_submission_page_title { get { return ResourceManager.GetString("By_submission_page_title", resourceCulture); } } /// /// Looks up a localized string similar to Choose or enter contest.... /// public static string Choose_or_enter_contest { get { return ResourceManager.GetString("Choose_or_enter_contest", resourceCulture); } } /// /// Looks up a localized string similar to Differences. /// public static string Differences { get { return ResourceManager.GetString("Differences", resourceCulture); } } /// /// Looks up a localized string similar to First Participant. /// public static string First_participant { get { return ResourceManager.GetString("First_participant", resourceCulture); } } /// /// Looks up a localized string similar to IP Addresses. /// public static string Ip_addresses { get { return ResourceManager.GetString("Ip_addresses", resourceCulture); } } /// /// Looks up a localized string similar to No similarities. /// public static string No_similarities { get { return ResourceManager.GetString("No_similarities", resourceCulture); } } /// /// Looks up a localized string similar to Participant Id. /// public static string Participant_id { get { return ResourceManager.GetString("Participant_id", resourceCulture); } } /// /// Looks up a localized string similar to Percentage. /// public static string Percentage { get { return ResourceManager.GetString("Percentage", resourceCulture); } } /// /// Looks up a localized string similar to Points. /// public static string Points { get { return ResourceManager.GetString("Points", resourceCulture); } } /// /// Looks up a localized string similar to Second Participant. /// public static string Second_participant { get { return ResourceManager.GetString("Second_participant", resourceCulture); } } /// /// Looks up a localized string similar to Username. /// public static string Username { get { return ResourceManager.GetString("Username", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AntiCheat/Views/AntiCheatViews.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AntiCheat/Views/AntiCheatViews.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 По IP По прилика на решенията Изберете или въведете състезание... Разлики Първи участник IP Адрес Няма прилики Участник Id Процент Точки Втори участник Потребителско име ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/AntiCheat/Views/AntiCheatViews.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 By IP By submission similarity Choose or enter contest... Differences First Participant IP Addresses No similarities Participant Id Percentage Points Second Participant Username ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Checkers/ViewModels/CheckerAdministrationViewModel.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Checkers.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class CheckerAdministrationViewModel { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal CheckerAdministrationViewModel() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Checkers.ViewModels.CheckerAdmin" + "istrationViewModel", typeof(CheckerAdministrationViewModel).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Class name. /// public static string Class_name { get { return ResourceManager.GetString("Class_name", resourceCulture); } } /// /// Looks up a localized string similar to The class name is required!. /// public static string Class_name_required { get { return ResourceManager.GetString("Class_name_required", resourceCulture); } } /// /// Looks up a localized string similar to Description. /// public static string Description { get { return ResourceManager.GetString("Description", resourceCulture); } } /// /// Looks up a localized string similar to DLL file. /// public static string Dll_file { get { return ResourceManager.GetString("Dll_file", resourceCulture); } } /// /// Looks up a localized string similar to The DLL file is required!. /// public static string Dll_file_required { get { return ResourceManager.GetString("Dll_file_required", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to Name must be between {2} and {1} symbols. /// public static string Name_length { get { return ResourceManager.GetString("Name_length", resourceCulture); } } /// /// Looks up a localized string similar to The name is required!. /// public static string Name_required { get { return ResourceManager.GetString("Name_required", resourceCulture); } } /// /// Looks up a localized string similar to Param. /// public static string Param { get { return ResourceManager.GetString("Param", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Checkers/ViewModels/CheckerAdministrationViewModel.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Checkers/ViewModels/CheckerAdministrationViewModel.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Име на клас Името на класа е задължително! Описание DLL файл DLL файла е задължителен! Име Името трябва да е между {2} и {1} символа Името е задължително! Параметър ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Checkers/ViewModels/CheckerAdministrationViewModel.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Class name The class name is required! Description DLL file The DLL file is required! Name Name must be between {2} and {1} symbols The name is required! Param ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Checkers/Views/CheckersIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Checkers.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class CheckersIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal CheckersIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Checkers.Views.CheckersIndex", typeof(CheckersIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Checkers. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Checkers/Views/CheckersIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Checkers/Views/CheckersIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Чекери ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Checkers/Views/CheckersIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Checkers ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/ContestCategories/ViewModels/ContestCategoryAdministrationViewModel.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.ContestCategories.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestCategoryAdministrationViewModel { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestCategoryAdministrationViewModel() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.ContestCategories.ViewModels.Con" + "testCategoryAdministrationViewModel", typeof(ContestCategoryAdministrationViewModel).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to Accepted length is betweeb {2} and {1} symbols. /// public static string Name_length { get { return ResourceManager.GetString("Name_length", resourceCulture); } } /// /// Looks up a localized string similar to Name is required!. /// public static string Name_required { get { return ResourceManager.GetString("Name_required", resourceCulture); } } /// /// Looks up a localized string similar to Order. /// public static string Order_by { get { return ResourceManager.GetString("Order_by", resourceCulture); } } /// /// Looks up a localized string similar to Order is required!. /// public static string Order_by_required { get { return ResourceManager.GetString("Order_by_required", resourceCulture); } } /// /// Looks up a localized string similar to Visibility. /// public static string Visibility { get { return ResourceManager.GetString("Visibility", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/ContestCategories/ViewModels/ContestCategoryAdministrationViewModel.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/ContestCategories/ViewModels/ContestCategoryAdministrationViewModel.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Име Позволената дължина е между {2} и {1} символа Името е задължително! Подредба Подредбата е задължителна! Видимост ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/ContestCategories/ViewModels/ContestCategoryAdministrationViewModel.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Name Accepted length is betweeb {2} and {1} symbols Name is required! Order Order is required! Visibility ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/ContestCategories/Views/ContestCategoriesViews.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.ContestCategories.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestCategoriesViews { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestCategoriesViews() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.ContestCategories.Views.ContestC" + "ategoriesViews", typeof(ContestCategoriesViews).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Do you want to delete this category? All subcategories will be deleted!. /// public static string Delete_prompt { get { return ResourceManager.GetString("Delete_prompt", resourceCulture); } } /// /// Looks up a localized string similar to Contest categories heirarchy. /// public static string Heirarchy_page_title { get { return ResourceManager.GetString("Heirarchy_page_title", resourceCulture); } } /// /// Looks up a localized string similar to Contest categories. /// public static string Index_page_title { get { return ResourceManager.GetString("Index_page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/ContestCategories/Views/ContestCategoriesViews.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/ContestCategories/Views/ContestCategoriesViews.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Наистина ли искате да изтриете категорията? Всичките подкатегории също ще бъдат изтрити! Йерархия на категориите състезания Категории състезания ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/ContestCategories/Views/ContestCategoriesViews.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Do you want to delete this category? All subcategories will be deleted! Contest categories heirarchy Contest categories ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ContestsControllers.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestsControllers { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestsControllers() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.ContestsControllers", typeof(ContestsControllers).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to contest. /// public static string Contest { get { return ResourceManager.GetString("Contest", resourceCulture); } } /// /// Looks up a localized string similar to Contest added successfully. /// public static string Contest_added { get { return ResourceManager.GetString("Contest_added", resourceCulture); } } /// /// Looks up a localized string similar to Contest edited successfully. /// public static string Contest_edited { get { return ResourceManager.GetString("Contest_edited", resourceCulture); } } /// /// Looks up a localized string similar to Contest not found. /// public static string Contest_not_found { get { return ResourceManager.GetString("Contest_not_found", resourceCulture); } } /// /// Looks up a localized string similar to Contest start date must be before the contest end date. /// public static string Contest_start_date_before_end { get { return ResourceManager.GetString("Contest_start_date_before_end", resourceCulture); } } /// /// Looks up a localized string similar to No active contests. /// public static string No_active_contests { get { return ResourceManager.GetString("No_active_contests", resourceCulture); } } /// /// Looks up a localized string similar to No future contests. /// public static string No_future_contests { get { return ResourceManager.GetString("No_future_contests", resourceCulture); } } /// /// Looks up a localized string similar to No latest contests. /// public static string No_latest_contests { get { return ResourceManager.GetString("No_latest_contests", resourceCulture); } } /// /// Looks up a localized string similar to Question could not be found by given Id. /// public static string No_question_by_id { get { return ResourceManager.GetString("No_question_by_id", resourceCulture); } } /// /// Looks up a localized string similar to practice. /// public static string Practice { get { return ResourceManager.GetString("Practice", resourceCulture); } } /// /// Looks up a localized string similar to Practice start date must be before the practice end date. /// public static string Practice_start_date_before_end { get { return ResourceManager.GetString("Practice_start_date_before_end", resourceCulture); } } /// /// Looks up a localized string similar to Ranking for {0} {1}.xls. /// public static string Report_excel_format { get { return ResourceManager.GetString("Report_excel_format", resourceCulture); } } /// /// Looks up a localized string similar to {1} submissions for {0}.zip. /// public static string Report_zip_format { get { return ResourceManager.GetString("Report_zip_format", resourceCulture); } } /// /// Looks up a localized string similar to Choose at least one submission type!. /// public static string Select_one_submission_type { get { return ResourceManager.GetString("Select_one_submission_type", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ContestsControllers.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ContestsControllers.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 състезание Състезанието беше добавено успешно Състезанието беше променено успешно Състезанието не е намерено Началната дата на състезанието не може да бъде след крайната дата на състезанието Няма активни състезания Няма бъдещи състезания Нямa последни състезaния Не може да се намери въпрос по зададеното Id практика Началната дата за упражнения не може да бъде след крайната дата за упражнения Класиране за {0} {1}.xls {1} решения за {0}.zip Изберете поне един вид решение! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ContestsControllers.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 contest Contest added successfully Contest edited successfully Contest not found Contest start date must be before the contest end date No active contests No future contests No latest contests Question could not be found by given Id practice Practice start date must be before the practice end date Ranking for {0} {1}.xls {1} submissions for {0}.zip Choose at least one submission type! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestAdministration.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestAdministration { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestAdministration() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.ViewModels.ContestAdmin" + "istration", typeof(ContestAdministration).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Category. /// public static string Category { get { return ResourceManager.GetString("Category", resourceCulture); } } /// /// Looks up a localized string similar to The category is required!. /// public static string Category_required { get { return ResourceManager.GetString("Category_required", resourceCulture); } } /// /// Looks up a localized string similar to Contest password. /// public static string Contest_password { get { return ResourceManager.GetString("Contest_password", resourceCulture); } } /// /// Looks up a localized string similar to Description. /// public static string Description { get { return ResourceManager.GetString("Description", resourceCulture); } } /// /// Looks up a localized string similar to End. /// public static string End_time { get { return ResourceManager.GetString("End_time", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to Accepted length for the name is between {2} and {1} symbols. /// public static string Name_length { get { return ResourceManager.GetString("Name_length", resourceCulture); } } /// /// Looks up a localized string similar to The name is required!. /// public static string Name_required { get { return ResourceManager.GetString("Name_required", resourceCulture); } } /// /// Looks up a localized string similar to Order. /// public static string Order { get { return ResourceManager.GetString("Order", resourceCulture); } } /// /// Looks up a localized string similar to The order is required!. /// public static string Order_required { get { return ResourceManager.GetString("Order_required", resourceCulture); } } /// /// Looks up a localized string similar to Practice end. /// public static string Practice_end_time { get { return ResourceManager.GetString("Practice_end_time", resourceCulture); } } /// /// Looks up a localized string similar to Practice password. /// public static string Practice_password { get { return ResourceManager.GetString("Practice_password", resourceCulture); } } /// /// Looks up a localized string similar to Practice start. /// public static string Practice_start_time { get { return ResourceManager.GetString("Practice_start_time", resourceCulture); } } /// /// Looks up a localized string similar to Start. /// public static string Start_time { get { return ResourceManager.GetString("Start_time", resourceCulture); } } /// /// Looks up a localized string similar to Submision types. /// public static string Submision_types { get { return ResourceManager.GetString("Submision_types", resourceCulture); } } /// /// Looks up a localized string similar to Submissions limit. /// public static string Submissions_limit { get { return ResourceManager.GetString("Submissions_limit", resourceCulture); } } /// /// Looks up a localized string similar to Is visible?. /// public static string Visibility { get { return ResourceManager.GetString("Visibility", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestAdministration.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestAdministration.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Категория Категорията е задължителна! Парола за състезание Описание Край Име Позволената дължина е между {2} и {1} символа Името е задължително! Подредба Подредбата е задължителна! Край упражнение Парола за упражнение Начало упражнение Начало Тип решения Време между събмисии Видимост ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestAdministration.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Category The category is required! Contest password Description End Name Accepted length for the name is between {2} and {1} symbols The name is required! Order The order is required! Practice end Practice password Practice start Start Submision types Submissions limit Is visible? ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestQuestion.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestQuestion { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestQuestion() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.ViewModels.ContestQuest" + "ion", typeof(ContestQuestion).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Ask in contests. /// public static string Ask_in_contest { get { return ResourceManager.GetString("Ask_in_contest", resourceCulture); } } /// /// Looks up a localized string similar to Ask in practices. /// public static string Ask_in_practice { get { return ResourceManager.GetString("Ask_in_practice", resourceCulture); } } /// /// Looks up a localized string similar to Type. /// public static string Question_type { get { return ResourceManager.GetString("Question_type", resourceCulture); } } /// /// Looks up a localized string similar to Reg-Ex for validation. /// public static string Regex_validation { get { return ResourceManager.GetString("Regex_validation", resourceCulture); } } /// /// Looks up a localized string similar to Text. /// public static string Text { get { return ResourceManager.GetString("Text", resourceCulture); } } /// /// Looks up a localized string similar to The text must be between {2} and {1} symbols. /// public static string Text_length { get { return ResourceManager.GetString("Text_length", resourceCulture); } } /// /// Looks up a localized string similar to The text is required!. /// public static string Text_required { get { return ResourceManager.GetString("Text_required", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestQuestion.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestQuestion.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Задаване към състезанията Задаване към упражненията Тип въпрос Reg-Ex валидация Текст Текста трябва да е между {2} и {1} символа Текста е задължителен! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestQuestion.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Ask in contests Ask in practices Type Reg-Ex for validation Text The text must be between {2} and {1} symbols The text is required! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestQuestionAnswer.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestQuestionAnswer { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestQuestionAnswer() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.ViewModels.ContestQuest" + "ionAnswer", typeof(ContestQuestionAnswer).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Question. /// public static string Question { get { return ResourceManager.GetString("Question", resourceCulture); } } /// /// Looks up a localized string similar to Text. /// public static string Text { get { return ResourceManager.GetString("Text", resourceCulture); } } /// /// Looks up a localized string similar to The text must be between {2} and {1} symbols. /// public static string Text_length { get { return ResourceManager.GetString("Text_length", resourceCulture); } } /// /// Looks up a localized string similar to The text is required!. /// public static string Text_required { get { return ResourceManager.GetString("Text_required", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestQuestionAnswer.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestQuestionAnswer.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Въпрос Текст Текста трябва да е между {2} и {1} символа Текста е задължителен! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ContestQuestionAnswer.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Question Text The text must be between {2} and {1} symbols The text is required! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ShortContestAdministration.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ShortContestAdministration { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ShortContestAdministration() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.ViewModels.ShortContest" + "Administration", typeof(ShortContestAdministration).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Category name. /// public static string Category_name { get { return ResourceManager.GetString("Category_name", resourceCulture); } } /// /// Looks up a localized string similar to End time. /// public static string End_time { get { return ResourceManager.GetString("End_time", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to The name is required. /// public static string Name_required { get { return ResourceManager.GetString("Name_required", resourceCulture); } } /// /// Looks up a localized string similar to Start time. /// public static string Start_time { get { return ResourceManager.GetString("Start_time", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ShortContestAdministration.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ShortContestAdministration.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Категория Край Име Името е задължително! Начало ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/ViewModels/ShortContestAdministration.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Category name End time Name The name is required Start time ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestCreate.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestCreate.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Създай Създаване на състезание ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestCreate.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestCreate { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestCreate() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.Views.ContestCreate", typeof(ContestCreate).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Create. /// public static string Create { get { return ResourceManager.GetString("Create", resourceCulture); } } /// /// Looks up a localized string similar to Contest creation. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestCreate.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Create Contest creation ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestEdit.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestEdit { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestEdit() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.Views.ContestEdit", typeof(ContestEdit).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Edit { get { return ResourceManager.GetString("Edit", resourceCulture); } } /// /// Looks up a localized string similar to Edit contest. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestEdit.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestEdit.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Промени Промяна на състезание ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestEdit.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Edit Edit contest ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.Views.ContestIndex", typeof(ContestIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Add answer. /// public static string Add_answer { get { return ResourceManager.GetString("Add_answer", resourceCulture); } } /// /// Looks up a localized string similar to Add question. /// public static string Add_question { get { return ResourceManager.GetString("Add_question", resourceCulture); } } /// /// Looks up a localized string similar to Copy from.... /// public static string Copy_from { get { return ResourceManager.GetString("Copy_from", resourceCulture); } } /// /// Looks up a localized string similar to Copy form contest. /// public static string Copy_from_contest { get { return ResourceManager.GetString("Copy_from_contest", resourceCulture); } } /// /// Looks up a localized string similar to Delete all. /// public static string Delete_all { get { return ResourceManager.GetString("Delete_all", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Edit { get { return ResourceManager.GetString("Edit", resourceCulture); } } /// /// Looks up a localized string similar to For contest. /// public static string For_contest { get { return ResourceManager.GetString("For_contest", resourceCulture); } } /// /// Looks up a localized string similar to For practice. /// public static string For_practice { get { return ResourceManager.GetString("For_practice", resourceCulture); } } /// /// Looks up a localized string similar to The selected question type, can not have preselected answers. /// public static string No_possible_answers { get { return ResourceManager.GetString("No_possible_answers", resourceCulture); } } /// /// Looks up a localized string similar to Other. /// public static string Other { get { return ResourceManager.GetString("Other", resourceCulture); } } /// /// Looks up a localized string similar to Contests. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } /// /// Looks up a localized string similar to Participants. /// public static string Participants { get { return ResourceManager.GetString("Participants", resourceCulture); } } /// /// Looks up a localized string similar to Ranking. /// public static string Ranking { get { return ResourceManager.GetString("Ranking", resourceCulture); } } /// /// Looks up a localized string similar to Resuls. /// public static string Results { get { return ResourceManager.GetString("Results", resourceCulture); } } /// /// Looks up a localized string similar to Tasks. /// public static string Tasks { get { return ResourceManager.GetString("Tasks", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Добави отговор Добави въпрос Копирай от... Копирай от друго състезание Изтрий всички Промени На състезанието На упражненията Избраният тип въпрос няма възможни отговори! Други Състезания Участници Класиране Решения Задачи ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/ContestIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Add answer Add question Copy from... Copy form contest Delete all Edit For contest For practice The selected question type, can not have preselected answers Other Contests Participants Ranking Resuls Tasks ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/EditorTemplates/CategoryDropDown.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests.Views.EditorTemplates { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class CategoryDropDown { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal CategoryDropDown() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.Views.EditorTemplates.C" + "ategoryDropDown", typeof(CategoryDropDown).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Choose a category. /// public static string Choose_category { get { return ResourceManager.GetString("Choose_category", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/EditorTemplates/CategoryDropDown.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/EditorTemplates/CategoryDropDown.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Изберете категория ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/EditorTemplates/CategoryDropDown.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Choose a category ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/EditorTemplates/SubmissionTypeCheckBoxes.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests.Views.EditorTemplates { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionTypeCheckBoxes { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionTypeCheckBoxes() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.Views.EditorTemplates.S" + "ubmissionTypeCheckBoxes", typeof(SubmissionTypeCheckBoxes).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Allow submission with. /// public static string Allow_submission { get { return ResourceManager.GetString("Allow_submission", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/EditorTemplates/SubmissionTypeCheckBoxes.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/EditorTemplates/SubmissionTypeCheckBoxes.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Позволете решения с ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/EditorTemplates/SubmissionTypeCheckBoxes.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Allow submission with ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/Partials/ContestEditor.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Contests.Views.Partials { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestEditor { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestEditor() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Contests.Views.Partials.ContestE" + "ditor", typeof(ContestEditor).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Enter the category of the contest. /// public static string Choose_category { get { return ResourceManager.GetString("Choose_category", resourceCulture); } } /// /// Looks up a localized string similar to Enter contest end time. /// public static string Contest_end { get { return ResourceManager.GetString("Contest_end", resourceCulture); } } /// /// Looks up a localized string similar to Enter the contest order. /// public static string Contest_order { get { return ResourceManager.GetString("Contest_order", resourceCulture); } } /// /// Looks up a localized string similar to Enter contest password. /// public static string Contest_password { get { return ResourceManager.GetString("Contest_password", resourceCulture); } } /// /// Looks up a localized string similar to Enter contest start time. /// public static string Contest_start { get { return ResourceManager.GetString("Contest_start", resourceCulture); } } /// /// Looks up a localized string similar to Choose if the contest is visible. /// public static string Contest_visibility { get { return ResourceManager.GetString("Contest_visibility", resourceCulture); } } /// /// Looks up a localized string similar to Duration information. /// public static string Duration_info { get { return ResourceManager.GetString("Duration_info", resourceCulture); } } /// /// Looks up a localized string similar to Enter the description of the contest. /// public static string Enter_description { get { return ResourceManager.GetString("Enter_description", resourceCulture); } } /// /// Looks up a localized string similar to Enter the title of the contest. /// public static string Enter_title { get { return ResourceManager.GetString("Enter_title", resourceCulture); } } /// /// Looks up a localized string similar to General information. /// public static string General_info { get { return ResourceManager.GetString("General_info", resourceCulture); } } /// /// Looks up a localized string similar to Options. /// public static string Options { get { return ResourceManager.GetString("Options", resourceCulture); } } /// /// Looks up a localized string similar to Passwords. /// public static string Passowords_info { get { return ResourceManager.GetString("Passowords_info", resourceCulture); } } /// /// Looks up a localized string similar to Enter practice end time. /// public static string Practice_end { get { return ResourceManager.GetString("Practice_end", resourceCulture); } } /// /// Looks up a localized string similar to Enter practice password. /// public static string Practice_password { get { return ResourceManager.GetString("Practice_password", resourceCulture); } } /// /// Looks up a localized string similar to Enter practice start time. /// public static string Practice_start { get { return ResourceManager.GetString("Practice_start", resourceCulture); } } /// /// Looks up a localized string similar to Submission types. /// public static string Submission_types { get { return ResourceManager.GetString("Submission_types", resourceCulture); } } /// /// Looks up a localized string similar to Enter a time limit between two consecutive submissions. /// public static string Submissions_limit { get { return ResourceManager.GetString("Submissions_limit", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/Partials/ContestEditor.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/Partials/ContestEditor.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Изберете категория на състезанието Въведете край на състезанието Въведете подредба на състезанието Въведете парола на състезанието Въведете начало на състезанието Изберете дали състезанието да бъде видимо Времетраене Въведете описание на състезанието Въведете заглавие на състезанието Основна информация Опции Пароли Въведете край за упражнения Въведете парола за упражнения Въведете начало за упражнение Въведете лимит между изпращане на две последователни решения Видове решения ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Contests/Views/Partials/ContestEditor.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Enter the category of the contest Enter contest end time Enter the contest order Enter contest password Enter contest start time Choose if the contest is visible Duration information Enter the description of the contest Enter the title of the contest General information Options Passwords Enter practice end time Enter practice password Enter practice start time Enter a time limit between two consecutive submissions Submission types ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Feedback/ViewModels/FeedbackReport.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Feedback.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class FeedbackReport { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal FeedbackReport() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Feedback.ViewModels.FeedbackRepo" + "rt", typeof(FeedbackReport).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Anonymous. /// public static string Anonymous { get { return ResourceManager.GetString("Anonymous", resourceCulture); } } /// /// Looks up a localized string similar to Content. /// public static string Contet { get { return ResourceManager.GetString("Contet", resourceCulture); } } /// /// Looks up a localized string similar to The content is required. /// public static string Contet_required { get { return ResourceManager.GetString("Contet_required", resourceCulture); } } /// /// Looks up a localized string similar to Fixed. /// public static string Is_fixed { get { return ResourceManager.GetString("Is_fixed", resourceCulture); } } /// /// Looks up a localized string similar to E-mail. /// public static string Mail { get { return ResourceManager.GetString("Mail", resourceCulture); } } /// /// Looks up a localized string similar to Invalid email address. /// public static string Mail_invalid { get { return ResourceManager.GetString("Mail_invalid", resourceCulture); } } /// /// Looks up a localized string similar to The email is requried!. /// public static string Mail_required { get { return ResourceManager.GetString("Mail_required", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to The name is required!. /// public static string Name_required { get { return ResourceManager.GetString("Name_required", resourceCulture); } } /// /// Looks up a localized string similar to User. /// public static string UserName { get { return ResourceManager.GetString("UserName", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Feedback/ViewModels/FeedbackReport.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Feedback/ViewModels/FeedbackReport.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Анонимен Съдържание Съдържанието е задължително Поправен E-mail Невалиден имейл адрес Имейла е задължителен Име Името е задължително Потребител ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Feedback/ViewModels/FeedbackReport.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Anonymous Content The content is required Fixed E-mail Invalid email address The email is requried! Name The name is required! User ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Feedback/Views/FeedbackIndexAdmin.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Feedback.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class FeedbackIndexAdmin { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal FeedbackIndexAdmin() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Feedback.Views.FeedbackIndexAdmi" + "n", typeof(FeedbackIndexAdmin).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Feedback. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Feedback/Views/FeedbackIndexAdmin.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Feedback/Views/FeedbackIndexAdmin.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Обратна връзка ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Feedback/Views/FeedbackIndexAdmin.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Feedback ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/News/ViewModels/NewsAdministration.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.News.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class NewsAdministration { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal NewsAdministration() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.News.ViewModels.NewsAdministrati" + "on", typeof(NewsAdministration).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Author. /// public static string Author { get { return ResourceManager.GetString("Author", resourceCulture); } } /// /// Looks up a localized string similar to Accepted length is between {2} and {1} symbols. /// public static string Author_length { get { return ResourceManager.GetString("Author_length", resourceCulture); } } /// /// Looks up a localized string similar to The author is required!. /// public static string Author_required { get { return ResourceManager.GetString("Author_required", resourceCulture); } } /// /// Looks up a localized string similar to Content. /// public static string Content { get { return ResourceManager.GetString("Content", resourceCulture); } } /// /// Looks up a localized string similar to Accepted length is between {2} and {1} symbols. /// public static string Content_length { get { return ResourceManager.GetString("Content_length", resourceCulture); } } /// /// Looks up a localized string similar to The content is required!. /// public static string Content_required { get { return ResourceManager.GetString("Content_required", resourceCulture); } } /// /// Looks up a localized string similar to Source. /// public static string Source { get { return ResourceManager.GetString("Source", resourceCulture); } } /// /// Looks up a localized string similar to Accepted length is between {2} and {1} symbols. /// public static string Source_length { get { return ResourceManager.GetString("Source_length", resourceCulture); } } /// /// Looks up a localized string similar to The source is required!. /// public static string Source_required { get { return ResourceManager.GetString("Source_required", resourceCulture); } } /// /// Looks up a localized string similar to Title. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } /// /// Looks up a localized string similar to Accepted length is between {2} and {1} symbols. /// public static string Title_length { get { return ResourceManager.GetString("Title_length", resourceCulture); } } /// /// Looks up a localized string similar to The title is required. /// public static string Title_required { get { return ResourceManager.GetString("Title_required", resourceCulture); } } /// /// Looks up a localized string similar to Is visible?. /// public static string Visibility { get { return ResourceManager.GetString("Visibility", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/News/ViewModels/NewsAdministration.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/News/ViewModels/NewsAdministration.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Автор Позволената дължина е между {2} и {1} символа Авторът е задължителен! Съдържание Съдържанието трябва да бъде поне {2} символа Съдържанието е задължително! Източник Позволената дължина е между {2} и {1} символа Източникът е задължителен! Заглавие Позволената дължина е между {2} и {1} символа Заглавието е задължително! Видимост ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/News/ViewModels/NewsAdministration.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Author Accepted length is between {2} and {1} symbols The author is required! Content Accepted length is between {2} and {1} symbols The content is required! Source Accepted length is between {2} and {1} symbols The source is required! Title Accepted length is between {2} and {1} symbols The title is required Is visible? ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/News/Views/NewsIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.News.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class NewsIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal NewsIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.News.Views.NewsIndex", typeof(NewsIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Download news. /// public static string Download_news { get { return ResourceManager.GetString("Download_news", resourceCulture); } } /// /// Looks up a localized string similar to News. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/News/Views/NewsIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/News/Views/NewsIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Изтегли новини Новини ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/News/Views/NewsIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Download news News ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/ViewModels/ParticipantViewModels.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Participants.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ParticipantViewModels { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ParticipantViewModels() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Participants.ViewModels.Particip" + "antViewModels", typeof(ParticipantViewModels).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Answer. /// public static string Answer { get { return ResourceManager.GetString("Answer", resourceCulture); } } /// /// Looks up a localized string similar to The answer is required!. /// public static string Answer_required { get { return ResourceManager.GetString("Answer_required", resourceCulture); } } /// /// Looks up a localized string similar to Contest. /// public static string Contest { get { return ResourceManager.GetString("Contest", resourceCulture); } } /// /// Looks up a localized string similar to Contest. /// public static string Contest_name { get { return ResourceManager.GetString("Contest_name", resourceCulture); } } /// /// Looks up a localized string similar to The contest is required!. /// public static string Contest_required { get { return ResourceManager.GetString("Contest_required", resourceCulture); } } /// /// Looks up a localized string similar to Is offical?. /// public static string Is_official { get { return ResourceManager.GetString("Is_official", resourceCulture); } } /// /// Looks up a localized string similar to Question. /// public static string Question { get { return ResourceManager.GetString("Question", resourceCulture); } } /// /// Looks up a localized string similar to User. /// public static string User { get { return ResourceManager.GetString("User", resourceCulture); } } /// /// Looks up a localized string similar to The user is required!. /// public static string User_required { get { return ResourceManager.GetString("User_required", resourceCulture); } } /// /// Looks up a localized string similar to User. /// public static string UserName { get { return ResourceManager.GetString("UserName", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/ViewModels/ParticipantViewModels.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/ViewModels/ParticipantViewModels.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Отговор Отговорът е задължителен! Състезание Състезание Състезанието е задължително! Официално участие Въпрос Потребител Потребител Потребителят е задължителен! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/ViewModels/ParticipantViewModels.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Answer The answer is required! Contest Contest The contest is required! Is offical? Question User User The user is required! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/EditorTemplates/ParticipantEditorTemplates.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Participants.Views.EditorTemplates { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ParticipantEditorTemplates { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ParticipantEditorTemplates() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Participants.Views.EditorTemplat" + "es.ParticipantEditorTemplates", typeof(ParticipantEditorTemplates).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Choose contest. /// public static string Choose_contest { get { return ResourceManager.GetString("Choose_contest", resourceCulture); } } /// /// Looks up a localized string similar to Choose user. /// public static string Choose_user { get { return ResourceManager.GetString("Choose_user", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/EditorTemplates/ParticipantEditorTemplates.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/EditorTemplates/ParticipantEditorTemplates.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Изберете състезание Изберете потребител ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/EditorTemplates/ParticipantEditorTemplates.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Choose contest Choose user ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/Partials/Participants.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Participants.Views.Partials { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Participants { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Participants() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Participants.Views.Partials.Part" + "icipants", typeof(Participants).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Add paticipant. /// public static string Add_participant { get { return ResourceManager.GetString("Add_participant", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/Partials/Participants.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/Partials/Participants.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Добавяне на участник ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/Partials/Participants.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Add paticipant ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/ParticipantsContest.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/ParticipantsContest.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Участници ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/ParticipantsContest.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Participants.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ParticipantsContest { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ParticipantsContest() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Participants.Views.ParticipantsC" + "ontest", typeof(ParticipantsContest).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Participants. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/ParticipantsContest.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Participants ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/ParticipantsIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Participants.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ParticipantsIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ParticipantsIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Participants.Views.ParticipantsI" + "ndex", typeof(ParticipantsIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Choose or enter a contest. /// public static string Choose_or_enter_contest { get { return ResourceManager.GetString("Choose_or_enter_contest", resourceCulture); } } /// /// Looks up a localized string similar to Clear. /// public static string Clear { get { return ResourceManager.GetString("Clear", resourceCulture); } } /// /// Looks up a localized string similar to Participants. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/ParticipantsIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/ParticipantsIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Изберете или напишете състезание Изчистване Участници ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Participants/Views/ParticipantsIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Choose or enter a contest Clear Participants ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ProblemsControllers.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Problems { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProblemsControllers { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProblemsControllers() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Problems.ProblemsControllers", typeof(ProblemsControllers).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Invalid contest. /// public static string Invalid_contest { get { return ResourceManager.GetString("Invalid_contest", resourceCulture); } } /// /// Looks up a localized string similar to Invalid problem. /// public static string Invalid_problem { get { return ResourceManager.GetString("Invalid_problem", resourceCulture); } } /// /// Looks up a localized string similar to Invalid tests. /// public static string Invalid_tests { get { return ResourceManager.GetString("Invalid_tests", resourceCulture); } } /// /// Looks up a localized string similar to Invalid user. /// public static string Invalid_user { get { return ResourceManager.GetString("Invalid_user", resourceCulture); } } /// /// Looks up a localized string similar to Tests must be in a zip file.. /// public static string Must_be_zip_file { get { return ResourceManager.GetString("Must_be_zip_file", resourceCulture); } } /// /// Looks up a localized string similar to Problem added successfully.. /// public static string Problem_added { get { return ResourceManager.GetString("Problem_added", resourceCulture); } } /// /// Looks up a localized string similar to Problem deleted successfully.. /// public static string Problem_deleted { get { return ResourceManager.GetString("Problem_deleted", resourceCulture); } } /// /// Looks up a localized string similar to Problem edited successfully.. /// public static string Problem_edited { get { return ResourceManager.GetString("Problem_edited", resourceCulture); } } /// /// Looks up a localized string similar to Problem retested successfully.. /// public static string Problem_retested { get { return ResourceManager.GetString("Problem_retested", resourceCulture); } } /// /// Looks up a localized string similar to Problems deleted successfully.. /// public static string Problems_deleted { get { return ResourceManager.GetString("Problems_deleted", resourceCulture); } } /// /// Looks up a localized string similar to Resources must be fully entered.. /// public static string Resources_not_complete { get { return ResourceManager.GetString("Resources_not_complete", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ProblemsControllers.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ProblemsControllers.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Невалидно състезание Невалидна задача Невалидни тестове Невалиден потребител Тестовете трябва да бъдат в .ZIP файл Задачите бяха изтрити успешно Задачата беше добавена успешно Задачата беше изтрита успешно Задачата беше променена успешно Задачата беше ретествана успешно Ресурсите трябва да бъдат попълнени изцяло! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ProblemsControllers.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Invalid contest Invalid problem Invalid tests Invalid user Tests must be in a zip file. Problems deleted successfully. Problem added successfully. Problem deleted successfully. Problem edited successfully. Problem retested successfully. Resources must be fully entered. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ViewModels/DetailedProblem.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Problems.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class DetailedProblem { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal DetailedProblem() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Problems.ViewModels.DetailedProb" + "lem", typeof(DetailedProblem).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Checker. /// public static string Checker { get { return ResourceManager.GetString("Checker", resourceCulture); } } /// /// Looks up a localized string similar to Compete tests. /// public static string Compete_tests { get { return ResourceManager.GetString("Compete_tests", resourceCulture); } } /// /// Looks up a localized string similar to Contest. /// public static string Contest { get { return ResourceManager.GetString("Contest", resourceCulture); } } /// /// Looks up a localized string similar to Max points. /// public static string Max_points { get { return ResourceManager.GetString("Max_points", resourceCulture); } } /// /// Looks up a localized string similar to The max points are required!. /// public static string Max_points_required { get { return ResourceManager.GetString("Max_points_required", resourceCulture); } } /// /// Looks up a localized string similar to Memory limit. /// public static string Memory_limit { get { return ResourceManager.GetString("Memory_limit", resourceCulture); } } /// /// Looks up a localized string similar to Memory limit required!. /// public static string Memory_limit_required { get { return ResourceManager.GetString("Memory_limit_required", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to Max length is {1} symbols!. /// public static string Name_length { get { return ResourceManager.GetString("Name_length", resourceCulture); } } /// /// Looks up a localized string similar to The name is required!. /// public static string Name_required { get { return ResourceManager.GetString("Name_required", resourceCulture); } } /// /// Looks up a localized string similar to Order. /// public static string Order { get { return ResourceManager.GetString("Order", resourceCulture); } } /// /// Looks up a localized string similar to The order is required!. /// public static string Order_required { get { return ResourceManager.GetString("Order_required", resourceCulture); } } /// /// Looks up a localized string similar to Show detailed feedback. /// public static string Show_detailed_feedback { get { return ResourceManager.GetString("Show_detailed_feedback", resourceCulture); } } /// /// Looks up a localized string similar to Show results. /// public static string Show_results { get { return ResourceManager.GetString("Show_results", resourceCulture); } } /// /// Looks up a localized string similar to Source code size limit. /// public static string Source_code_size_limit { get { return ResourceManager.GetString("Source_code_size_limit", resourceCulture); } } /// /// Looks up a localized string similar to Time limit. /// public static string Time_limit { get { return ResourceManager.GetString("Time_limit", resourceCulture); } } /// /// Looks up a localized string similar to The time limit is required!. /// public static string Time_limit_required { get { return ResourceManager.GetString("Time_limit_required", resourceCulture); } } /// /// Looks up a localized string similar to Trial tests. /// public static string Trial_tests { get { return ResourceManager.GetString("Trial_tests", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ViewModels/DetailedProblem.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ViewModels/DetailedProblem.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Чекер Състезателни тестове Състезание Максимум точки Максимум точките са задължителни! Лимит на памет Лимита на памет е задължителен! Име Максималната дължина е {1} символа! Името е задължително! Подредба Подредбата е задължителна! Покажи пълния feedback Видими резултати Размер на сорс кода Лимит на време Лимита на време е задължителен! Пробни тестове ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ViewModels/DetailedProblem.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Checker Compete tests Contest Max points The max points are required! Memory limit Memory limit required! Name Max length is {1} symbols! The name is required! Order The order is required! Show detailed feedback Show results Source code size limit Time limit The time limit is required! Trial tests ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ViewModels/ProblemResources.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ViewModels/ProblemResources.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Линк Име Позволената дължина е между {2} и {1} символа Името на ресурса е задължително! Подредба Подредбата е задължителна! Тип Типа е задължителен! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ViewModels/ProblemResources.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Problems.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProblemResources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProblemResources() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Problems.ViewModels.ProblemResou" + "rces", typeof(ProblemResources).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Link. /// public static string Link { get { return ResourceManager.GetString("Link", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to Accepted length is between {2} and {1} symbols. /// public static string Name_length { get { return ResourceManager.GetString("Name_length", resourceCulture); } } /// /// Looks up a localized string similar to The resource name is required!. /// public static string Name_required { get { return ResourceManager.GetString("Name_required", resourceCulture); } } /// /// Looks up a localized string similar to Order. /// public static string Order { get { return ResourceManager.GetString("Order", resourceCulture); } } /// /// Looks up a localized string similar to The order is required!. /// public static string Order_required { get { return ResourceManager.GetString("Order_required", resourceCulture); } } /// /// Looks up a localized string similar to Type. /// public static string Type { get { return ResourceManager.GetString("Type", resourceCulture); } } /// /// Looks up a localized string similar to The type is required!. /// public static string Type_required { get { return ResourceManager.GetString("Type_required", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/ViewModels/ProblemResources.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Link Name Accepted length is between {2} and {1} symbols The resource name is required! Order The order is required! Type The type is required! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/Partials/ProblemsPartials.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Problems.Views.Partials { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProblemsPartials { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProblemsPartials() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Problems.Views.Partials.Problems" + "Partials", typeof(ProblemsPartials).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Delete. /// public static string Delete { get { return ResourceManager.GetString("Delete", resourceCulture); } } /// /// Looks up a localized string similar to Download. /// public static string Download { get { return ResourceManager.GetString("Download", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Edit { get { return ResourceManager.GetString("Edit", resourceCulture); } } /// /// Looks up a localized string similar to Retest. /// public static string Retest { get { return ResourceManager.GetString("Retest", resourceCulture); } } /// /// Looks up a localized string similar to Video. /// public static string Video { get { return ResourceManager.GetString("Video", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/Partials/ProblemsPartials.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/Partials/ProblemsPartials.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Изтриване Свали Промяна Ретест Видео ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/Partials/ProblemsPartials.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Delete Download Edit Retest Video ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsCreate.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Problems.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProblemsCreate { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProblemsCreate() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Problems.Views.ProblemsCreate", typeof(ProblemsCreate).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Add. /// public static string Add { get { return ResourceManager.GetString("Add", resourceCulture); } } /// /// Looks up a localized string similar to Add or remove resource for this problem - problem description, solution or video. Every resource has a name, type and a file/llink.. /// public static string Add_remove_resource { get { return ResourceManager.GetString("Add_remove_resource", resourceCulture); } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to - the system does uses case insensitive comparison when comparing symbol by symbol.. /// public static string Case_insensitive_checker_description { get { return ResourceManager.GetString("Case_insensitive_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Choose a source code checker for this problem. The basic options are:. /// public static string Choose_code_checker { get { return ResourceManager.GetString("Choose_code_checker", resourceCulture); } } /// /// Looks up a localized string similar to Choose file. /// public static string Choose_file { get { return ResourceManager.GetString("Choose_file", resourceCulture); } } /// /// Looks up a localized string similar to Choose the .zip file with expected input and output for the current problem. /// <br /> /// You can download a sample zip file from /// <a href="/Content/Demos/DemoTests.zip">here</a>.. /// public static string Choose_zip_file { get { return ResourceManager.GetString("Choose_zip_file", resourceCulture); } } /// /// Looks up a localized string similar to Create. /// public static string Create { get { return ResourceManager.GetString("Create", resourceCulture); } } /// /// Looks up a localized string similar to Enter the max points for the problem. /// public static string Enter_max_points { get { return ResourceManager.GetString("Enter_max_points", resourceCulture); } } /// /// Looks up a localized string similar to Enter the memory limit (in bytes) for this problem. /// public static string Enter_memory_limit { get { return ResourceManager.GetString("Enter_memory_limit", resourceCulture); } } /// /// Looks up a localized string similar to Enter the name of the problem. /// public static string Enter_name { get { return ResourceManager.GetString("Enter_name", resourceCulture); } } /// /// Looks up a localized string similar to Enter the order for the current problem. /// public static string Enter_order { get { return ResourceManager.GetString("Enter_order", resourceCulture); } } /// /// Looks up a localized string similar to Enter the source code size limit (in bytes) for this problem. /// public static string Enter_sorce_code_size_limit { get { return ResourceManager.GetString("Enter_sorce_code_size_limit", resourceCulture); } } /// /// Looks up a localized string similar to Enter the time limit (in miliseconds) for this problem. /// public static string Enter_time_limit { get { return ResourceManager.GetString("Enter_time_limit", resourceCulture); } } /// /// Looks up a localized string similar to - the system compares the results of the participants with the expected output symbol by symbol.. /// public static string Exact_checker_description { get { return ResourceManager.GetString("Exact_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to for. /// public static string For { get { return ResourceManager.GetString("For", resourceCulture); } } /// /// Looks up a localized string similar to General information. /// public static string General_info { get { return ResourceManager.GetString("General_info", resourceCulture); } } /// /// Looks up a localized string similar to Create problem. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } /// /// Looks up a localized string similar to - the system compares only N digits after the decimal separator. Works only for problems where the answers are floating point numbers positioned on new lines.. /// public static string Precision_checker_description { get { return ResourceManager.GetString("Precision_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Remove. /// public static string Remove { get { return ResourceManager.GetString("Remove", resourceCulture); } } /// /// Looks up a localized string similar to Resources. /// public static string Resources { get { return ResourceManager.GetString("Resources", resourceCulture); } } /// /// Looks up a localized string similar to Settings. /// public static string Settings { get { return ResourceManager.GetString("Settings", resourceCulture); } } /// /// Looks up a localized string similar to Choose if the participants can see a full feedback for thier submissions (like administrators). /// public static string Show_detailed_feedback { get { return ResourceManager.GetString("Show_detailed_feedback", resourceCulture); } } /// /// Looks up a localized string similar to Choose if the participants can see their result in real time. /// public static string Show_results { get { return ResourceManager.GetString("Show_results", resourceCulture); } } /// /// Looks up a localized string similar to - the system first sorts the results of the participants and the expected output, line by line and then compares them both symbol by symbol.. /// public static string Sort_checker_description { get { return ResourceManager.GetString("Sort_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Tests. /// public static string Tests { get { return ResourceManager.GetString("Tests", resourceCulture); } } /// /// Looks up a localized string similar to Tests (.zip file). /// public static string Tests_label { get { return ResourceManager.GetString("Tests_label", resourceCulture); } } /// /// Looks up a localized string similar to - the system first removes the white spaces in front and in the end of the participant results and then compare them with the expected output symbol by symbol.. /// public static string Trim_checker_description { get { return ResourceManager.GetString("Trim_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Yes. /// public static string Yes { get { return ResourceManager.GetString("Yes", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsCreate.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsCreate.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Добави Добавете или премахнете ресурс към задачата - условие, авторско решение или видео. Всеки ресурс има име, тип и файл/линк. Назад - системата не отчита разлика между главна и малка буква като сравнява символ по символ; Изберете тип проверка на сорс кода на състезателите. Базовите варианти са: Избери файл Изберете .zip файл с тестове за вход и изход към задачата. <br /> Можете да изтеглите примерен файл с тестове <a href="/Content/Demos/DemoTests.zip">тук</a>. Създай Въведете максимален брой точки, които състезателят може да получи от задачата Въведете максималнa памет в байтове, която състезателят може да достигне с решението си върху задачата Въведете заглавие на задачата Въведете номер под ред на задачата в текущото състезание Въведете максимален размер на сорс код в байтове, която състезателят може да изпрати като решение на задачата Въведете максимално време в милисекунди, които състезателят може да достигне с решението си върху задачата - системата проверява резултатите на състезателя с очаквания изход символ по символ; към Основна информация Създаване на задача - само за задачи с резултати съдържащи числа с плаваща запетая на всеки нов ред - системата се съобразява само с първите N на брой цифри след плаващата запетая. Премахни Ресурси Настройки Изберете дали участниците ще могат да си виждат пълен feedback на решенията си, както го виждат администраторите Изберете дали участниците ще могат да си виждат резултатите в реално време - системата първо сортира по линии резултатите на състезателя и очаквания изход и след това ги сравнява символ по символ; Тестове Тестове (.zip файл) - системата първо премахва празните интервали в началото и края на резултатите на състезателя и след това ги сравнява с очаквания изход символ по символ; Да ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsCreate.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Add Add or remove resource for this problem - problem description, solution or video. Every resource has a name, type and a file/llink. Back - the system does uses case insensitive comparison when comparing symbol by symbol. Choose a source code checker for this problem. The basic options are: Choose file Choose the .zip file with expected input and output for the current problem. <br /> You can download a sample zip file from <a href="/Content/Demos/DemoTests.zip">here</a>. Create Enter the max points for the problem Enter the memory limit (in bytes) for this problem Enter the name of the problem Enter the order for the current problem Enter the source code size limit (in bytes) for this problem Enter the time limit (in miliseconds) for this problem - the system compares the results of the participants with the expected output symbol by symbol. for General information Create problem - the system compares only N digits after the decimal separator. Works only for problems where the answers are floating point numbers positioned on new lines. Remove Resources Settings Choose if the participants can see a full feedback for thier submissions (like administrators) Choose if the participants can see their result in real time - the system first sorts the results of the participants and the expected output, line by line and then compares them both symbol by symbol. Tests Tests (.zip file) - the system first removes the white spaces in front and in the end of the participant results and then compare them with the expected output symbol by symbol. Yes ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDelete.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Problems.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProblemsDelete { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProblemsDelete() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Problems.Views.ProblemsDelete", typeof(ProblemsDelete).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Назад. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Изтрий. /// public static string Delete { get { return ResourceManager.GetString("Delete", resourceCulture); } } /// /// Looks up a localized string similar to Delete problem. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDelete.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDelete.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Изтрий Изтриване на задача ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDelete.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Изтрий Delete problem ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDeleteAll.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Problems.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProblemsDeleteAll { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProblemsDeleteAll() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Problems.Views.ProblemsDeleteAll" + "", typeof(ProblemsDeleteAll).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Назад. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Потвърди. /// public static string Confirm { get { return ResourceManager.GetString("Confirm", resourceCulture); } } /// /// Looks up a localized string similar to Сигурни ли сте, че искате да изтриете всички задачи на. /// public static string Confirm_message { get { return ResourceManager.GetString("Confirm_message", resourceCulture); } } /// /// Looks up a localized string similar to Изтриване на всички задачи. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDeleteAll.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDeleteAll.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Confirm Do you want to delete all problems for Delete all problems ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDeleteAll.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Потвърди Сигурни ли сте, че искате да изтриете всички задачи на Изтриване на всички задачи ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDetails.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Problems.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProblemsDetails { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProblemsDetails() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Problems.Views.ProblemsDetails", typeof(ProblemsDetails).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Edit { get { return ResourceManager.GetString("Edit", resourceCulture); } } /// /// Looks up a localized string similar to Full feedback is invisible. /// public static string Full_feedback_invisible { get { return ResourceManager.GetString("Full_feedback_invisible", resourceCulture); } } /// /// Looks up a localized string similar to Full feedback is visible. /// public static string Full_feedback_visible { get { return ResourceManager.GetString("Full_feedback_visible", resourceCulture); } } /// /// Looks up a localized string similar to Problem details. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } /// /// Looks up a localized string similar to Submissions are invisible. /// public static string Results_invisible { get { return ResourceManager.GetString("Results_invisible", resourceCulture); } } /// /// Looks up a localized string similar to Submissions are visible. /// public static string Results_visible { get { return ResourceManager.GetString("Results_visible", resourceCulture); } } /// /// Looks up a localized string similar to Show resources. /// public static string Show_resources { get { return ResourceManager.GetString("Show_resources", resourceCulture); } } /// /// Looks up a localized string similar to Show submissions. /// public static string Show_submissions { get { return ResourceManager.GetString("Show_submissions", resourceCulture); } } /// /// Looks up a localized string similar to Tests. /// public static string Tests { get { return ResourceManager.GetString("Tests", resourceCulture); } } /// /// Looks up a localized string similar to Unlimited. /// public static string Unlimited { get { return ResourceManager.GetString("Unlimited", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDetails.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDetails.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Промени Пълният feedback е невидим Пълният feedback е видим Детайли за задача Резултатите не са видими Резултатите са видими Покажи ресурсите Покажи решенията Тестове Неограничен ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsDetails.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Edit Full feedback is invisible Full feedback is visible Problem details Submissions are invisible Submissions are visible Show resources Show submissions Tests Unlimited ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsEdit.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Problems.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProblemsEdit { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProblemsEdit() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Problems.Views.ProblemsEdit", typeof(ProblemsEdit).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Add or remove resource for this problem - problem description, solution or video. Every resource has a name, type and a file/llink.. /// public static string Add_remove_resource { get { return ResourceManager.GetString("Add_remove_resource", resourceCulture); } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to - the system does uses case insensitive comparison when comparing symbol by symbol.. /// public static string Case_insensitive_checker_description { get { return ResourceManager.GetString("Case_insensitive_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Choose a source code checker for this problem. The basic options are:. /// public static string Choose_code_checker { get { return ResourceManager.GetString("Choose_code_checker", resourceCulture); } } /// /// Looks up a localized string similar to Choose file. /// public static string Choose_file { get { return ResourceManager.GetString("Choose_file", resourceCulture); } } /// /// Looks up a localized string similar to Choose the .zip file with expected input and output for the current problem. /// <br /> /// You can download a sample zip file from /// <a href="/Content/Demos/DemoTests.zip">here</a>.. /// public static string Choose_zip_file { get { return ResourceManager.GetString("Choose_zip_file", resourceCulture); } } /// /// Looks up a localized string similar to Create. /// public static string Create { get { return ResourceManager.GetString("Create", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Edit { get { return ResourceManager.GetString("Edit", resourceCulture); } } /// /// Looks up a localized string similar to Enter the max points for the problem. /// public static string Enter_max_points { get { return ResourceManager.GetString("Enter_max_points", resourceCulture); } } /// /// Looks up a localized string similar to Enter the memory limit (in bytes) for this problem. /// public static string Enter_memory_limit { get { return ResourceManager.GetString("Enter_memory_limit", resourceCulture); } } /// /// Looks up a localized string similar to Enter the name of the problem. /// public static string Enter_name { get { return ResourceManager.GetString("Enter_name", resourceCulture); } } /// /// Looks up a localized string similar to Enter the order for the current problem. /// public static string Enter_order { get { return ResourceManager.GetString("Enter_order", resourceCulture); } } /// /// Looks up a localized string similar to Enter the source code size limit (in bytes) for this problem. /// public static string Enter_sorce_code_size_limit { get { return ResourceManager.GetString("Enter_sorce_code_size_limit", resourceCulture); } } /// /// Looks up a localized string similar to Enter the time limit (in miliseconds) for this problem. /// public static string Enter_time_limit { get { return ResourceManager.GetString("Enter_time_limit", resourceCulture); } } /// /// Looks up a localized string similar to - the system compares the results of the participants with the expected output symbol by symbol.. /// public static string Exact_checker_description { get { return ResourceManager.GetString("Exact_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to for. /// public static string For { get { return ResourceManager.GetString("For", resourceCulture); } } /// /// Looks up a localized string similar to General information. /// public static string General_info { get { return ResourceManager.GetString("General_info", resourceCulture); } } /// /// Looks up a localized string similar to Create problem. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } /// /// Looks up a localized string similar to - the system compares only N digits after the decimal separator. Works only for problems where the answers are floating point numbers positioned on new lines.. /// public static string Precision_checker_description { get { return ResourceManager.GetString("Precision_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Remove. /// public static string Remove { get { return ResourceManager.GetString("Remove", resourceCulture); } } /// /// Looks up a localized string similar to Resources. /// public static string Resources { get { return ResourceManager.GetString("Resources", resourceCulture); } } /// /// Looks up a localized string similar to Settings. /// public static string Settings { get { return ResourceManager.GetString("Settings", resourceCulture); } } /// /// Looks up a localized string similar to Choose if the participants can see a full feedback for thier submissions (like administrators). /// public static string Show_detailed_feedback { get { return ResourceManager.GetString("Show_detailed_feedback", resourceCulture); } } /// /// Looks up a localized string similar to Choose if the participants can see their result in real time. /// public static string Show_results { get { return ResourceManager.GetString("Show_results", resourceCulture); } } /// /// Looks up a localized string similar to - the system first sorts the results of the participants and the expected output, line by line and then compares them both symbol by symbol.. /// public static string Sort_checker_description { get { return ResourceManager.GetString("Sort_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Tests. /// public static string Tests { get { return ResourceManager.GetString("Tests", resourceCulture); } } /// /// Looks up a localized string similar to Tests (.zip file). /// public static string Tests_label { get { return ResourceManager.GetString("Tests_label", resourceCulture); } } /// /// Looks up a localized string similar to - the system first removes the white spaces in front and in the end of the participant results and then compare them with the expected output symbol by symbol.. /// public static string Trim_checker_description { get { return ResourceManager.GetString("Trim_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Yes. /// public static string Yes { get { return ResourceManager.GetString("Yes", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsEdit.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsEdit.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Добавете или премахнете ресурс към задачата - условие, авторско решение или видео. Всеки ресурс има име, тип и файл/линк. Назад - системата не отчита разлика между главна и малка буква като сравнява символ по символ; Изберете тип проверка на сорс кода на състезателите. Базовите варианти са: Избери файл Изберете .zip файл с тестове за вход и изход към задачата. <br /> Можете да изтеглите примерен файл с тестове <a href="/Content/Demos/DemoTests.zip">тук</a>. Създай Промяна Промяна на максималния брой точки, които състезателят може да получи от задачата Промяна на максималнaта памет в байтове, която състезателят може да достигне с решението си върху задачата Промяна на заглавието на задачата Промяна на номер под ред на задачата в текущото състезание Промяна на максималния размер на сорс код в байтове, която състезателят може да изпрати като решение на задачата Промяна на максимално време в милисекунди, които състезателят може да достигне с решението си върху задачата - системата проверява резултатите на състезателя с очаквания изход символ по символ; към Основна информация Промяна на задача - само за задачи с резултати съдържащи числа с плаваща запетая на всеки нов ред - системата се съобразява само с първите N на брой цифри след плаващата запетая. Премахни Ресурси Настройки Изберете дали участниците ще могат да си виждат пълен feedback на решенията си, както го виждат администраторите Изберете дали участниците ще могат да си виждат резултатите в реално време - системата първо сортира по линии резултатите на състезателя и очаквания изход и след това ги сравнява символ по символ; Тестове Тестове (.zip файл) - системата първо премахва празните интервали в началото и края на резултатите на състезателя и след това ги сравнява с очаквания изход символ по символ; Да ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsEdit.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Add or remove resource for this problem - problem description, solution or video. Every resource has a name, type and a file/llink. Back - the system does uses case insensitive comparison when comparing symbol by symbol. Choose a source code checker for this problem. The basic options are: Choose file Choose the .zip file with expected input and output for the current problem. <br /> You can download a sample zip file from <a href="/Content/Demos/DemoTests.zip">here</a>. Create Edit Enter the max points for the problem Enter the memory limit (in bytes) for this problem Enter the name of the problem Enter the order for the current problem Enter the source code size limit (in bytes) for this problem Enter the time limit (in miliseconds) for this problem - the system compares the results of the participants with the expected output symbol by symbol. for General information Create problem - the system compares only N digits after the decimal separator. Works only for problems where the answers are floating point numbers positioned on new lines. Remove Resources Settings Choose if the participants can see a full feedback for thier submissions (like administrators) Choose if the participants can see their result in real time - the system first sorts the results of the participants and the expected output, line by line and then compares them both symbol by symbol. Tests Tests (.zip file) - the system first removes the white spaces in front and in the end of the participant results and then compare them with the expected output symbol by symbol. Yes ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Problems.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProblemsIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProblemsIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Problems.Views.ProblemsIndex", typeof(ProblemsIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Active. /// public static string Active { get { return ResourceManager.GetString("Active", resourceCulture); } } /// /// Looks up a localized string similar to Category:. /// public static string Category { get { return ResourceManager.GetString("Category", resourceCulture); } } /// /// Looks up a localized string similar to Choose category.... /// public static string Choose_category { get { return ResourceManager.GetString("Choose_category", resourceCulture); } } /// /// Looks up a localized string similar to Choose contest.... /// public static string Choose_contest { get { return ResourceManager.GetString("Choose_contest", resourceCulture); } } /// /// Looks up a localized string similar to Contest:. /// public static string Contest { get { return ResourceManager.GetString("Contest", resourceCulture); } } /// /// Looks up a localized string similar to Enter contest.... /// public static string Enter_contest { get { return ResourceManager.GetString("Enter_contest", resourceCulture); } } /// /// Looks up a localized string similar to Future. /// public static string Future { get { return ResourceManager.GetString("Future", resourceCulture); } } /// /// Looks up a localized string similar to Latest. /// public static string Latest { get { return ResourceManager.GetString("Latest", resourceCulture); } } /// /// Looks up a localized string similar to Problems. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } /// /// Looks up a localized string similar to Problems loading.... /// public static string Problems_loading { get { return ResourceManager.GetString("Problems_loading", resourceCulture); } } /// /// Looks up a localized string similar to Contest quick access:. /// public static string Qucik_access_contest { get { return ResourceManager.GetString("Qucik_access_contest", resourceCulture); } } /// /// Looks up a localized string similar to Search by contest. /// public static string Search_by_contest { get { return ResourceManager.GetString("Search_by_contest", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Активни Категория: Избери категория... Избери състезание... Състезание: Въведи състезание... Бъдещи Последни Задача Задачите се зареждат... Бърз достъп до състезания: Търсене по състезание: ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Problems/Views/ProblemsIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Active Category: Choose category... Choose contest... Contest: Enter contest... Future Latest Problems Problems loading... Contest quick access: Search by contest ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/ResourcesControllers.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Resources { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ResourcesControllers { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ResourcesControllers() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Resources.ResourcesControllers", typeof(ResourcesControllers).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to The file is required!. /// public static string File_required { get { return ResourceManager.GetString("File_required", resourceCulture); } } /// /// Looks up a localized string similar to Resource is invalid!. /// public static string Invalid_resource { get { return ResourceManager.GetString("Invalid_resource", resourceCulture); } } /// /// Looks up a localized string similar to The link must not be empty. /// public static string Link_not_empty { get { return ResourceManager.GetString("Link_not_empty", resourceCulture); } } /// /// Looks up a localized string similar to Problem not found.. /// public static string Problem_not_found { get { return ResourceManager.GetString("Problem_not_found", resourceCulture); } } /// /// Looks up a localized string similar to Resource not found. /// public static string Resource_not_found { get { return ResourceManager.GetString("Resource_not_found", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/ResourcesControllers.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/ResourcesControllers.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Файлът е задължителен Ресурсът е невалиден Линкът не може да бъде празен Задачата не е намерена Ресурса не е намерен ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/ResourcesControllers.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 The file is required! Resource is invalid! The link must not be empty Problem not found. Resource not found ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/Views/ResourcesCreate.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Resources.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ResourcesCreate { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ResourcesCreate() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Resources.Views.ResourcesCreate", typeof(ResourcesCreate).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Choose file. /// public static string Choose_file { get { return ResourceManager.GetString("Choose_file", resourceCulture); } } /// /// Looks up a localized string similar to Choose file for resource. /// public static string Choose_file_for_resource { get { return ResourceManager.GetString("Choose_file_for_resource", resourceCulture); } } /// /// Looks up a localized string similar to Choose resource type - description, solution or video for the problem. /// public static string Choose_type { get { return ResourceManager.GetString("Choose_type", resourceCulture); } } /// /// Looks up a localized string similar to Create. /// public static string Create { get { return ResourceManager.GetString("Create", resourceCulture); } } /// /// Looks up a localized string similar to Enter resource name. /// public static string Enter_name { get { return ResourceManager.GetString("Enter_name", resourceCulture); } } /// /// Looks up a localized string similar to Enter resource order. /// public static string Enter_order { get { return ResourceManager.GetString("Enter_order", resourceCulture); } } /// /// Looks up a localized string similar to Enter video link. /// public static string Enter_video_link { get { return ResourceManager.GetString("Enter_video_link", resourceCulture); } } /// /// Looks up a localized string similar to File. /// public static string File { get { return ResourceManager.GetString("File", resourceCulture); } } /// /// Looks up a localized string similar to for. /// public static string For { get { return ResourceManager.GetString("For", resourceCulture); } } /// /// Looks up a localized string similar to New resource. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/Views/ResourcesCreate.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/Views/ResourcesCreate.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Избери файл Изберете файл за ресурса Изберете тип ресурс - описание, авторско решение или видео към задачата Създай Въведете име на ресурса Въведете подредба на ресурса Въведете линк към видеото Файл към Нов ресурс ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/Views/ResourcesCreate.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Choose file Choose file for resource Choose resource type - description, solution or video for the problem Create Enter resource name Enter resource order Enter video link File for New resource ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/Views/ResourcesEdit.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Resources.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ResourcesEdit { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ResourcesEdit() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Resources.Views.ResourcesEdit", typeof(ResourcesEdit).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Choose file. /// public static string Choose_file { get { return ResourceManager.GetString("Choose_file", resourceCulture); } } /// /// Looks up a localized string similar to Choose file for resource. /// public static string Choose_file_for_resource { get { return ResourceManager.GetString("Choose_file_for_resource", resourceCulture); } } /// /// Looks up a localized string similar to Choose resource type - description, solution or video for the problem. /// public static string Choose_type { get { return ResourceManager.GetString("Choose_type", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Edit { get { return ResourceManager.GetString("Edit", resourceCulture); } } /// /// Looks up a localized string similar to Enter resource name. /// public static string Enter_name { get { return ResourceManager.GetString("Enter_name", resourceCulture); } } /// /// Looks up a localized string similar to Enter resource order. /// public static string Enter_order { get { return ResourceManager.GetString("Enter_order", resourceCulture); } } /// /// Looks up a localized string similar to Enter video link. /// public static string Enter_video_link { get { return ResourceManager.GetString("Enter_video_link", resourceCulture); } } /// /// Looks up a localized string similar to File. /// public static string File { get { return ResourceManager.GetString("File", resourceCulture); } } /// /// Looks up a localized string similar to for. /// public static string For { get { return ResourceManager.GetString("For", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/Views/ResourcesEdit.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/Views/ResourcesEdit.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Избери файл Изберете файл за ресурса Изберете тип ресурс - описание, авторско решение или видео към задачата Промени Въведете име на ресурса Въведете подредба на ресурса Въведете линк към видеото Файл към Промяна ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Resources/Views/ResourcesEdit.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Choose file Choose file for resource Choose resource type - description, solution or video for the problem Edit Enter resource name Enter resource order Enter video link File for Edit ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Roles/ViewModels/RolesViewModels.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Roles.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class RolesViewModels { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal RolesViewModels() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Roles.ViewModels.RolesViewModels" + "", typeof(RolesViewModels).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to E-mail. /// public static string Email { get { return ResourceManager.GetString("Email", resourceCulture); } } /// /// Looks up a localized string similar to Фамилия. /// public static string Last_name { get { return ResourceManager.GetString("Last_name", resourceCulture); } } /// /// Looks up a localized string similar to Име. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to Името е задължително!. /// public static string Name_required { get { return ResourceManager.GetString("Name_required", resourceCulture); } } /// /// Looks up a localized string similar to Няма. /// public static string Not_entered { get { return ResourceManager.GetString("Not_entered", resourceCulture); } } /// /// Looks up a localized string similar to Потребителско име. /// public static string UserName { get { return ResourceManager.GetString("UserName", resourceCulture); } } /// /// Looks up a localized string similar to Потребителското име е задължително!. /// public static string UserName_required { get { return ResourceManager.GetString("UserName_required", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Roles/ViewModels/RolesViewModels.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Roles/ViewModels/RolesViewModels.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 E-mail Last name Name The name is required! Not entered Username The username is required! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Roles/ViewModels/RolesViewModels.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 E-mail Фамилия Име Името е задължително! Няма Потребителско име Потребителското име е задължително! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Roles/Views/RolesIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Roles.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class RolesIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal RolesIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Roles.Views.RolesIndex", typeof(RolesIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Add user. /// public static string Add_user { get { return ResourceManager.GetString("Add_user", resourceCulture); } } /// /// Looks up a localized string similar to Choose user. /// public static string Choose_user { get { return ResourceManager.GetString("Choose_user", resourceCulture); } } /// /// Looks up a localized string similar to Roles. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Roles/Views/RolesIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Roles/Views/RolesIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Добави потребител Изберете потребител Роли ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Roles/Views/RolesIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Add user Choose user Roles ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Settings/ViewModels/SettingAdministration.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Settings.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SettingAdministration { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SettingAdministration() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Settings.ViewModels.SettingAdmin" + "istration", typeof(SettingAdministration).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to The name is required!. /// public static string Name_required { get { return ResourceManager.GetString("Name_required", resourceCulture); } } /// /// Looks up a localized string similar to Value. /// public static string Value { get { return ResourceManager.GetString("Value", resourceCulture); } } /// /// Looks up a localized string similar to The value is required!. /// public static string Value_required { get { return ResourceManager.GetString("Value_required", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Settings/ViewModels/SettingAdministration.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Settings/ViewModels/SettingAdministration.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Име Името е задължително! Стойност Стойността е задължителна! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Settings/ViewModels/SettingAdministration.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Name The name is required! Value The value is required! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Settings/Views/SettingsAdministrationIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Settings.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SettingsAdministrationIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SettingsAdministrationIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Settings.Views.SettingsAdministr" + "ationIndex", typeof(SettingsAdministrationIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Settings. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Settings/Views/SettingsAdministrationIndex.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Settings/Views/SettingsAdministrationIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Настройки ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Settings/Views/SettingsAdministrationIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Settings ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Shared/Views/Partials/Partials.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Shared.Views.Partials { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Partials { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Partials() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Shared.Views.Partials.Partials", typeof(Partials).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Choose contest.... /// public static string Choose_contest { get { return ResourceManager.GetString("Choose_contest", resourceCulture); } } /// /// Looks up a localized string similar to Choose resource. /// public static string Choose_resource { get { return ResourceManager.GetString("Choose_resource", resourceCulture); } } /// /// Looks up a localized string similar to Copy. /// public static string Copy { get { return ResourceManager.GetString("Copy", resourceCulture); } } /// /// Looks up a localized string similar to Delete current questions. /// public static string Delete_current_questions { get { return ResourceManager.GetString("Delete_current_questions", resourceCulture); } } /// /// Looks up a localized string similar to Преглед. /// public static string Details { get { return ResourceManager.GetString("Details", resourceCulture); } } /// /// Looks up a localized string similar to File. /// public static string File { get { return ResourceManager.GetString("File", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to Type. /// public static string Type { get { return ResourceManager.GetString("Type", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Shared/Views/Partials/Partials.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Shared/Views/Partials/Partials.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Изберете състезание... Избери ресурс Копирай Изтрий текущите въпроси Преглед Файл Име Тип ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Shared/Views/Partials/Partials.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Choose contest... Choose resource Copy Delete current questions Преглед File Name Type ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/SubmissionTypes/ViewModels/SubmissionTypeAdministration.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.SubmissionTypes.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionTypeAdministration { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionTypeAdministration() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.SubmissionTypes.ViewModels.Submi" + "ssionTypeAdministration", typeof(SubmissionTypeAdministration).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Additional compiler arguments. /// public static string Additional_compiler_arguments { get { return ResourceManager.GetString("Additional_compiler_arguments", resourceCulture); } } /// /// Looks up a localized string similar to Allow binary files upload. /// public static string Allow_binary_files_upload { get { return ResourceManager.GetString("Allow_binary_files_upload", resourceCulture); } } /// /// Looks up a localized string similar to Allowed file extensions. /// public static string Allowed_file_extensions { get { return ResourceManager.GetString("Allowed_file_extensions", resourceCulture); } } /// /// Looks up a localized string similar to Compiler. /// public static string Compiler_type { get { return ResourceManager.GetString("Compiler_type", resourceCulture); } } /// /// Looks up a localized string similar to Description. /// public static string Description { get { return ResourceManager.GetString("Description", resourceCulture); } } /// /// Looks up a localized string similar to Execution strategy. /// public static string Execution_strategy_type { get { return ResourceManager.GetString("Execution_strategy_type", resourceCulture); } } /// /// Looks up a localized string similar to Is selected?. /// public static string Is_selected { get { return ResourceManager.GetString("Is_selected", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to Accepted length is between {2} and {1} symbols. /// public static string Name_length { get { return ResourceManager.GetString("Name_length", resourceCulture); } } /// /// Looks up a localized string similar to The name is required!. /// public static string Name_required { get { return ResourceManager.GetString("Name_required", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/SubmissionTypes/ViewModels/SubmissionTypeAdministration.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/SubmissionTypes/ViewModels/SubmissionTypeAdministration.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Допълнителни аргументи Позволени файлове Позволи качване на файлове Компилатор Описание Execution стратегия Селектирано Име Позволената дължина е между {2} и {1} символа Името е задължително! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/SubmissionTypes/ViewModels/SubmissionTypeAdministration.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Additional compiler arguments Allowed file extensions Allow binary files upload Compiler Description Execution strategy Is selected? Name Accepted length is between {2} and {1} symbols The name is required! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/SubmissionTypes/Views/SubmissionTypesIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.SubmissionTypes.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionTypesIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionTypesIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.SubmissionTypes.Views.Submission" + "TypesIndex", typeof(SubmissionTypesIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Submission types. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/SubmissionTypes/Views/SubmissionTypesIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/SubmissionTypes/Views/SubmissionTypesIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Типове решение ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/SubmissionTypes/Views/SubmissionTypesIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Submission types ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/SubmissionsControllers.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Submissions { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionsControllers { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionsControllers() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Submissions.SubmissionsControlle" + "rs", typeof(SubmissionsControllers).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Invalid file extention.. /// public static string Invalid_file_extention { get { return ResourceManager.GetString("Invalid_file_extention", resourceCulture); } } /// /// Looks up a localized string similar to Invalid submission!. /// public static string Invalid_submission_message { get { return ResourceManager.GetString("Invalid_submission_message", resourceCulture); } } /// /// Looks up a localized string similar to Problem is not for the same contest as the choosen participant.. /// public static string Invalid_task_for_participant { get { return ResourceManager.GetString("Invalid_task_for_participant", resourceCulture); } } /// /// Looks up a localized string similar to Submission retest started!. /// public static string Retest_successful { get { return ResourceManager.GetString("Retest_successful", resourceCulture); } } /// /// Looks up a localized string similar to Submission is over the size limit!. /// public static string Submission_content_length_invalid { get { return ResourceManager.GetString("Submission_content_length_invalid", resourceCulture); } } /// /// Looks up a localized string similar to Submission added successfully!. /// public static string Successful_creation_message { get { return ResourceManager.GetString("Successful_creation_message", resourceCulture); } } /// /// Looks up a localized string similar to Submission eddited successfully!. /// public static string Successful_edit_message { get { return ResourceManager.GetString("Successful_edit_message", resourceCulture); } } /// /// Looks up a localized string similar to Wrong submission type!. /// public static string Wrong_submision_type { get { return ResourceManager.GetString("Wrong_submision_type", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/SubmissionsControllers.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/SubmissionsControllers.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Невалидно разширение на файл! Невалидно решение! Задачата не е от състезанието, от което е избраният участник! Решението беше успешно пуснато за ретестване! Решението надвишава лимита за големина! Решението беше добавено успешно! Решението беше променено успешно! Невалиден тип на решението! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/SubmissionsControllers.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Invalid file extention. Invalid submission! Problem is not for the same contest as the choosen participant. Submission retest started! Submission is over the size limit! Submission added successfully! Submission eddited successfully! Wrong submission type! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/ViewModels/SubmissionAdministration.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Submissions.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionAdministration { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionAdministration() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Submissions.ViewModels.Submissio" + "nAdministration", typeof(SubmissionAdministration).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Content. /// public static string Content_as_string { get { return ResourceManager.GetString("Content_as_string", resourceCulture); } } /// /// Looks up a localized string similar to Content is required. /// public static string Content_required { get { return ResourceManager.GetString("Content_required", resourceCulture); } } /// /// Looks up a localized string similar to File submission. /// public static string File_submission { get { return ResourceManager.GetString("File_submission", resourceCulture); } } /// /// Looks up a localized string similar to Решенията не мога да бъда изчислени и изчисляващи се едновременно. /// public static string Invalid_state { get { return ResourceManager.GetString("Invalid_state", resourceCulture); } } /// /// Looks up a localized string similar to Participant. /// public static string Participant { get { return ResourceManager.GetString("Participant", resourceCulture); } } /// /// Looks up a localized string similar to The participant is required!. /// public static string Participant_required { get { return ResourceManager.GetString("Participant_required", resourceCulture); } } /// /// Looks up a localized string similar to Предстои изчисляване. /// public static string Pending { get { return ResourceManager.GetString("Pending", resourceCulture); } } /// /// Looks up a localized string similar to Points. /// public static string Points { get { return ResourceManager.GetString("Points", resourceCulture); } } /// /// Looks up a localized string similar to Problem. /// public static string Problem { get { return ResourceManager.GetString("Problem", resourceCulture); } } /// /// Looks up a localized string similar to The problem is required!. /// public static string Problem_required { get { return ResourceManager.GetString("Problem_required", resourceCulture); } } /// /// Looks up a localized string similar to Изчислен. /// public static string Processed { get { return ResourceManager.GetString("Processed", resourceCulture); } } /// /// Looks up a localized string similar to Изчислява се. /// public static string Processing { get { return ResourceManager.GetString("Processing", resourceCulture); } } /// /// Looks up a localized string similar to Статус. /// public static string Status { get { return ResourceManager.GetString("Status", resourceCulture); } } /// /// Looks up a localized string similar to Type. /// public static string Type { get { return ResourceManager.GetString("Type", resourceCulture); } } /// /// Looks up a localized string similar to The type is required!. /// public static string Type_required { get { return ResourceManager.GetString("Type_required", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/ViewModels/SubmissionAdministration.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/ViewModels/SubmissionAdministration.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Съдържание Решението е задължително! Файл с решение Решенията не мога да бъда изчислени и изчисляващи се едновременно Потребител Потребителят е задължителен! Предстои изчисляване Точки Задача Задачата е задължителна! Изчислен Изчислява се Статус Тип Типът е задължителен! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/ViewModels/SubmissionAdministration.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Content Content is required File submission Решенията не мога да бъда изчислени и изчисляващи се едновременно Participant The participant is required! Предстои изчисляване Points Problem The problem is required! Изчислен Изчислява се Статус Type The type is required! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/EditorTemplates/SubmissionsEditorTemplates.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Submissions.Views.EditorTemplates { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionsEditorTemplates { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionsEditorTemplates() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Submissions.Views.EditorTemplate" + "s.SubmissionsEditorTemplates", typeof(SubmissionsEditorTemplates).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Choose file.... /// public static string Choose_file { get { return ResourceManager.GetString("Choose_file", resourceCulture); } } /// /// Looks up a localized string similar to Choose participant. /// public static string Choose_participant { get { return ResourceManager.GetString("Choose_participant", resourceCulture); } } /// /// Looks up a localized string similar to Choose problem. /// public static string Choose_problem { get { return ResourceManager.GetString("Choose_problem", resourceCulture); } } /// /// Looks up a localized string similar to Choose submission type. /// public static string Choose_submission_type { get { return ResourceManager.GetString("Choose_submission_type", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/EditorTemplates/SubmissionsEditorTemplates.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/EditorTemplates/SubmissionsEditorTemplates.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Избери файл.. Изберете участник Изберете задача Изберете тип събмисия ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/EditorTemplates/SubmissionsEditorTemplates.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Choose file... Choose participant Choose problem Choose submission type ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/Partials/SubmissionForm.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Submissions.Views.Partials { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionForm { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionForm() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Submissions.Views.Partials.Submi" + "ssionForm", typeof(SubmissionForm).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Save. /// public static string Save { get { return ResourceManager.GetString("Save", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/Partials/SubmissionForm.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/Partials/SubmissionForm.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Запази ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/Partials/SubmissionForm.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Save ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/Partials/SubmissionsGrid.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Submissions.Views.Partials { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionsGrid { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionsGrid() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Submissions.Views.Partials.Submi" + "ssionsGrid", typeof(SubmissionsGrid).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Details. /// public static string Details { get { return ResourceManager.GetString("Details", resourceCulture); } } /// /// Looks up a localized string similar to Retest. /// public static string Retest { get { return ResourceManager.GetString("Retest", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/Partials/SubmissionsGrid.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/Partials/SubmissionsGrid.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Преглед Ретест ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/Partials/SubmissionsGrid.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Details Retest ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsCreate.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Submissions.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionsCreate { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionsCreate() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Submissions.Views.SubmissionsCre" + "ate", typeof(SubmissionsCreate).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Create submission. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsCreate.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsCreate.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Създай решение ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsCreate.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Create submission ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsDelete.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Submissions.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionsDelete { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionsDelete() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Submissions.Views.SubmissionsDel" + "ete", typeof(SubmissionsDelete).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Delete. /// public static string Delete { get { return ResourceManager.GetString("Delete", resourceCulture); } } /// /// Looks up a localized string similar to Delete submission from. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsDelete.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsDelete.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Изтрий Изтрий решение на ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsDelete.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Delete Delete submission from ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Submissions.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionsIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionsIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Submissions.Views.SubmissionsInd" + "ex", typeof(SubmissionsIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Choose or enter contest. /// public static string Choose_or_enter_contest { get { return ResourceManager.GetString("Choose_or_enter_contest", resourceCulture); } } /// /// Looks up a localized string similar to Clear. /// public static string Clear { get { return ResourceManager.GetString("Clear", resourceCulture); } } /// /// Looks up a localized string similar to Submissions. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Изберете или напишете състезание Изчистване Решения ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Choose or enter contest Clear Submissions ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsUpdate.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Submissions.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionsUpdate { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionsUpdate() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Submissions.Views.SubmissionsUpd" + "ate", typeof(SubmissionsUpdate).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Change submission. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsUpdate.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsUpdate.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Промени решение ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Submissions/Views/SubmissionsUpdate.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Change submission ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/TestsControllers.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/TestsControllers.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Невалидна задача Невалиден тест Невалидни тестове Файлът трябва да бъде .ZIP файл Файлът не може да бъде празен Задачата не съществува Тестовете са добавени към задачата Тестовете бяха изтрити успешно Тестът беше добавен успешно. Тестът беше изтрит успешно. Тестът беше променен успешно. Zip файлът е повреден ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/TestsControllers.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Tests { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class TestsControllers { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TestsControllers() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Tests.TestsControllers", typeof(TestsControllers).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Invalid problem. /// public static string Invalid_problem { get { return ResourceManager.GetString("Invalid_problem", resourceCulture); } } /// /// Looks up a localized string similar to Invalid test. /// public static string Invalid_test { get { return ResourceManager.GetString("Invalid_test", resourceCulture); } } /// /// Looks up a localized string similar to Invalid tests. /// public static string Invalid_tests { get { return ResourceManager.GetString("Invalid_tests", resourceCulture); } } /// /// Looks up a localized string similar to File must be a zip. /// public static string Must_be_zip { get { return ResourceManager.GetString("Must_be_zip", resourceCulture); } } /// /// Looks up a localized string similar to File must not be empty. /// public static string No_empty_file { get { return ResourceManager.GetString("No_empty_file", resourceCulture); } } /// /// Looks up a localized string similar to Problem does not exist. /// public static string Problem_does_not_exist { get { return ResourceManager.GetString("Problem_does_not_exist", resourceCulture); } } /// /// Looks up a localized string similar to Test added successfully.. /// public static string Test_added_successfully { get { return ResourceManager.GetString("Test_added_successfully", resourceCulture); } } /// /// Looks up a localized string similar to Test deleted successfully.. /// public static string Test_deleted_successfully { get { return ResourceManager.GetString("Test_deleted_successfully", resourceCulture); } } /// /// Looks up a localized string similar to Test edited successfully. /// public static string Test_edited_successfully { get { return ResourceManager.GetString("Test_edited_successfully", resourceCulture); } } /// /// Looks up a localized string similar to Tests addted to problem. /// public static string Tests_addted_to_problem { get { return ResourceManager.GetString("Tests_addted_to_problem", resourceCulture); } } /// /// Looks up a localized string similar to Tests deleted successfully.. /// public static string Tests_deleted_successfully { get { return ResourceManager.GetString("Tests_deleted_successfully", resourceCulture); } } /// /// Looks up a localized string similar to Zip is damaged. /// public static string Zip_damaged { get { return ResourceManager.GetString("Zip_damaged", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/TestsControllers.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Invalid problem Invalid test Invalid tests File must be a zip File must not be empty Problem does not exist Tests addted to problem Tests deleted successfully. Test added successfully. Test deleted successfully. Test edited successfully Zip is damaged ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/ViewModels/TestAdministration.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Tests.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class TestAdministration { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TestAdministration() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Tests.ViewModels.TestAdministrat" + "ion", typeof(TestAdministration).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Contest. /// public static string Contest { get { return ResourceManager.GetString("Contest", resourceCulture); } } /// /// Looks up a localized string similar to Input. /// public static string Input { get { return ResourceManager.GetString("Input", resourceCulture); } } /// /// Looks up a localized string similar to The input is required!. /// public static string Input_required { get { return ResourceManager.GetString("Input_required", resourceCulture); } } /// /// Looks up a localized string similar to Order. /// public static string Order { get { return ResourceManager.GetString("Order", resourceCulture); } } /// /// Looks up a localized string similar to The order is required!. /// public static string Order_required { get { return ResourceManager.GetString("Order_required", resourceCulture); } } /// /// Looks up a localized string similar to Output. /// public static string Output { get { return ResourceManager.GetString("Output", resourceCulture); } } /// /// Looks up a localized string similar to The output is required!. /// public static string Output_required { get { return ResourceManager.GetString("Output_required", resourceCulture); } } /// /// Looks up a localized string similar to Practice. /// public static string Practice { get { return ResourceManager.GetString("Practice", resourceCulture); } } /// /// Looks up a localized string similar to Problem Id. /// public static string Problem_id { get { return ResourceManager.GetString("Problem_id", resourceCulture); } } /// /// Looks up a localized string similar to Problem. /// public static string Problem_name { get { return ResourceManager.GetString("Problem_name", resourceCulture); } } /// /// Looks up a localized string similar to Test runs count. /// public static string Test_runs_count { get { return ResourceManager.GetString("Test_runs_count", resourceCulture); } } /// /// Looks up a localized string similar to Trial test name. /// public static string Trial_test_name { get { return ResourceManager.GetString("Trial_test_name", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/ViewModels/TestAdministration.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/ViewModels/TestAdministration.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Състезателен Input The input is required! Подредба Подредбата е задължителна! Output Изхода е задължителен! Пробен ID на задача Problem Брой изпълнения Пробен тест ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/ViewModels/TestAdministration.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Contest Input The input is required! Order The order is required! Output The output is required! Practice Problem Id Problem Test runs count Trial test name ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsCreate.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Tests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class TestsCreate { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TestsCreate() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Tests.Views.TestsCreate", typeof(TestsCreate).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Create. /// public static string Create { get { return ResourceManager.GetString("Create", resourceCulture); } } /// /// Looks up a localized string similar to Test creation. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsCreate.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsCreate.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Създай Създаване на тест ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsCreate.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Create Test creation ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDelete.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Tests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class TestsDelete { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TestsDelete() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Tests.Views.TestsDelete", typeof(TestsDelete).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Delete. /// public static string Delete { get { return ResourceManager.GetString("Delete", resourceCulture); } } /// /// Looks up a localized string similar to Delete test. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } /// /// Looks up a localized string similar to test. /// public static string Test { get { return ResourceManager.GetString("Test", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDelete.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDelete.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Изтрий Изтриване на тест тест ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDelete.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Delete Delete test test ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDeleteAll.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Tests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class TestsDeleteAll { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TestsDeleteAll() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Tests.Views.TestsDeleteAll", typeof(TestsDeleteAll).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Confirm. /// public static string Confirm { get { return ResourceManager.GetString("Confirm", resourceCulture); } } /// /// Looks up a localized string similar to Are you sure you want to delete all tests for. /// public static string Delete_confirmation { get { return ResourceManager.GetString("Delete_confirmation", resourceCulture); } } /// /// Looks up a localized string similar to Delete all tests. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDeleteAll.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDeleteAll.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Потвърди Сигурни ли сте, че искате да изтриете всички тестове на Изтриване на всички тестове ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDeleteAll.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Confirm Are you sure you want to delete all tests for Delete all tests ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDetails.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDetails.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Промени Детайли Вижте още Покажи изпълненията ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDetails.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Tests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class TestsDetails { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TestsDetails() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Tests.Views.TestsDetails", typeof(TestsDetails).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Edit { get { return ResourceManager.GetString("Edit", resourceCulture); } } /// /// Looks up a localized string similar to Details. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } /// /// Looks up a localized string similar to See more. /// public static string See_more { get { return ResourceManager.GetString("See_more", resourceCulture); } } /// /// Looks up a localized string similar to Show executions. /// public static string Show_executions { get { return ResourceManager.GetString("Show_executions", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsDetails.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Edit Details See more Show executions ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsEdit.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Tests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class TestsEdit { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TestsEdit() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Tests.Views.TestsEdit", typeof(TestsEdit).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Back. /// public static string Back { get { return ResourceManager.GetString("Back", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Edit { get { return ResourceManager.GetString("Edit", resourceCulture); } } /// /// Looks up a localized string similar to Edit test. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsEdit.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsEdit.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Назад Промени Промяна на тест ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsEdit.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Back Edit Edit test ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Tests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class TestsIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TestsIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Tests.Views.TestsIndex", typeof(TestsIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Category:. /// public static string Category_label { get { return ResourceManager.GetString("Category_label", resourceCulture); } } /// /// Looks up a localized string similar to Choose category.... /// public static string Choose_category { get { return ResourceManager.GetString("Choose_category", resourceCulture); } } /// /// Looks up a localized string similar to Choose contest.... /// public static string Choose_contest { get { return ResourceManager.GetString("Choose_contest", resourceCulture); } } /// /// Looks up a localized string similar to Choose problem.... /// public static string Choose_problem { get { return ResourceManager.GetString("Choose_problem", resourceCulture); } } /// /// Looks up a localized string similar to Contest:. /// public static string Contest_label { get { return ResourceManager.GetString("Contest_label", resourceCulture); } } /// /// Looks up a localized string similar to Delete old tests. /// public static string Delete_old_tests { get { return ResourceManager.GetString("Delete_old_tests", resourceCulture); } } /// /// Looks up a localized string similar to Enter problem.... /// public static string Enter_problem { get { return ResourceManager.GetString("Enter_problem", resourceCulture); } } /// /// Looks up a localized string similar to Import. /// public static string Import { get { return ResourceManager.GetString("Import", resourceCulture); } } /// /// Looks up a localized string similar to Test files. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } /// /// Looks up a localized string similar to Problem:. /// public static string Problem_label { get { return ResourceManager.GetString("Problem_label", resourceCulture); } } /// /// Looks up a localized string similar to Retest problem. /// public static string Retest_problem { get { return ResourceManager.GetString("Retest_problem", resourceCulture); } } /// /// Looks up a localized string similar to Search by problem:. /// public static string Search_by_problem { get { return ResourceManager.GetString("Search_by_problem", resourceCulture); } } /// /// Looks up a localized string similar to Tests loading.... /// public static string Tests_loading { get { return ResourceManager.GetString("Tests_loading", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Категория: Избери категория... Избери състезание... Избери проблем... Състезание: Изтриване на стари тестове Въведи задача... Импортиране Тестови файлове Задача: Ретестване на задачата Търсене по задача: Тестовете се зареждат... ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Tests/Views/TestsIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Category: Choose category... Choose contest... Choose problem... Contest: Delete old tests Enter problem... Import Test files Problem: Retest problem Search by problem: Tests loading... ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Users/ViewModels/UserProfileAdministration.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Users.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class UserProfileAdministration { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal UserProfileAdministration() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Users.ViewModels.UserProfileAdmi" + "nistration", typeof(UserProfileAdministration).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Age. /// public static string Age { get { return ResourceManager.GetString("Age", resourceCulture); } } /// /// Looks up a localized string similar to City. /// public static string City { get { return ResourceManager.GetString("City", resourceCulture); } } /// /// Looks up a localized string similar to The entered city is too long. /// public static string City_length { get { return ResourceManager.GetString("City_length", resourceCulture); } } /// /// Looks up a localized string similar to Company. /// public static string Company { get { return ResourceManager.GetString("Company", resourceCulture); } } /// /// Looks up a localized string similar to The entered company name is too long. /// public static string Company_length { get { return ResourceManager.GetString("Company_length", resourceCulture); } } /// /// Looks up a localized string similar to Date of birth. /// public static string Date_of_birth { get { return ResourceManager.GetString("Date_of_birth", resourceCulture); } } /// /// Looks up a localized string similar to Educational institution. /// public static string Educational_institution { get { return ResourceManager.GetString("Educational_institution", resourceCulture); } } /// /// Looks up a localized string similar to The educational institution name is too long. /// public static string Educational_institution_length { get { return ResourceManager.GetString("Educational_institution_length", resourceCulture); } } /// /// Looks up a localized string similar to Faculty number. /// public static string Faculty_number { get { return ResourceManager.GetString("Faculty_number", resourceCulture); } } /// /// Looks up a localized string similar to The entered faculty number is too long. /// public static string Faculty_number_length { get { return ResourceManager.GetString("Faculty_number_length", resourceCulture); } } /// /// Looks up a localized string similar to First name. /// public static string First_name { get { return ResourceManager.GetString("First_name", resourceCulture); } } /// /// Looks up a localized string similar to The entered name is too long. /// public static string First_name_length { get { return ResourceManager.GetString("First_name_length", resourceCulture); } } /// /// Looks up a localized string similar to Form the old system?. /// public static string Is_ghoust_user { get { return ResourceManager.GetString("Is_ghoust_user", resourceCulture); } } /// /// Looks up a localized string similar to Job title. /// public static string Job_title { get { return ResourceManager.GetString("Job_title", resourceCulture); } } /// /// Looks up a localized string similar to The entered job title name is too long. /// public static string Job_title_length { get { return ResourceManager.GetString("Job_title_length", resourceCulture); } } /// /// Looks up a localized string similar to Last name. /// public static string Last_name { get { return ResourceManager.GetString("Last_name", resourceCulture); } } /// /// Looks up a localized string similar to The entered last name is too long. /// public static string Last_name_length { get { return ResourceManager.GetString("Last_name_length", resourceCulture); } } /// /// Looks up a localized string similar to Invalid email address. /// public static string Mail_invalid { get { return ResourceManager.GetString("Mail_invalid", resourceCulture); } } /// /// Looks up a localized string similar to The email is too long!. /// public static string Mail_length { get { return ResourceManager.GetString("Mail_length", resourceCulture); } } /// /// Looks up a localized string similar to Email is required!. /// public static string Mail_required { get { return ResourceManager.GetString("Mail_required", resourceCulture); } } /// /// Looks up a localized string similar to No information. /// public static string Null_display_text { get { return ResourceManager.GetString("Null_display_text", resourceCulture); } } /// /// Looks up a localized string similar to UserName. /// public static string UserName { get { return ResourceManager.GetString("UserName", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Users/ViewModels/UserProfileAdministration.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Users/ViewModels/UserProfileAdministration.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Възраст Град Въведеният град е твърде дълъг Месторабота Въведената месторабота е твърде дълга Дата на раждане Образование Въведеното образование е твърде дълго Факултетен номер Въведеният факултетен номер е твърде дълъг Име Въведеното име е твърде дълго От старата система? Позиция Въведената позиция е твърде дълга Фамилия Въведената фамилия е твърде дълга Невалиден имейл адрес Въведеният e-mail е твърде дълъг Email-а е задължителен Няма информация Потребителско име ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Users/ViewModels/UserProfileAdministration.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Age City The entered city is too long Company The entered company name is too long Date of birth Educational institution The educational institution name is too long Faculty number The entered faculty number is too long First name The entered name is too long Form the old system? Job title The entered job title name is too long Last name The entered last name is too long Invalid email address The email is too long! Email is required! No information UserName ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Users/Views/UsersIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Administration.Users.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class UsersIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal UsersIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Administration.Users.Views.UsersIndex", typeof(UsersIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Users. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Users/Views/UsersIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Users/Views/UsersIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Потребители ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Administration/Users/Views/UsersIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Users ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ContestsGeneral.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestsGeneral { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestsGeneral() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.ContestsGeneral", typeof(ContestsGeneral).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to This submission type does not allow sending binary files. /// public static string Binary_files_not_allowed { get { return ResourceManager.GetString("Binary_files_not_allowed", resourceCulture); } } /// /// Looks up a localized string similar to This category does not exist!. /// public static string Category_not_found { get { return ResourceManager.GetString("Category_not_found", resourceCulture); } } /// /// Looks up a localized string similar to This contest cannot be competed!. /// public static string Contest_cannot_be_competed { get { return ResourceManager.GetString("Contest_cannot_be_competed", resourceCulture); } } /// /// Looks up a localized string similar to This contest cannot be practiced!. /// public static string Contest_cannot_be_practiced { get { return ResourceManager.GetString("Contest_cannot_be_practiced", resourceCulture); } } /// /// Looks up a localized string similar to Invalid contest id was provided!. /// public static string Contest_not_found { get { return ResourceManager.GetString("Contest_not_found", resourceCulture); } } /// /// Looks up a localized string similar to This contest results are not available!. /// public static string Contest_results_not_available { get { return ResourceManager.GetString("Contest_results_not_available", resourceCulture); } } /// /// Looks up a localized string similar to Invalid file extension. /// public static string Invalid_extention { get { return ResourceManager.GetString("Invalid_extention", resourceCulture); } } /// /// Looks up a localized string similar to Invalid request!. /// public static string Invalid_request { get { return ResourceManager.GetString("Invalid_request", resourceCulture); } } /// /// Looks up a localized string similar to Invalid selection. /// public static string Invalid_selection { get { return ResourceManager.GetString("Invalid_selection", resourceCulture); } } /// /// Looks up a localized string similar to Main categories. /// public static string Main_categories { get { return ResourceManager.GetString("Main_categories", resourceCulture); } } /// /// Looks up a localized string similar to The problem was not found!. /// public static string Problem_not_found { get { return ResourceManager.GetString("Problem_not_found", resourceCulture); } } /// /// Looks up a localized string similar to You cannot view the results for this problem!. /// public static string Problem_results_not_available { get { return ResourceManager.GetString("Problem_results_not_available", resourceCulture); } } /// /// Looks up a localized string similar to This resource cannot be downloaded!. /// public static string Resource_cannot_be_downloaded { get { return ResourceManager.GetString("Resource_cannot_be_downloaded", resourceCulture); } } /// /// Looks up a localized string similar to Solution uploaded.. /// public static string Solution_uploaded { get { return ResourceManager.GetString("Solution_uploaded", resourceCulture); } } /// /// Looks up a localized string similar to Invalid submission requested!. /// public static string Submission_not_found { get { return ResourceManager.GetString("Submission_not_found", resourceCulture); } } /// /// Looks up a localized string similar to This submission was not made by you!. /// public static string Submission_not_made_by_user { get { return ResourceManager.GetString("Submission_not_made_by_user", resourceCulture); } } /// /// Looks up a localized string similar to The submitted code is too long!. /// public static string Submission_too_long { get { return ResourceManager.GetString("Submission_too_long", resourceCulture); } } /// /// Looks up a localized string similar to Wrong submission type!. /// public static string Submission_type_not_found { get { return ResourceManager.GetString("Submission_type_not_found", resourceCulture); } } /// /// Looks up a localized string similar to Submission was sent too soon!. /// public static string Submission_was_sent_too_soon { get { return ResourceManager.GetString("Submission_was_sent_too_soon", resourceCulture); } } /// /// Looks up a localized string similar to Please upload file.. /// public static string Upload_file { get { return ResourceManager.GetString("Upload_file", resourceCulture); } } /// /// Looks up a localized string similar to You are not registered for this exam!. /// public static string User_is_not_registered_for_exam { get { return ResourceManager.GetString("User_is_not_registered_for_exam", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ContestsGeneral.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ContestsGeneral.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Не е позволено качването на бинарни файлове. Такава категория не съществува! Това състезание не е отворено за участие! Това състезание не може да се практикува! Невалидно състезание! Резултатите за това състезание не са достъпни! Невалидно файлово разширение Невалидни данни! Невалидна селекция Главни категории Не може да бъде намерена задачата! Не може да видите резултата за тази задача! Този ресурс не може да бъде изтеглен! Решението е качено. Не съществува такова решение! Това решение не е ваше! Изпратеният код е прекалено дълъг! Грешен тип за оценяване на решението! Решението е изпратено прекалено скоро! Моля качете файл. Не сте регистрирани за това състезание! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ContestsGeneral.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 This submission type does not allow sending binary files This category does not exist! This contest cannot be competed! This contest cannot be practiced! Invalid contest id was provided! This contest results are not available! Invalid file extension Invalid request! Invalid selection Main categories The problem was not found! You cannot view the results for this problem! This resource cannot be downloaded! Solution uploaded. Invalid submission requested! This submission was not made by you! The submitted code is too long! Wrong submission type! Submission was sent too soon! Please upload file. You are not registered for this exam! ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Shared/ContestsAllContestSubmissionsByUser.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Shared { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestsAllContestSubmissionsByUser { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestsAllContestSubmissionsByUser() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Shared.ContestsAllContestSubmissionsBy" + "User", typeof(ContestsAllContestSubmissionsByUser).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Compete. /// public static string Compete { get { return ResourceManager.GetString("Compete", resourceCulture); } } /// /// Looks up a localized string similar to Compile time error. /// public static string Compile_time_error { get { return ResourceManager.GetString("Compile_time_error", resourceCulture); } } /// /// Looks up a localized string similar to Memory. /// public static string Memory { get { return ResourceManager.GetString("Memory", resourceCulture); } } /// /// Looks up a localized string similar to Not processed yet. /// public static string Not_processed { get { return ResourceManager.GetString("Not_processed", resourceCulture); } } /// /// Looks up a localized string similar to Practice. /// public static string Practice { get { return ResourceManager.GetString("Practice", resourceCulture); } } /// /// Looks up a localized string similar to Time. /// public static string Time { get { return ResourceManager.GetString("Time", resourceCulture); } } /// /// Looks up a localized string similar to Your submissions. /// public static string User_submission { get { return ResourceManager.GetString("User_submission", resourceCulture); } } /// /// Looks up a localized string similar to View. /// public static string View { get { return ResourceManager.GetString("View", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Shared/ContestsAllContestSubmissionsByUser.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Shared/ContestsAllContestSubmissionsByUser.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Състезание Грешка при компилация Памет Не е обработена Практика Време Твоите решения Детайли ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Shared/ContestsAllContestSubmissionsByUser.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Compete Compile time error Memory Not processed yet Practice Time Your submissions View ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Shared/ContestsProblemPartial.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Shared { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestsProblemPartial { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestsProblemPartial() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Shared.ContestsProblemPartial", typeof(ContestsProblemPartial).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Allowed memory. /// public static string Allowed_memory { get { return ResourceManager.GetString("Allowed_memory", resourceCulture); } } /// /// Looks up a localized string similar to Allowed working time. /// public static string Allowed_working_time { get { return ResourceManager.GetString("Allowed_working_time", resourceCulture); } } /// /// Looks up a localized string similar to - the system does not make difference between small and capital letters when comparing the sent code result with the expected output symbol by symbol. /// public static string Case_insensitive_checker_description { get { return ResourceManager.GetString("Case_insensitive_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Change. /// public static string Change_admin_button { get { return ResourceManager.GetString("Change_admin_button", resourceCulture); } } /// /// Looks up a localized string similar to Checker types:. /// public static string Checker_types { get { return ResourceManager.GetString("Checker_types", resourceCulture); } } /// /// Looks up a localized string similar to Compile time error. /// public static string Compile_time_error { get { return ResourceManager.GetString("Compile_time_error", resourceCulture); } } /// /// Looks up a localized string similar to Compiled successfully. /// public static string Compiled_successfully { get { return ResourceManager.GetString("Compiled_successfully", resourceCulture); } } /// /// Looks up a localized string similar to Delete. /// public static string Delete_admin_button { get { return ResourceManager.GetString("Delete_admin_button", resourceCulture); } } /// /// Looks up a localized string similar to Details. /// public static string Details { get { return ResourceManager.GetString("Details", resourceCulture); } } /// /// Looks up a localized string similar to - the system compares the sent code result with the expected output symbol by symbol. /// public static string Exact_checker_description { get { return ResourceManager.GetString("Exact_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Memory. /// public static string Memory { get { return ResourceManager.GetString("Memory", resourceCulture); } } /// /// Looks up a localized string similar to Not processed yet. /// public static string Not_processed { get { return ResourceManager.GetString("Not_processed", resourceCulture); } } /// /// Looks up a localized string similar to Participants. /// public static string Participants_admin_button { get { return ResourceManager.GetString("Participants_admin_button", resourceCulture); } } /// /// Looks up a localized string similar to - only for tasks with end result decimal number - the system compares only the first N digits after the decimal point. /// public static string Precision_checker_description { get { return ResourceManager.GetString("Precision_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Problem results. /// public static string Problem_results { get { return ResourceManager.GetString("Problem_results", resourceCulture); } } /// /// Looks up a localized string similar to - the system sorts all lines in the sent code result and then compares symbol by symbol with the expected output. /// public static string Sort_checker_description { get { return ResourceManager.GetString("Sort_checker_description", resourceCulture); } } /// /// Looks up a localized string similar to Submissions. /// public static string Submissions { get { return ResourceManager.GetString("Submissions", resourceCulture); } } /// /// Looks up a localized string similar to Submit. /// public static string Submit { get { return ResourceManager.GetString("Submit", resourceCulture); } } /// /// Looks up a localized string similar to Tests. /// public static string Tests_admin_button { get { return ResourceManager.GetString("Tests_admin_button", resourceCulture); } } /// /// Looks up a localized string similar to Time. /// public static string Time { get { return ResourceManager.GetString("Time", resourceCulture); } } /// /// Looks up a localized string similar to Time and memory used. /// public static string Time_and_memory { get { return ResourceManager.GetString("Time_and_memory", resourceCulture); } } /// /// Looks up a localized string similar to - the system trims the whitespace before and after the sent code result and then compares symbol by symbol with the expected output. /// public static string Trim_checker_description { get { return ResourceManager.GetString("Trim_checker_description", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Shared/ContestsProblemPartial.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Shared/ContestsProblemPartial.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Позволена памет Позволено време Успешна компилация Грешка при компилация Детайли Още не е обработено Резултати Изпратени решения Изпрати Използвано време и памет Памет Време - системата не отчита разлика между главна и малка буква като сравнява символ по символ; Типове чекери: - системата проверява резултатите на състезателя с очаквания изход символ по символ; - само за задачи с резултати съдържащи числа с плаваща запетая на всеки нов ред - системата се съобразява само с първите N на брой цифри след плаващата запетая. - системата първо сортира по линии резултатите на състезателя и очаквания изход и след това ги сравнява символ по символ; - системата първо премахва празните интервали в началото и края на резултатите на състезателя и след това ги сравнява с очаквания изход символ по символ; Промяна Изтриване Участници Тестове ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Shared/ContestsProblemPartial.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Allowed memory Allowed working time Compiled successfully Compile time error Details Not processed yet Problem results Submissions Submit Time and memory used Memory Time - the system does not make difference between small and capital letters when comparing the sent code result with the expected output symbol by symbol Checker types: - the system compares the sent code result with the expected output symbol by symbol - only for tasks with end result decimal number - the system compares only the first N digits after the decimal point - the system sorts all lines in the sent code result and then compares symbol by symbol with the expected output - the system trims the whitespace before and after the sent code result and then compares symbol by symbol with the expected output Change Delete Participants Tests ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/ContestsViewModels.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestsViewModels { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestsViewModels() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.ViewModels.ContestsViewModels", typeof(ContestsViewModels).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Select an answer from the dropdown menu. /// public static string Answer_required { get { return ResourceManager.GetString("Answer_required", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string Name { get { return ResourceManager.GetString("Name", resourceCulture); } } /// /// Looks up a localized string similar to Password. /// public static string Password { get { return ResourceManager.GetString("Password", resourceCulture); } } /// /// Looks up a localized string similar to Question. /// public static string Question { get { return ResourceManager.GetString("Question", resourceCulture); } } /// /// Looks up a localized string similar to Question with id {0} was not answered.. /// public static string Question_not_answered { get { return ResourceManager.GetString("Question_not_answered", resourceCulture); } } /// /// Looks up a localized string similar to Question with id {0} is not in the correct format.. /// public static string Question_not_answered_correctly { get { return ResourceManager.GetString("Question_not_answered_correctly", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/ContestsViewModels.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/ContestsViewModels.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Изберете отговор от падащото меню Име Парола Въпрос Въпрос с id {0} не е отговорен. Въпрос с id {0} не е отговорен правилно. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/ContestsViewModels.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Select an answer from the dropdown menu Name Password Question Question with id {0} was not answered. Question with id {0} is not in the correct format. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/ProblemsViewModels.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProblemsViewModels { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProblemsViewModels() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.ViewModels.ProblemsViewModels", typeof(ProblemsViewModels).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Participant. /// public static string Participant { get { return ResourceManager.GetString("Participant", resourceCulture); } } /// /// Looks up a localized string similar to Result. /// public static string Result { get { return ResourceManager.GetString("Result", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/ProblemsViewModels.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/ProblemsViewModels.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Участник Резултат ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/ProblemsViewModels.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Participant Result ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/SubmissionsViewModels.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionsViewModels { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionsViewModels() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.ViewModels.SubmissionsViewModels", typeof(SubmissionsViewModels).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Compiled successfully. /// public static string Is_compiled_successfully { get { return ResourceManager.GetString("Is_compiled_successfully", resourceCulture); } } /// /// Looks up a localized string similar to Max memory. /// public static string Maximum_memory { get { return ResourceManager.GetString("Maximum_memory", resourceCulture); } } /// /// Looks up a localized string similar to Max time. /// public static string Maximum_time { get { return ResourceManager.GetString("Maximum_time", resourceCulture); } } /// /// Looks up a localized string similar to Points. /// public static string Points { get { return ResourceManager.GetString("Points", resourceCulture); } } /// /// Looks up a localized string similar to Problem. /// public static string Problem { get { return ResourceManager.GetString("Problem", resourceCulture); } } /// /// Looks up a localized string similar to Submission date. /// public static string Submission_date { get { return ResourceManager.GetString("Submission_date", resourceCulture); } } /// /// Looks up a localized string similar to Time and memory. /// public static string Time_and_memory { get { return ResourceManager.GetString("Time_and_memory", resourceCulture); } } /// /// Looks up a localized string similar to Type. /// public static string Type { get { return ResourceManager.GetString("Type", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/SubmissionsViewModels.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/SubmissionsViewModels.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Успешна компилация Макс. памет Макс. време Точки Задача Изпратено на Време и памет Тип ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/ViewModels/SubmissionsViewModels.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Compiled successfully Max memory Max time Points Problem Submission date Time and memory Type ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Compete/CompeteIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class CompeteIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal CompeteIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Views.Compete.CompeteIndex", typeof(CompeteIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Add task. /// public static string Add_task { get { return ResourceManager.GetString("Add_task", resourceCulture); } } /// /// Looks up a localized string similar to No tasks. /// public static string No_tasks { get { return ResourceManager.GetString("No_tasks", resourceCulture); } } /// /// Looks up a localized string similar to There are no tasks for this contest, yet. /// public static string No_tasks_added_yet { get { return ResourceManager.GetString("No_tasks_added_yet", resourceCulture); } } /// /// Looks up a localized string similar to Practice end time. /// public static string Practice_end_time { get { return ResourceManager.GetString("Practice_end_time", resourceCulture); } } /// /// Looks up a localized string similar to Remaining time {0} h, {1} m and {2} s. /// public static string Remaining_time_format { get { return ResourceManager.GetString("Remaining_time_format", resourceCulture); } } /// /// Looks up a localized string similar to Results. /// public static string Results { get { return ResourceManager.GetString("Results", resourceCulture); } } /// /// Looks up a localized string similar to Submit a solution. /// public static string Submit_solution { get { return ResourceManager.GetString("Submit_solution", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Compete/CompeteIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Compete/CompeteIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Добави задача Няма задачи Все още няма добавени задачи към това състезание Край на практиката Оставащо време {0} ч, {1} м и {2} сек Резултати Изпрати решение ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Compete/CompeteIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Add task No tasks There are no tasks for this contest, yet Practice end time Remaining time {0} h, {1} m and {2} s Results Submit a solution ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Compete/CompeteRegister.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.34011 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class CompeteRegister { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal CompeteRegister() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Views.Compete.CompeteRegister", typeof(CompeteRegister).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Password is empty. /// public static string Empty_Password { get { return ResourceManager.GetString("Empty_Password", resourceCulture); } } /// /// Looks up a localized string similar to Incorrect password. /// public static string Incorrect_password { get { return ResourceManager.GetString("Incorrect_password", resourceCulture); } } /// /// Looks up a localized string similar to Please answer all questions. /// public static string Not_all_questions_answered { get { return ResourceManager.GetString("Not_all_questions_answered", resourceCulture); } } /// /// Looks up a localized string similar to Select an answer. /// public static string Select_dropdown_answer { get { return ResourceManager.GetString("Select_dropdown_answer", resourceCulture); } } /// /// Looks up a localized string similar to Submit. /// public static string Submit { get { return ResourceManager.GetString("Submit", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Compete/CompeteRegister.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Compete/CompeteRegister.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Паролата не може да бъде празна Грешна парола Моля, отговорете на всички въпроси Изберете отговор Изпрати ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Compete/CompeteRegister.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Password is empty Incorrect password Please answer all questions Select an answer Submit ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Contests/ContestsDetails.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ContestsDetails { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestsDetails() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Views.Contests.ContestsDetails", typeof(ContestsDetails).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Allowed languages. /// public static string Allowed_languages { get { return ResourceManager.GetString("Allowed_languages", resourceCulture); } } /// /// Looks up a localized string similar to Compete. /// public static string Compete { get { return ResourceManager.GetString("Compete", resourceCulture); } } /// /// Looks up a localized string similar to The contest is active until. /// public static string Competition_active_until { get { return ResourceManager.GetString("Competition_active_until", resourceCulture); } } /// /// Looks up a localized string similar to Contest details. /// public static string Contest_details { get { return ResourceManager.GetString("Contest_details", resourceCulture); } } /// /// Looks up a localized string similar to Contest participants. /// public static string Contest_participants { get { return ResourceManager.GetString("Contest_participants", resourceCulture); } } /// /// Looks up a localized string similar to Contests. /// public static string Contests { get { return ResourceManager.GetString("Contests", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Edit { get { return ResourceManager.GetString("Edit", resourceCulture); } } /// /// Looks up a localized string similar to Full results. /// public static string Full_results { get { return ResourceManager.GetString("Full_results", resourceCulture); } } /// /// Looks up a localized string similar to Home. /// public static string Home { get { return ResourceManager.GetString("Home", resourceCulture); } } /// /// Looks up a localized string similar to There is no description for the selected contest.. /// public static string No_contest_description { get { return ResourceManager.GetString("No_contest_description", resourceCulture); } } /// /// Looks up a localized string similar to Practice. /// public static string Practice { get { return ResourceManager.GetString("Practice", resourceCulture); } } /// /// Looks up a localized string similar to Practicing is allowed until. /// public static string Practice_active_until { get { return ResourceManager.GetString("Practice_active_until", resourceCulture); } } /// /// Looks up a localized string similar to Practice participants. /// public static string Practice_participants { get { return ResourceManager.GetString("Practice_participants", resourceCulture); } } /// /// Looks up a localized string similar to Problems. /// public static string Problems { get { return ResourceManager.GetString("Problems", resourceCulture); } } /// /// Looks up a localized string similar to The problems for this contest are not public.. /// public static string Problems_are_not_public { get { return ResourceManager.GetString("Problems_are_not_public", resourceCulture); } } /// /// Looks up a localized string similar to Results. /// public static string Results { get { return ResourceManager.GetString("Results", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Contests/ContestsDetails.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Contests/ContestsDetails.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Позволени езици Участвай в състезание Състезанието е активно до Състезания Детайли за състезанието Промяна Начало Няма описание на избраното състезание. Практикувай Практикуването е позволено до Задачи Задачите за това състезание не са публично достъпни. Участници в състезанието Участници в практиката Пълни резултати Резултати ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Contests/ContestsDetails.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Allowed languages Compete The contest is active until Contests Contest details Edit Home There is no description for the selected contest. Practice Practicing is allowed until Problems The problems for this contest are not public. Contest participants Practice participants Full results Results ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListByCategory.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ListByCategory { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ListByCategory() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Views.List.ListByCategory", typeof(ListByCategory).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to The selected category is empty.. /// public static string Category_is_empty { get { return ResourceManager.GetString("Category_is_empty", resourceCulture); } } /// /// Looks up a localized string similar to Compete. /// public static string Compete { get { return ResourceManager.GetString("Compete", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Edit { get { return ResourceManager.GetString("Edit", resourceCulture); } } /// /// Looks up a localized string similar to The contest has password. /// public static string Has_compete_password { get { return ResourceManager.GetString("Has_compete_password", resourceCulture); } } /// /// Looks up a localized string similar to You need a password to practice. /// public static string Has_practice_password { get { return ResourceManager.GetString("Has_practice_password", resourceCulture); } } /// /// Looks up a localized string similar to The contest has questions to be answered. /// public static string Has_questions_to_be_answered { get { return ResourceManager.GetString("Has_questions_to_be_answered", resourceCulture); } } /// /// Looks up a localized string similar to Participant count. /// public static string Participant_count { get { return ResourceManager.GetString("Participant_count", resourceCulture); } } /// /// Looks up a localized string similar to Practice. /// public static string Practice { get { return ResourceManager.GetString("Practice", resourceCulture); } } /// /// Looks up a localized string similar to Problems. /// public static string Problems { get { return ResourceManager.GetString("Problems", resourceCulture); } } /// /// Looks up a localized string similar to Problems count. /// public static string Problems_count { get { return ResourceManager.GetString("Problems_count", resourceCulture); } } /// /// Looks up a localized string similar to Results. /// public static string Results { get { return ResourceManager.GetString("Results", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListByCategory.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListByCategory.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Избраната категория е празна. Участвай Промяна Има парола Състезанието е защитено с парола За да участвате в състезанието, трябва да отговорите на въпроси Участници Практикувай Задачи Брой задачи Резултати ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListByCategory.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 The selected category is empty. Compete Edit The contest has password You need a password to practice The contest has questions to be answered Participant count Practice Problems Problems count Results ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListByType.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ListByType { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ListByType() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Views.List.ListByType", typeof(ListByType).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Contests where {0} is allowed. /// public static string Contests_with_allowed { get { return ResourceManager.GetString("Contests_with_allowed", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListByType.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListByType.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Състезания, с позволен {0} като език ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListByType.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Contests where {0} is allowed ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Категории Състезания Йерархия Начало Архив състезания ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListIndex.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ListIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ListIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Views.List.ListIndex", typeof(ListIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Categories. /// public static string Categories { get { return ResourceManager.GetString("Categories", resourceCulture); } } /// /// Looks up a localized string similar to Contests. /// public static string Contests { get { return ResourceManager.GetString("Contests", resourceCulture); } } /// /// Looks up a localized string similar to Heirarchy. /// public static string Hierarchy { get { return ResourceManager.GetString("Hierarchy", resourceCulture); } } /// /// Looks up a localized string similar to Home. /// public static string Home { get { return ResourceManager.GetString("Home", resourceCulture); } } /// /// Looks up a localized string similar to Contests archive. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/List/ListIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Categories Contests Heirarchy Home Contests archive ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/Partials/StatsPartial.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Views.Partials { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class StatsPartial { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal StatsPartial() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Views.Results.Partials.StatsPartial", typeof(StatsPartial).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Averege result. /// public static string Average_result { get { return ResourceManager.GetString("Average_result", resourceCulture); } } /// /// Looks up a localized string similar to participants. /// public static string Contestants { get { return ResourceManager.GetString("Contestants", resourceCulture); } } /// /// Looks up a localized string similar to General statistics. /// public static string General_statistics { get { return ResourceManager.GetString("General_statistics", resourceCulture); } } /// /// Looks up a localized string similar to Max points. /// public static string Max_points { get { return ResourceManager.GetString("Max_points", resourceCulture); } } /// /// Looks up a localized string similar to max points. /// public static string Max_points_label { get { return ResourceManager.GetString("Max_points_label", resourceCulture); } } /// /// Looks up a localized string similar to Max result for every task. /// public static string Max_result_for_task { get { return ResourceManager.GetString("Max_result_for_task", resourceCulture); } } /// /// Looks up a localized string similar to Participants in point ranges. /// public static string Participants_by_points { get { return ResourceManager.GetString("Participants_by_points", resourceCulture); } } /// /// Looks up a localized string similar to points. /// public static string Points { get { return ResourceManager.GetString("Points", resourceCulture); } } /// /// Looks up a localized string similar to Points. /// public static string Points_label { get { return ResourceManager.GetString("Points_label", resourceCulture); } } /// /// Looks up a localized string similar to 0 points. /// public static string Zero_points { get { return ResourceManager.GetString("Zero_points", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/Partials/StatsPartial.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/Partials/StatsPartial.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Среден резултат участника Обща статистика Макс точки точки макс Максимален резултат за всяка задача Статистика по диапазон точки точки Точки 0 точки ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/Partials/StatsPartial.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Averege result participants General statistics Max points max points Max result for every task Participants in point ranges points Points 0 points ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/ResultsFull.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/ResultsFull.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Правилен отговор Грешен отговор Среден резултат по минути Детайлни резултати Начало Лимит памет Няма решение Публични резултати Грешка при изпълнение {0} участници Лимит време Пълни резултати за {0} Общо Потребител Име ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/ResultsFull.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ResultsFull { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ResultsFull() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Views.Results.ResultsFull", typeof(ResultsFull).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Correct answer. /// public static string Answer_correct { get { return ResourceManager.GetString("Answer_correct", resourceCulture); } } /// /// Looks up a localized string similar to Wrong answer. /// public static string Answer_incorrect { get { return ResourceManager.GetString("Answer_incorrect", resourceCulture); } } /// /// Looks up a localized string similar to Average result by minutes. /// public static string Average_result_by_minutes { get { return ResourceManager.GetString("Average_result_by_minutes", resourceCulture); } } /// /// Looks up a localized string similar to Detailed results. /// public static string Full_results { get { return ResourceManager.GetString("Full_results", resourceCulture); } } /// /// Looks up a localized string similar to Home. /// public static string Home { get { return ResourceManager.GetString("Home", resourceCulture); } } /// /// Looks up a localized string similar to Memory limit. /// public static string Memory_limit { get { return ResourceManager.GetString("Memory_limit", resourceCulture); } } /// /// Looks up a localized string similar to No solution. /// public static string No_solution { get { return ResourceManager.GetString("No_solution", resourceCulture); } } /// /// Looks up a localized string similar to Public results. /// public static string Public_results { get { return ResourceManager.GetString("Public_results", resourceCulture); } } /// /// Looks up a localized string similar to Run-time error. /// public static string Runtime_error { get { return ResourceManager.GetString("Runtime_error", resourceCulture); } } /// /// Looks up a localized string similar to {0} participants. /// public static string Subtitle { get { return ResourceManager.GetString("Subtitle", resourceCulture); } } /// /// Looks up a localized string similar to Time limit. /// public static string Time_limit { get { return ResourceManager.GetString("Time_limit", resourceCulture); } } /// /// Looks up a localized string similar to Full results for {0}. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } /// /// Looks up a localized string similar to Total. /// public static string Total { get { return ResourceManager.GetString("Total", resourceCulture); } } /// /// Looks up a localized string similar to User. /// public static string User { get { return ResourceManager.GetString("User", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string UserFullName { get { return ResourceManager.GetString("UserFullName", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/ResultsFull.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Correct answer Wrong answer Average result by minutes Detailed results Home Memory limit No solution Public results Run-time error {0} participants Time limit Full results for {0} Total User Name ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/ResultsSimple.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.34011 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ResultsSimple { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ResultsSimple() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Views.Results.ResultsSimple", typeof(ResultsSimple).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Detailed results. /// public static string Detailed_results { get { return ResourceManager.GetString("Detailed_results", resourceCulture); } } /// /// Looks up a localized string similar to Home. /// public static string Home { get { return ResourceManager.GetString("Home", resourceCulture); } } /// /// Looks up a localized string similar to Results. /// public static string Simple_results { get { return ResourceManager.GetString("Simple_results", resourceCulture); } } /// /// Looks up a localized string similar to {0} participants. /// public static string Subtitle { get { return ResourceManager.GetString("Subtitle", resourceCulture); } } /// /// Looks up a localized string similar to Results for {0}. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } /// /// Looks up a localized string similar to Total. /// public static string Total { get { return ResourceManager.GetString("Total", resourceCulture); } } /// /// Looks up a localized string similar to User. /// public static string User { get { return ResourceManager.GetString("User", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string UserFullName { get { return ResourceManager.GetString("UserFullName", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/ResultsSimple.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/ResultsSimple.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Подробни резултати Начало Резултати {0} участници Резултати за {0} Общо Потребител Име ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Results/ResultsSimple.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Detailed results Home Results {0} participants Results for {0} Total User Name ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Submissions/SubmissionsView.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Contests.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SubmissionsView { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SubmissionsView() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Contests.Views.Submissions.SubmissionsView", typeof(SubmissionsView).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Correct answer. /// public static string Answer_correct { get { return ResourceManager.GetString("Answer_correct", resourceCulture); } } /// /// Looks up a localized string similar to Incorrect answer. /// public static string Answer_incorrect { get { return ResourceManager.GetString("Answer_incorrect", resourceCulture); } } /// /// Looks up a localized string similar to Author's profile. /// public static string Authors_profile { get { return ResourceManager.GetString("Authors_profile", resourceCulture); } } /// /// Looks up a localized string similar to Compilation result. /// public static string Compilation_result { get { return ResourceManager.GetString("Compilation_result", resourceCulture); } } /// /// Looks up a localized string similar to A compile time error occurred.. /// public static string Compile_time_error_occured { get { return ResourceManager.GetString("Compile_time_error_occured", resourceCulture); } } /// /// Looks up a localized string similar to Compiled successfully.. /// public static string Compiled_successfully { get { return ResourceManager.GetString("Compiled_successfully", resourceCulture); } } /// /// Looks up a localized string similar to Delete. /// public static string Delete { get { return ResourceManager.GetString("Delete", resourceCulture); } } /// /// Looks up a localized string similar to Execution result. /// public static string Execution_result { get { return ResourceManager.GetString("Execution_result", resourceCulture); } } /// /// Looks up a localized string similar to Home. /// public static string Home { get { return ResourceManager.GetString("Home", resourceCulture); } } /// /// Looks up a localized string similar to Memory limit. /// public static string Memory_limit { get { return ResourceManager.GetString("Memory_limit", resourceCulture); } } /// /// Looks up a localized string similar to Memory used. /// public static string Memory_used { get { return ResourceManager.GetString("Memory_used", resourceCulture); } } /// /// Looks up a localized string similar to Retest. /// public static string Retest { get { return ResourceManager.GetString("Retest", resourceCulture); } } /// /// Looks up a localized string similar to Run #. /// public static string Run { get { return ResourceManager.GetString("Run", resourceCulture); } } /// /// Looks up a localized string similar to Runtime error. /// public static string Runtime_error { get { return ResourceManager.GetString("Runtime_error", resourceCulture); } } /// /// Looks up a localized string similar to Source code. /// public static string Source_code { get { return ResourceManager.GetString("Source_code", resourceCulture); } } /// /// Looks up a localized string similar to This submission is in queue and will be processed shortly. Please wait.. /// public static string Submission_in_queue { get { return ResourceManager.GetString("Submission_in_queue", resourceCulture); } } /// /// Looks up a localized string similar to This submission is deleted!!!. /// public static string Submission_is_deleted { get { return ResourceManager.GetString("Submission_is_deleted", resourceCulture); } } /// /// Looks up a localized string similar to This submission is being processed at the moment... Please wait.. /// public static string Submission_is_processing { get { return ResourceManager.GetString("Submission_is_processing", resourceCulture); } } /// /// Looks up a localized string similar to Submissions. /// public static string Submissions { get { return ResourceManager.GetString("Submissions", resourceCulture); } } /// /// Looks up a localized string similar to Test #. /// public static string Test { get { return ResourceManager.GetString("Test", resourceCulture); } } /// /// Looks up a localized string similar to Tests. /// public static string Tests { get { return ResourceManager.GetString("Tests", resourceCulture); } } /// /// Looks up a localized string similar to Time limit. /// public static string Time_limit { get { return ResourceManager.GetString("Time_limit", resourceCulture); } } /// /// Looks up a localized string similar to Time used. /// public static string Time_used { get { return ResourceManager.GetString("Time_used", resourceCulture); } } /// /// Looks up a localized string similar to Solution #{0} by {1} for problem {2}. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } /// /// Looks up a localized string similar to Edit. /// public static string Update { get { return ResourceManager.GetString("Update", resourceCulture); } } /// /// Looks up a localized string similar to View code. /// public static string View_code { get { return ResourceManager.GetString("View_code", resourceCulture); } } /// /// Looks up a localized string similar to Zero test #. /// public static string Zero_test { get { return ResourceManager.GetString("Zero_test", resourceCulture); } } /// /// Looks up a localized string similar to The zero tests are not included in the final result.. /// public static string Zero_tests_not_included_in_result { get { return ResourceManager.GetString("Zero_tests_not_included_in_result", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Submissions/SubmissionsView.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Submissions/SubmissionsView.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Верен отговор Грешен отговор Профил на автора Резултат от компилацията Успешна компилация. Възникнала е грешка по време на компилацията. Изтриване Резултат от изпълнението Начало Недостатъчна памет Ретест Грешка по време на изпълнение Решения Решението е в опашката и скоро ще се изпълни. Моля бъдете търпеливи. Това решение е изтрито!!! Решението се изпълнява в момента... Моля бъдете търпеливи. Тестове Недостатъчно време Решение №{0} от {1} към задача {2} Промяна Виж кода Използвана памет Изпълнение № Сорс код Тест № Използвано време Нулев тест № Резултатът от нулевите тестове не се включва към крайния резултат. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Contests/Views/Submissions/SubmissionsView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Correct answer Incorrect answer Author's profile Compilation result Compiled successfully. A compile time error occurred. Delete Execution result Home Memory limit Memory used Retest Run # Runtime error Source code Submissions This submission is in queue and will be processed shortly. Please wait. This submission is deleted!!! This submission is being processed at the moment... Please wait. Test # Tests Time limit Time used Solution #{0} by {1} for problem {2} Edit View code Zero test # The zero tests are not included in the final result. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Shared/ProfileProfileInfo.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Users.Shared { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProfileProfileInfo { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProfileProfileInfo() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Users.Shared.ProfileProfileInfo", typeof(ProfileProfileInfo).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Age. /// public static string Age { get { return ResourceManager.GetString("Age", resourceCulture); } } /// /// Looks up a localized string similar to City. /// public static string City { get { return ResourceManager.GetString("City", resourceCulture); } } /// /// Looks up a localized string similar to Compete. /// public static string Compete { get { return ResourceManager.GetString("Compete", resourceCulture); } } /// /// Looks up a localized string similar to Contest. /// public static string Contest { get { return ResourceManager.GetString("Contest", resourceCulture); } } /// /// Looks up a localized string similar to Participations. /// public static string Participations { get { return ResourceManager.GetString("Participations", resourceCulture); } } /// /// Looks up a localized string similar to Practice. /// public static string Practice { get { return ResourceManager.GetString("Practice", resourceCulture); } } /// /// Looks up a localized string similar to {0}'s profile. /// public static string Profile_title { get { return ResourceManager.GetString("Profile_title", resourceCulture); } } /// /// Looks up a localized string similar to Results. /// public static string Results { get { return ResourceManager.GetString("Results", resourceCulture); } } /// /// Looks up a localized string similar to Settings. /// public static string Settings { get { return ResourceManager.GetString("Settings", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Shared/ProfileProfileInfo.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Shared/ProfileProfileInfo.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Години Град Състезание Състезание Участия Практика Профил на {0} Резултати Настройки ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Shared/ProfileProfileInfo.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Age City Compete Contest Participations Practice {0}'s profile Results Settings ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/ViewModels/ProfileViewModels.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Users.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProfileViewModels { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProfileViewModels() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Users.ViewModels.ProfileViewModels", typeof(ProfileViewModels).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Age. /// public static string Age { get { return ResourceManager.GetString("Age", resourceCulture); } } /// /// Looks up a localized string similar to City. /// public static string City { get { return ResourceManager.GetString("City", resourceCulture); } } /// /// Looks up a localized string similar to The city must be less than {1} characters long. /// public static string City_too_long { get { return ResourceManager.GetString("City_too_long", resourceCulture); } } /// /// Looks up a localized string similar to Company. /// public static string Company { get { return ResourceManager.GetString("Company", resourceCulture); } } /// /// Looks up a localized string similar to The company name must be less than {1} characters long. /// public static string Company_too_long { get { return ResourceManager.GetString("Company_too_long", resourceCulture); } } /// /// Looks up a localized string similar to Date of birth. /// public static string Date_of_birth { get { return ResourceManager.GetString("Date_of_birth", resourceCulture); } } /// /// Looks up a localized string similar to Education institution. /// public static string Education_institution { get { return ResourceManager.GetString("Education_institution", resourceCulture); } } /// /// Looks up a localized string similar to The education institution must be less than {1} characters long. /// public static string Education_too_long { get { return ResourceManager.GetString("Education_too_long", resourceCulture); } } /// /// Looks up a localized string similar to Email. /// public static string Email { get { return ResourceManager.GetString("Email", resourceCulture); } } /// /// Looks up a localized string similar to Faculty number. /// public static string Faculty_number { get { return ResourceManager.GetString("Faculty_number", resourceCulture); } } /// /// Looks up a localized string similar to The faculty number must be less than {1} characters long. /// public static string Faculty_number_too_long { get { return ResourceManager.GetString("Faculty_number_too_long", resourceCulture); } } /// /// Looks up a localized string similar to Family. /// public static string Family_name { get { return ResourceManager.GetString("Family_name", resourceCulture); } } /// /// Looks up a localized string similar to The family name must be less than {1} characters long. /// public static string Family_name_too_long { get { return ResourceManager.GetString("Family_name_too_long", resourceCulture); } } /// /// Looks up a localized string similar to Name. /// public static string First_name { get { return ResourceManager.GetString("First_name", resourceCulture); } } /// /// Looks up a localized string similar to The first name must be less than {1} characters long. /// public static string First_name_too_long { get { return ResourceManager.GetString("First_name_too_long", resourceCulture); } } /// /// Looks up a localized string similar to Job title. /// public static string Job_title { get { return ResourceManager.GetString("Job_title", resourceCulture); } } /// /// Looks up a localized string similar to The job title must be less than {1} characters long. /// public static string Job_title_too_long { get { return ResourceManager.GetString("Job_title_too_long", resourceCulture); } } /// /// Looks up a localized string similar to No information. /// public static string No_information { get { return ResourceManager.GetString("No_information", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/ViewModels/ProfileViewModels.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/ViewModels/ProfileViewModels.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Години Град Името на града трябва да е по-кратко от {1} символа Компания Името на компанията трябва е по-кратко от {1} символа Дата на раждане Образование Името на образувателната институция трябва да е по-кратко от {1} символа Имейл Факултетен номер Факултетния номер трябва да е по-кратък от {1} символа Фамилия Фамилията трябва да е по-кратко от {1} символа Име Името трябва е по-кратко от {1} символа Позиция Позицията трябва да е по-кратка от {1} символа Няма информация ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/ViewModels/ProfileViewModels.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Age City The city must be less than {1} characters long Company The company name must be less than {1} characters long Date of birth Education institution The education institution must be less than {1} characters long Email Faculty number The faculty number must be less than {1} characters long Family The family name must be less than {1} characters long Name The first name must be less than {1} characters long Job title The job title must be less than {1} characters long No information ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Views/Profile/ProfileIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Users.Views.Profile { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ProfileIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ProfileIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Users.Views.Profile.ProfileIndex", typeof(ProfileIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Home. /// public static string Home { get { return ResourceManager.GetString("Home", resourceCulture); } } /// /// Looks up a localized string similar to This user does not exist!. /// public static string Not_found { get { return ResourceManager.GetString("Not_found", resourceCulture); } } /// /// Looks up a localized string similar to Profile. /// public static string Profile { get { return ResourceManager.GetString("Profile", resourceCulture); } } /// /// Looks up a localized string similar to {0}'s profile. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Views/Profile/ProfileIndex.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Views/Profile/ProfileIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Начало Този потребител не съществува! Профил Профил на {0} ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Views/Profile/ProfileIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Home This user does not exist! Profile {0}'s profile ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Views/Settings/SettingsIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Areas.Users.Views.Settings { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SettingsIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SettingsIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Areas.Users.Views.Settings.SettingsIndex", typeof(SettingsIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Cancel. /// public static string Cancel { get { return ResourceManager.GetString("Cancel", resourceCulture); } } /// /// Looks up a localized string similar to Change your email. /// public static string Change_email { get { return ResourceManager.GetString("Change_email", resourceCulture); } } /// /// Looks up a localized string similar to Change your password. /// public static string Change_password { get { return ResourceManager.GetString("Change_password", resourceCulture); } } /// /// Looks up a localized string similar to Email. /// public static string Email { get { return ResourceManager.GetString("Email", resourceCulture); } } /// /// Looks up a localized string similar to Home. /// public static string Home { get { return ResourceManager.GetString("Home", resourceCulture); } } /// /// Looks up a localized string similar to Error - please log into your profile.. /// public static string Not_logged_in { get { return ResourceManager.GetString("Not_logged_in", resourceCulture); } } /// /// Looks up a localized string similar to Password. /// public static string Password { get { return ResourceManager.GetString("Password", resourceCulture); } } /// /// Looks up a localized string similar to Profile. /// public static string Profile { get { return ResourceManager.GetString("Profile", resourceCulture); } } /// /// Looks up a localized string similar to Save. /// public static string Save { get { return ResourceManager.GetString("Save", resourceCulture); } } /// /// Looks up a localized string similar to Settings. /// public static string Settings { get { return ResourceManager.GetString("Settings", resourceCulture); } } /// /// Looks up a localized string similar to The settings were successfully saved. /// public static string Settings_were_saved { get { return ResourceManager.GetString("Settings_were_saved", resourceCulture); } } /// /// Looks up a localized string similar to Settings. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } /// /// Looks up a localized string similar to Username. /// public static string Username { get { return ResourceManager.GetString("Username", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Views/Settings/SettingsIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Views/Settings/SettingsIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Отказ Промяна на имейл Промяна на паролата Имейл Начало Грешка - моля влезте в профила си, за да промените настройките Парола Профил Запази Настройки Настройки бяха успешно запазени Настройки Потребителско име ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Areas/Users/Views/Settings/SettingsIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Cancel Change your email Change your password Email Home Error - please log into your profile. Password Profile Save Settings The settings were successfully saved Settings Username ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Base/Main.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Base { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Main { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Main() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Base.Main", typeof(Main).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to You have not set a password for your profile. Please set your password using <a href="/Account/Manage">this link</a>.. /// public static string Password_not_set { get { return ResourceManager.GetString("Password_not_set", resourceCulture); } } /// /// Looks up a localized string similar to Your username contains symbols that are not allowed, is shorter than 5 characters or is longer than 15 characters. You can change it using <a href="/Account/ChangeUsername">this link</a>.. /// public static string Username_in_invalid_format { get { return ResourceManager.GetString("Username_in_invalid_format", resourceCulture); } } /// /// Looks up a localized string similar to Welcome to the new version of the BGCoder.com system!<br />All data (except user passwords) were transferred from the old version of the system to the new one.<br />If you had an account in the old system you should use the "<a href="/Account/ForgottenPassword">forgotten password</a>" link to activate your account in the new system.. /// public static string Welcome_to_the_new_bgcoder_and_change_password { get { return ResourceManager.GetString("Welcome_to_the_new_bgcoder_and_change_password", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Base/Main.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Base/Main.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Нямате парола за вход в сайта. Моля сложете си парола от <a href="/Account/Manage">този линк</a>. Вашето потребителско име съдържа непозволени символи, по-късо е от 5 символа или е по-дълго от 15 символа. Можете да го смените от <a href="/Account/ChangeUsername">този линк</a>. Добре дошли в новата версия на системата BGCoder.com!<br />Всички данни (с изключение на потребителските пароли) са прехвърлени от старата версия.<br />Ако имате регистрация в старата система, трябва да използвате модула "<a href="/Account/ForgottenPassword">забравена парола</a>", за да активирате акаунта си в новата система. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Base/Main.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 You have not set a password for your profile. Please set your password using <a href="/Account/Manage">this link</a>. Your username contains symbols that are not allowed, is shorter than 5 characters or is longer than 15 characters. You can change it using <a href="/Account/ChangeUsername">this link</a>. Welcome to the new version of the BGCoder.com system!<br />All data (except user passwords) were transferred from the old version of the system to the new one.<br />If you had an account in the old system you should use the "<a href="/Account/ForgottenPassword">forgotten password</a>" link to activate your account in the new system. ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/ViewModels/FeedbackViewModels.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Feedback.ViewModels { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class FeedbackViewModels { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal FeedbackViewModels() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Feedback.ViewModels.FeedbackViewModels", typeof(FeedbackViewModels).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Content. /// public static string Content { get { return ResourceManager.GetString("Content", resourceCulture); } } /// /// Looks up a localized string similar to Please enter your feedback. /// public static string Content_required { get { return ResourceManager.GetString("Content_required", resourceCulture); } } /// /// Looks up a localized string similar to The content must be at least {2} characters long. /// public static string Content_too_short { get { return ResourceManager.GetString("Content_too_short", resourceCulture); } } /// /// Looks up a localized string similar to Email. /// public static string Email { get { return ResourceManager.GetString("Email", resourceCulture); } } /// /// Looks up a localized string similar to Invalid email address provided. /// public static string Invalid_email { get { return ResourceManager.GetString("Invalid_email", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/ViewModels/FeedbackViewModels.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/ViewModels/FeedbackViewModels.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Съдържание Моля, въведете съдържание Обратната връзка трябва да е поне {2} символа Имейл Невалиден имейл адрес ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/ViewModels/FeedbackViewModels.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Content Please enter your feedback The content must be at least {2} characters long Email Invalid email address provided ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/Views/FeedbackIndex.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Feedback.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class FeedbackIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal FeedbackIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Feedback.Views.FeedbackIndex", typeof(FeedbackIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Thank you for your feedback! We will try to address the issue as soon as possible!. /// public static string Feedback_submitted { get { return ResourceManager.GetString("Feedback_submitted", resourceCulture); } } /// /// Looks up a localized string similar to Home. /// public static string Home { get { return ResourceManager.GetString("Home", resourceCulture); } } /// /// Looks up a localized string similar to Invalid Captcha, please try again. /// public static string Invalid_captcha { get { return ResourceManager.GetString("Invalid_captcha", resourceCulture); } } /// /// Looks up a localized string similar to Submit. /// public static string Submit { get { return ResourceManager.GetString("Submit", resourceCulture); } } /// /// Looks up a localized string similar to Feedback. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/Views/FeedbackIndex.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/Views/FeedbackIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Благодарим ви за обратната връзка. Ще се постараем да поправим проблема възможно най-скоро! Начало Грешно въведен Captcha, моля опитайте отново Изпрати Обратна връзка ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/Views/FeedbackIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Thank you for your feedback! We will try to address the issue as soon as possible! Home Invalid Captcha, please try again Submit Feedback ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/Views/FeedbackSubmitted.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Feedback.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class FeedbackSubmitted { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal FeedbackSubmitted() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Feedback.Views.FeedbackSubmitted", typeof(FeedbackSubmitted).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Feedback. /// public static string Feedback { get { return ResourceManager.GetString("Feedback", resourceCulture); } } /// /// Looks up a localized string similar to Home. /// public static string Home { get { return ResourceManager.GetString("Home", resourceCulture); } } /// /// Looks up a localized string similar to Feedback successfully submitted. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/Views/FeedbackSubmitted.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/Views/FeedbackSubmitted.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Обратна връзка Начало Успешно изпратена обратна връзка ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Feedback/Views/FeedbackSubmitted.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Feedback Home Feedback successfully submitted ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Global.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.34014 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option or rebuild the Visual Studio project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Web.Application.StronglyTypedResourceProxyBuilder", "12.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Global { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Global() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Resources.Global", global::System.Reflection.Assembly.Load("App_GlobalResources")); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Open Judge System (OJS). /// internal static string SystemName { get { return ResourceManager.GetString("SystemName", resourceCulture); } } /// /// Looks up a localized string similar to 1.5.20150729.95737d0. /// internal static string SystemVersion { get { return ResourceManager.GetString("SystemVersion", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Global.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Open Judge System (OJS) 1.5.20150729.95737d0 ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Home/Views/Index.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Home/Views/Index.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Активни състезания Администрация Приключило на час часа Новини Няма предишни състезания Няма предстоящи състезания Участвай Предишни състезания Онлайн задачи по програмиране BGCoder Оставащо време: {0} {1} и {2} минути Вижте още Започва на Начало Предстоящи състезания ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Home/Views/Index.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Home.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Index { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Index() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Home.Views.Index", typeof(Index).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Active contests. /// public static string Active_contests { get { return ResourceManager.GetString("Active_contests", resourceCulture); } } /// /// Looks up a localized string similar to Administration. /// public static string Administration { get { return ResourceManager.GetString("Administration", resourceCulture); } } /// /// Looks up a localized string similar to Ended. /// public static string Ended { get { return ResourceManager.GetString("Ended", resourceCulture); } } /// /// Looks up a localized string similar to hour. /// public static string Hour { get { return ResourceManager.GetString("Hour", resourceCulture); } } /// /// Looks up a localized string similar to hours. /// public static string Hours { get { return ResourceManager.GetString("Hours", resourceCulture); } } /// /// Looks up a localized string similar to News. /// public static string News { get { return ResourceManager.GetString("News", resourceCulture); } } /// /// Looks up a localized string similar to No previous contests. /// public static string No_previous_contests { get { return ResourceManager.GetString("No_previous_contests", resourceCulture); } } /// /// Looks up a localized string similar to No upcoming contests. /// public static string No_upcoming_contests { get { return ResourceManager.GetString("No_upcoming_contests", resourceCulture); } } /// /// Looks up a localized string similar to Participate. /// public static string Participate { get { return ResourceManager.GetString("Participate", resourceCulture); } } /// /// Looks up a localized string similar to Previous contests. /// public static string Previous_contests { get { return ResourceManager.GetString("Previous_contests", resourceCulture); } } /// /// Looks up a localized string similar to Solve programming problems online. /// public static string Project_subtitle { get { return ResourceManager.GetString("Project_subtitle", resourceCulture); } } /// /// Looks up a localized string similar to BGCoder. /// public static string Project_title { get { return ResourceManager.GetString("Project_title", resourceCulture); } } /// /// Looks up a localized string similar to Time remaining: {0} {1} and {2} minutes. /// public static string Remaining_time { get { return ResourceManager.GetString("Remaining_time", resourceCulture); } } /// /// Looks up a localized string similar to See more. /// public static string See_more { get { return ResourceManager.GetString("See_more", resourceCulture); } } /// /// Looks up a localized string similar to Starts. /// public static string Starts { get { return ResourceManager.GetString("Starts", resourceCulture); } } /// /// Looks up a localized string similar to Home. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } /// /// Looks up a localized string similar to Upcoming contests. /// public static string Upcoming_contests { get { return ResourceManager.GetString("Upcoming_contests", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Home/Views/Index.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Active contests Administration Ended hour hours News No previous contests No upcoming contests Participate Previous contests Solve programming problems online BGCoder Time remaining: {0} {1} and {2} minutes See more Starts Home Upcoming contests ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Models/ContestQuestionTypeResource.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Models/ContestQuestionTypeResource.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 По подразбиран Drop-down лист Многоредов текст Едноредов текст ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Models/ContestQuestionTypeResource.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option or rebuild the Visual Studio project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Web.Application.StronglyTypedResourceProxyBuilder", "12.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class ContestQuestionTypeResource { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ContestQuestionTypeResource() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Resources.ContestQuestionTypeResource", global::System.Reflection.Assembly.Load("App_GlobalResources")); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Default. /// internal static string Default { get { return ResourceManager.GetString("Default", resourceCulture); } } /// /// Looks up a localized string similar to Drop-down list. /// internal static string DropDownList { get { return ResourceManager.GetString("DropDownList", resourceCulture); } } /// /// Looks up a localized string similar to Multi-line text. /// internal static string MultiLineTextArea { get { return ResourceManager.GetString("MultiLineTextArea", resourceCulture); } } /// /// Looks up a localized string similar to Single line text. /// internal static string TextBox { get { return ResourceManager.GetString("TextBox", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Models/ContestQuestionTypeResource.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Default Drop-down list Multi-line text Single line text ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/All.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.News.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class All { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal All() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.News.Views.All", typeof(All).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Author. /// public static string Author { get { return ResourceManager.GetString("Author", resourceCulture); } } /// /// Looks up a localized string similar to Date. /// public static string Date { get { return ResourceManager.GetString("Date", resourceCulture); } } /// /// Looks up a localized string similar to News successfully added. /// public static string News_successfully_added { get { return ResourceManager.GetString("News_successfully_added", resourceCulture); } } /// /// Looks up a localized string similar to Title. /// public static string News_title { get { return ResourceManager.GetString("News_title", resourceCulture); } } /// /// Looks up a localized string similar to No news available. /// public static string No_news { get { return ResourceManager.GetString("No_news", resourceCulture); } } /// /// Looks up a localized string similar to Source. /// public static string Source { get { return ResourceManager.GetString("Source", resourceCulture); } } /// /// Looks up a localized string similar to Latest news. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/All.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/All.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Автор Дата Новините бяха успешно добавени Заглавие Няма актуални новини Източник Последни новини ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/All.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Author Date News successfully added Title No news available Source Latest news ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/LatestNews.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.News.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class LatestNews { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal LatestNews() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.News.Views.LatestNews", typeof(LatestNews).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Administration. /// public static string Administration { get { return ResourceManager.GetString("Administration", resourceCulture); } } /// /// Looks up a localized string similar to No news available. /// public static string No_news { get { return ResourceManager.GetString("No_news", resourceCulture); } } /// /// Looks up a localized string similar to See more. /// public static string See_more { get { return ResourceManager.GetString("See_more", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/LatestNews.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/LatestNews.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Администрация Няма актуални новини Виж още ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/LatestNews.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Administration No news available See more ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/Selected.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.News.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Selected { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Selected() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.News.Views.Selected", typeof(Selected).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Author. /// public static string Author { get { return ResourceManager.GetString("Author", resourceCulture); } } /// /// Looks up a localized string similar to Invalid news id was provided. /// public static string Invalid_news_id { get { return ResourceManager.GetString("Invalid_news_id", resourceCulture); } } /// /// Looks up a localized string similar to Latest news. /// public static string Latest_news { get { return ResourceManager.GetString("Latest_news", resourceCulture); } } /// /// Looks up a localized string similar to Next. /// public static string Next { get { return ResourceManager.GetString("Next", resourceCulture); } } /// /// Looks up a localized string similar to Previous. /// public static string Previous { get { return ResourceManager.GetString("Previous", resourceCulture); } } /// /// Looks up a localized string similar to Source. /// public static string Source { get { return ResourceManager.GetString("Source", resourceCulture); } } /// /// Looks up a localized string similar to News. /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/Selected.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/Selected.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Автор Така новина не съществува Последни новини Следваща Предишна Източник Новини ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/News/Views/Selected.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Author Invalid news id was provided Latest news Next Previous Source News ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Search/Views/SearchIndex.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Search/Views/SearchIndex.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Търсене Търсене ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Search/Views/SearchIndex.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Search.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SearchIndex { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SearchIndex() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Search.Views.SearchIndex", typeof(SearchIndex).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Search. /// public static string Placeholder { get { return ResourceManager.GetString("Placeholder", resourceCulture); } } /// /// Looks up a localized string similar to Search. /// public static string Search { get { return ResourceManager.GetString("Search", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Search/Views/SearchIndex.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Search Search ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Search/Views/SearchResults.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Search.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class SearchResults { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal SearchResults() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Search.Views.SearchResults", typeof(SearchResults).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Contests. /// public static string Contests { get { return ResourceManager.GetString("Contests", resourceCulture); } } /// /// Looks up a localized string similar to from contest. /// public static string From_contest { get { return ResourceManager.GetString("From_contest", resourceCulture); } } /// /// Looks up a localized string similar to Problems. /// public static string Problems { get { return ResourceManager.GetString("Problems", resourceCulture); } } /// /// Looks up a localized string similar to The search term must be at least {0} characters.. /// public static string Search_term_too_short { get { return ResourceManager.GetString("Search_term_too_short", resourceCulture); } } /// /// Looks up a localized string similar to Search results for "{0}". /// public static string Title { get { return ResourceManager.GetString("Title", resourceCulture); } } /// /// Looks up a localized string similar to Users. /// public static string Users { get { return ResourceManager.GetString("Users", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Search/Views/SearchResults.bg.Designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Search/Views/SearchResults.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Състезания от състезание Задачи Критерия за търсене трябва да е поне {0} символа. Резултати от търсене на "{0}" Потребители ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Search/Views/SearchResults.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Contests from contest Problems The search term must be at least {0} characters. Search results for "{0}" Users ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/AdvancedSubmissions.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Submissions.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class AdvancedSubmissions { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal AdvancedSubmissions() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Submissions.Views.AdvancedSubmissions", typeof(AdvancedSubmissions).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Latest submissions. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/AdvancedSubmissions.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/AdvancedSubmissions.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Последно изпратени решения ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/AdvancedSubmissions.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Latest submissions ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/BasicSubmissions.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Submissions.Views { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class BasicSubmissions { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal BasicSubmissions() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Submissions.Views.BasicSubmissions", typeof(BasicSubmissions).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Compilation failed!. /// public static string Failed_compilcation { get { return ResourceManager.GetString("Failed_compilcation", resourceCulture); } } /// /// Looks up a localized string similar to Latest submissions. /// public static string Page_title { get { return ResourceManager.GetString("Page_title", resourceCulture); } } /// /// Looks up a localized string similar to Processing.... /// public static string Processing { get { return ResourceManager.GetString("Processing", resourceCulture); } } /// /// Looks up a localized string similar to Result. /// public static string Result { get { return ResourceManager.GetString("Result", resourceCulture); } } /// /// Looks up a localized string similar to From. /// public static string Sent_from { get { return ResourceManager.GetString("Sent_from", resourceCulture); } } /// /// Looks up a localized string similar to Task. /// public static string Task { get { return ResourceManager.GetString("Task", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/BasicSubmissions.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/BasicSubmissions.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Не се компилира! Последно изпратени решения Обработва се... Резултат Изпратено от Задача ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/BasicSubmissions.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Compilation failed! Latest submissions Processing... Result From Task ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/Partial/AdvancedSubmissionsGridPartial.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Submissions.Views.Partial { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class AdvancedSubmissionsGridPartial { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal AdvancedSubmissionsGridPartial() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Submissions.Views.Partial.AdvancedSubmissionsGridPart" + "ial", typeof(AdvancedSubmissionsGridPartial).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Admin. /// public static string Admin { get { return ResourceManager.GetString("Admin", resourceCulture); } } /// /// Looks up a localized string similar to Result. /// public static string Result { get { return ResourceManager.GetString("Result", resourceCulture); } } /// /// Looks up a localized string similar to From. /// public static string Sent_from { get { return ResourceManager.GetString("Sent_from", resourceCulture); } } /// /// Looks up a localized string similar to Sent on. /// public static string Sent_on { get { return ResourceManager.GetString("Sent_on", resourceCulture); } } /// /// Looks up a localized string similar to Task. /// public static string Task { get { return ResourceManager.GetString("Task", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/Partial/AdvancedSubmissionsGridPartial.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/Partial/AdvancedSubmissionsGridPartial.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Админ Резултат Изпратено от Изпратено на Задача ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Submissions/Views/Partial/AdvancedSubmissionsGridPartial.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Admin Result From Sent on Task ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Views/Shared/Layout.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.34014 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Views.Shared { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Layout { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Layout() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Views.Shared.Layout", typeof(Layout).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Administration. /// public static string Administration { get { return ResourceManager.GetString("Administration", resourceCulture); } } /// /// Looks up a localized string similar to All. /// public static string All { get { return ResourceManager.GetString("All", resourceCulture); } } /// /// Looks up a localized string similar to All administrations. /// public static string All_administrations { get { return ResourceManager.GetString("All_administrations", resourceCulture); } } /// /// Looks up a localized string similar to Categories. /// public static string Categories { get { return ResourceManager.GetString("Categories", resourceCulture); } } /// /// Looks up a localized string similar to Category heirarchy. /// public static string Category_hierarchy { get { return ResourceManager.GetString("Category_hierarchy", resourceCulture); } } /// /// Looks up a localized string similar to Checkers. /// public static string Checkers { get { return ResourceManager.GetString("Checkers", resourceCulture); } } /// /// Looks up a localized string similar to Contests. /// public static string Contests { get { return ResourceManager.GetString("Contests", resourceCulture); } } /// /// Looks up a localized string similar to <a href="http://en.wikipedia.org/wiki/HTTP_cookie" target="_blank">Cookies</a> help us deliver our services. By using our services, you agree to our use of cookies.. /// public static string Cookies_notification { get { return ResourceManager.GetString("Cookies_notification", resourceCulture); } } /// /// Looks up a localized string similar to OK. /// public static string Cookies_notification_OK { get { return ResourceManager.GetString("Cookies_notification_OK", resourceCulture); } } /// /// Looks up a localized string similar to Feedback. /// public static string Feedback { get { return ResourceManager.GetString("Feedback", resourceCulture); } } /// /// Looks up a localized string similar to Files. /// public static string Files { get { return ResourceManager.GetString("Files", resourceCulture); } } /// /// Looks up a localized string similar to Home. /// public static string Home { get { return ResourceManager.GetString("Home", resourceCulture); } } /// /// Looks up a localized string similar to IP Usage. /// public static string IpUsage { get { return ResourceManager.GetString("IpUsage", resourceCulture); } } /// /// Looks up a localized string similar to Log. /// public static string Log { get { return ResourceManager.GetString("Log", resourceCulture); } } /// /// Looks up a localized string similar to News. /// public static string News { get { return ResourceManager.GetString("News", resourceCulture); } } /// /// Looks up a localized string similar to Open source project.. /// public static string Open_source_project { get { return ResourceManager.GetString("Open_source_project", resourceCulture); } } /// /// Looks up a localized string similar to Other. /// public static string Other { get { return ResourceManager.GetString("Other", resourceCulture); } } /// /// Looks up a localized string similar to Participants. /// public static string Participants { get { return ResourceManager.GetString("Participants", resourceCulture); } } /// /// Looks up a localized string similar to Problems. /// public static string Problems { get { return ResourceManager.GetString("Problems", resourceCulture); } } /// /// Looks up a localized string similar to Roles. /// public static string Roles { get { return ResourceManager.GetString("Roles", resourceCulture); } } /// /// Looks up a localized string similar to Search. /// public static string Search { get { return ResourceManager.GetString("Search", resourceCulture); } } /// /// Looks up a localized string similar to Settings. /// public static string Settings { get { return ResourceManager.GetString("Settings", resourceCulture); } } /// /// Looks up a localized string similar to Submissions. /// public static string Submissions { get { return ResourceManager.GetString("Submissions", resourceCulture); } } /// /// Looks up a localized string similar to Submissions Similarity. /// public static string SubmissionSimilarity { get { return ResourceManager.GetString("SubmissionSimilarity", resourceCulture); } } /// /// Looks up a localized string similar to Submission Types. /// public static string SubmissionTypes { get { return ResourceManager.GetString("SubmissionTypes", resourceCulture); } } /// /// Looks up a localized string similar to Test files. /// public static string Test_files { get { return ResourceManager.GetString("Test_files", resourceCulture); } } /// /// Looks up a localized string similar to Users. /// public static string Users { get { return ResourceManager.GetString("Users", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Views/Shared/Layout.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Views/Shared/Layout.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Админ Всички Всички администрации Категории Йерархия на категориите Чекери Състезания За да доставяме нашите услуги, ние използваме <a href="http://bg.wikipedia.org/wiki/HTTP-%D0%B1%D0%B8%D1%81%D0%BA%D0%B2%D0%B8%D1%82%D0%BA%D0%B0" target="_blank">HTTP бисквитки</a>. Използвайки сайта, вие се съгласявате с това. Да Обратна връзка Файлове Начало Използвани IP-та Лог Новини Проект с отворен код. Други Участници Задачи Роли Търсене Настройки Решения Прилика на решения Тестови файлове Потребители Типове решения ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Views/Shared/Layout.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Administration All All administrations Categories Category heirarchy Checkers Contests <a href="http://en.wikipedia.org/wiki/HTTP_cookie" target="_blank">Cookies</a> help us deliver our services. By using our services, you agree to our use of cookies. OK Feedback Files Home IP Usage Log News Open source project. Other Participants Problems Roles Search Settings Submissions Submissions Similarity Test files Users Submission Types ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Views/Shared/LoginPartial.bg.designer.cs ================================================ ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Views/Shared/LoginPartial.bg.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Вход Изход Регистрация Настройки Здравей ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Views/Shared/LoginPartial.designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18408 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Resources.Views.Shared { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class LoginPartial { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal LoginPartial() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OJS.Web.App_GlobalResources.Views.Shared.LoginPartial", typeof(LoginPartial).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Log in. /// public static string Log_in { get { return ResourceManager.GetString("Log_in", resourceCulture); } } /// /// Looks up a localized string similar to Log out. /// public static string Log_out { get { return ResourceManager.GetString("Log_out", resourceCulture); } } /// /// Looks up a localized string similar to Register. /// public static string Register { get { return ResourceManager.GetString("Register", resourceCulture); } } /// /// Looks up a localized string similar to Settings. /// public static string Settings { get { return ResourceManager.GetString("Settings", resourceCulture); } } /// /// Looks up a localized string similar to Hello. /// public static string Welcome_message { get { return ResourceManager.GetString("Welcome_message", resourceCulture); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_GlobalResources/Views/Shared/LoginPartial.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Log in Log out Register Settings Hello ================================================ FILE: Open Judge System/Web/OJS.Web/App_Start/BundleConfig.cs ================================================ namespace OJS.Web { using System.Web.Optimization; public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { RegisterScripts(bundles); RegisterStyles(bundles); } private static void RegisterScripts(BundleCollection bundles) { bundles.Add(new ScriptBundle("~/bundles/global").Include( "~/Scripts/global.js")); bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js", "~/Scripts/jquery.unobtrusive-ajax.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.unobtrusive*", "~/Scripts/jquery.validate*")); bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include( "~/Scripts/bootstrap.js")); bundles.Add(new ScriptBundle("~/bundles/knockout").Include( "~/Scripts/knockout-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/kendo").Include( "~/Scripts/KendoUI/2014.3.1411/kendo.all.js", "~/Scripts/KendoUI/2014.3.1411/kendo.aspnetmvc.js", "~/Scripts/KendoUI/2014.3.1411/cultures/kendo.culture.bg.js", "~/Scripts/KendoUI/2014.3.1411/cultures/kendo.culture.en-GB.js")); bundles.Add(new ScriptBundle("~/bundles/codemirror").Include( "~/Scripts/CodeMirror/codemirror.js", "~/Scripts/CodeMirror/mode/clike.js", "~/Scripts/CodeMirror/mode/javascript.js")); bundles.Add(new ScriptBundle("~/bundles/codemirrormerge").Include( "~/Scripts/CodeMirror/addon/diff_match_patch.js", "~/Scripts/CodeMirror/addon/merge.js")); } private static void RegisterStyles(BundleCollection bundles) { bundles.Add(new StyleBundle("~/Content/css").Include( "~/Content/site.css")); bundles.Add(new StyleBundle("~/Content/KendoUI/kendo").Include( "~/Content/KendoUI/kendo.common.css", "~/Content/KendoUI/kendo.black.css")); bundles.Add(new StyleBundle("~/Content/bootstrap/bootstrap").Include( "~/Content/bootstrap/themes/bootstrap-theme-cyborg.css")); bundles.Add(new StyleBundle("~/Content/CodeMirror/codemirror").Include( "~/Content/CodeMirror/codemirror.css", "~/Content/CodeMirror/theme/tomorrow-night-eighties.css", "~/Content/CodeMirror/theme/the-matrix.css")); bundles.Add(new StyleBundle("~/Content/CodeMirror/codemirrormerge").Include( "~/Content/CodeMirror/addon/merge.css", "~/Content/Contests/submission-view-page.css")); bundles.Add(new StyleBundle("~/Content/Contests/submission-page").Include( "~/Content/Contests/submission-page.css")); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_Start/FilterConfig.cs ================================================ namespace OJS.Web { using System.Web.Mvc; public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_Start/GlimpseSecurityPolicy.cs ================================================ namespace OJS.Web { using Glimpse.AspNet.Extensions; using Glimpse.Core.Extensibility; using OJS.Web.Common.Extensions; public class GlimpseSecurityPolicy : IRuntimePolicy { public RuntimeEvent ExecuteOn => RuntimeEvent.EndRequest | RuntimeEvent.ExecuteResource; public RuntimePolicy Execute(IRuntimePolicyContext policyContext) { // More information about RuntimePolicies can be found at http://getglimpse.com/Help/Custom-Runtime-Policy var httpContext = policyContext.GetHttpContext(); return httpContext.User.IsAdmin() ? RuntimePolicy.On : RuntimePolicy.Off; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_Start/LoggingModule.cs ================================================ namespace OJS.Web { using System.Web.Mvc; using Ninject.Modules; using Ninject.Web.Mvc.FilterBindingSyntax; using OJS.Web.Common.Attributes; public class LoggingModule : NinjectModule { public override void Load() { this.BindFilter(FilterScope.Controller, 0).WhenControllerHas(); this.BindFilter(FilterScope.Action, 0).WhenActionMethodHas(); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_Start/NinjectWebCommon.cs ================================================ [assembly: WebActivatorEx.PreApplicationStartMethod(typeof(OJS.Web.NinjectWebCommon), "Start")] [assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(OJS.Web.NinjectWebCommon), "Stop")] namespace OJS.Web { using System; using System.Web; using Microsoft.Web.Infrastructure.DynamicModuleHelper; using Ninject; using Ninject.Modules; using Ninject.Web.Common; using OJS.Data; using OJS.Workers.Tools.AntiCheat; using OJS.Workers.Tools.AntiCheat.Contracts; using OJS.Workers.Tools.Similarity; using OJS.Workers.Tools.Similarity.Contracts; public static class NinjectWebCommon { private static readonly Bootstrapper Bootstrapper = new Bootstrapper(); /// /// Starts the application /// public static void Start() { DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); Bootstrapper.Initialize(CreateKernel); } /// /// Stops the application. /// public static void Stop() { Bootstrapper.ShutDown(); } /// /// Creates the kernel that will manage your application. /// /// The created kernel. private static IKernel CreateKernel() { var modules = new INinjectModule[] { new LoggingModule() }; var kernel = new StandardKernel(modules); try { kernel.Bind>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.Bind().To(); RegisterServices(kernel); return kernel; } catch { kernel.Dispose(); throw; } } /// /// Load your modules or register your services here! /// /// The kernel. private static void RegisterServices(IKernel kernel) { kernel.Bind().To().InRequestScope(); kernel.Bind().To().InRequestScope(); kernel.Bind().To().InRequestScope(); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_Start/RouteConfig.cs ================================================ namespace OJS.Web { using System.Web.Mvc; using System.Web.Routing; using OJS.Common; using OJS.Web.Controllers; public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // TODO: Unit test this route routes.MapRoute("robots.txt", "robots.txt", new { controller = "Home", action = "RobotsTxt" }, new[] { "OJS.Web.Controllers" }); RegisterRedirectsToOldSystemUrls(routes); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = GlobalConstants.Index, id = UrlParameter.Optional }, namespaces: new[] { "OJS.Web.Controllers" }); } public static void RegisterRedirectsToOldSystemUrls(RouteCollection routes) { for (var i = 0; i < RedirectsController.OldSystemRedirects.Count; i++) { var redirect = RedirectsController.OldSystemRedirects[i]; routes.MapRoute( name: string.Format("RedirectOldSystemUrl_{0}", i), url: redirect.Key, defaults: new { controller = "Redirects", action = GlobalConstants.Index, id = i }, namespaces: new[] { "OJS.Web.Controllers" }); } routes.MapRoute( "RedirectOldSystemUrl_Account_ProfileView", "Account/ProfileView/{id}", new { controller = "Redirects", action = "ProfileView", id = UrlParameter.Optional }, new[] { "OJS.Web.Controllers" }); routes.MapRoute( "RedirectOldSystemUrl_Contest_Compete", "Contest/Compete/{id}", new { controller = "Redirects", action = "ContestCompete", id = UrlParameter.Optional }, new[] { "OJS.Web.Controllers" }); routes.MapRoute( "RedirectOldSystemUrl_Contest_Practice", "Contest/Practice/{id}", new { controller = "Redirects", action = "ContestPractice", id = UrlParameter.Optional }, new[] { "OJS.Web.Controllers" }); routes.MapRoute( "RedirectOldSystemUrl_Contest_ContestResults", "Contest/ContestResults/{id}", new { controller = "Redirects", action = "ContestResults", id = UrlParameter.Optional }, new[] { "OJS.Web.Controllers" }); routes.MapRoute( "RedirectOldSystemUrl_Contest_PracticeResults", "Contest/PracticeResults/{id}", new { controller = "Redirects", action = "PracticeResults", id = UrlParameter.Optional }, new[] { "OJS.Web.Controllers" }); routes.MapRoute( "RedirectOldSystemUrl_Contest_DownloadTask", "Contest/DownloadTask/{id}", new { controller = "Redirects", action = "DownloadTask", id = UrlParameter.Optional }, new[] { "OJS.Web.Controllers" }); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_Start/Settings.cs ================================================ namespace OJS.Web { using System; using System.Configuration; public static class Settings { public static string CSharpCompilerPath => GetSetting("CSharpCompilerPath"); public static string DotNetDisassemblerPath => GetSetting("DotNetDisassemblerPath"); public static string JavaCompilerPath => GetSetting("JavaCompilerPath"); public static string JavaDisassemblerPath => GetSetting("JavaDisassemblerPath"); private static string GetSetting(string settingName) { if (ConfigurationManager.AppSettings[settingName] == null) { throw new Exception($"{settingName} setting not found in App.config file!"); } return ConfigurationManager.AppSettings[settingName]; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_Start/Startup.Auth.cs ================================================ namespace OJS.Web { using Microsoft.AspNet.Identity; using Microsoft.Owin; using Microsoft.Owin.Security.Cookies; using Owin; public partial class Startup { // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864 public void ConfigureAuth(IAppBuilder app) { // Enable the application to use a cookie to store information for the signed in user app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login") }); // Use a cookie to temporarily store information about a user logging in with a third party login provider app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); //// Uncomment the following lines to enable logging in with third party login providers //// app.UseMicrosoftAccountAuthentication( //// clientId: "", //// clientSecret: ""); //// app.UseTwitterAuthentication( //// consumerKey: "", //// consumerSecret: ""); //// app.UseFacebookAuthentication( //// appId: "", //// appSecret: ""); app.UseGoogleAuthentication(); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/App_Start/ViewEngineConfig.cs ================================================ namespace OJS.Web { using System.Web.Mvc; public class ViewEngineConfig { public static void RegisterViewEngines(ViewEngineCollection viewEngines) { viewEngines.Clear(); viewEngines.Add(new RazorViewEngine()); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/AdministrationAreaRegistration.cs ================================================ namespace OJS.Web.Areas.Administration { using System.Web.Mvc; using OJS.Common; public class AdministrationAreaRegistration : AreaRegistration { public override string AreaName => "Administration"; public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Administration_Files_Connector", "Administration/Files/connector", new { action = "FileConnector", controller = "Files" }); context.MapRoute( "Administration_Files_Thumbnails", "Administration/Files/Thumbnails/{tmb}", new { action = "Thumbs", controller = "Files", tmb = UrlParameter.Optional }); context.MapRoute( "Administration_default", "Administration/{controller}/{action}/{id}", new { action = GlobalConstants.Index, id = UrlParameter.Optional }); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/AccessLogsController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Linq; using System.Web.Mvc; using OJS.Data; using OJS.Web.Controllers; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.AccessLogs.AccessLogGridViewModel; public class AccessLogsController : KendoGridAdministrationController { public AccessLogsController(IOjsData data) : base(data) { } [HttpGet] public ActionResult Index() { return this.View(); } public override IEnumerable GetData() { return this.Data.AccessLogs .All() .Select(ViewModelType.ViewModel); } public override object GetById(object id) { return this.Data.AccessLogs.GetById((int)id); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/AntiCheatController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using OJS.Common; using OJS.Common.Extensions; using OJS.Common.Models; using OJS.Data; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.AntiCheat; using OJS.Web.Common; using OJS.Web.Controllers; using OJS.Workers.Tools.AntiCheat; using OJS.Workers.Tools.AntiCheat.Contracts; using OJS.Workers.Tools.Similarity.Contracts; public class AntiCheatController : AdministrationController { private const int MinSubmissionPointsToCheckForSimilarity = 20; private const int RenderSubmissionsSimilaritiesGridTimeOut = 20 * 60; // 20 min. private readonly IPlagiarismDetectorFactory plagiarismDetectorFactory; private readonly ISimilarityFinder similarityFinder; public AntiCheatController( IOjsData data, IPlagiarismDetectorFactory plagiarismDetectorFactory, ISimilarityFinder similarityFinder) : base(data) { this.plagiarismDetectorFactory = plagiarismDetectorFactory; this.similarityFinder = similarityFinder; } public ActionResult ByIp() => this.View(this.GetContestsListItems()); public ActionResult RenderByIpGrid(int id, string excludeIps) { var participantsByIps = this.Data.Participants .All() .Where(p => p.ContestId == id && p.IsOfficial) .Select(AntiCheatByIpAdministrationViewModel.ViewModel) .Where(p => p.DifferentIps.Count() > 1) .ToList(); if (!string.IsNullOrEmpty(excludeIps)) { var withoutExcludeIps = this.Data.Participants.All(); var ipsToExclude = excludeIps.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var ip in ipsToExclude) { withoutExcludeIps = withoutExcludeIps.Where(p => p.ContestId == id && p.IsOfficial && p.Submissions.Count > 1 && p.Submissions .AsQueryable() .Where(s => !s.IsDeleted && s.IpAddress != null) .All(s => s.IpAddress != ip)); } participantsByIps.AddRange(withoutExcludeIps.Select(AntiCheatByIpAdministrationViewModel.ViewModel)); } return this.PartialView("_IpGrid", participantsByIps); } public ActionResult BySubmissionSimilarity() { var plagiarismDetectorTypes = EnumConverter.GetSelectListItems(); var viewModel = new SubmissionSimilarityFiltersInputModel { PlagiarismDetectorTypes = plagiarismDetectorTypes }; return this.View(viewModel); } [HttpPost] public ActionResult RenderSubmissionsSimilaritiesGrid(int[] contestIds, PlagiarismDetectorType plagiarismDetectorType) { this.Server.ScriptTimeout = RenderSubmissionsSimilaritiesGridTimeOut; var participantsSimilarSubmissionGroups = this.GetSimilarSubmissions(contestIds, plagiarismDetectorType) .Select(s => new { s.Id, s.ProblemId, s.ParticipantId, s.Points, s.Content, s.CreatedOn, ParticipantName = s.Participant.User.UserName, ProblemName = s.Problem.Name, TestRuns = s.TestRuns.OrderBy(t => t.TestId).Select(t => new { t.TestId, t.ResultType }) }) .GroupBy(s => new { s.ProblemId, s.ParticipantId }) .Select(g => g.OrderByDescending(s => s.Points).ThenByDescending(s => s.CreatedOn).FirstOrDefault()) .GroupBy(s => new { s.ProblemId, s.Points }) .ToList(); var plagiarismDetector = this.GetPlagiarismDetector(plagiarismDetectorType); var similarities = new List(); for (var index = 0; index < participantsSimilarSubmissionGroups.Count; index++) { var groupOfSubmissions = participantsSimilarSubmissionGroups[index].ToList(); for (var i = 0; i < groupOfSubmissions.Count; i++) { for (var j = i + 1; j < groupOfSubmissions.Count; j++) { var result = plagiarismDetector.DetectPlagiarism( groupOfSubmissions[i].Content.Decompress(), groupOfSubmissions[j].Content.Decompress(), new IDetectPlagiarismVisitor[] { new SortTrimLinesAndRemoveBlankLinesVisitor() }); var firstTestRuns = groupOfSubmissions[i].TestRuns.ToList(); var secondTestRuns = groupOfSubmissions[j].TestRuns.ToList(); // Handle the case when test(s) are added/removed during the contest if (firstTestRuns.Count < secondTestRuns.Count) { secondTestRuns = secondTestRuns .Where(x => firstTestRuns.Any(y => y.TestId == x.TestId)) .OrderBy(x => x.TestId) .ToList(); } else if (firstTestRuns.Count > secondTestRuns.Count) { firstTestRuns = firstTestRuns .Where(x => secondTestRuns.Any(y => y.TestId == x.TestId)) .OrderBy(x => x.TestId) .ToList(); } var save = true; for (var k = 0; k < firstTestRuns.Count; k++) { if (firstTestRuns[k].ResultType != secondTestRuns[k].ResultType) { save = false; break; } } if (save && result.SimilarityPercentage != 0) { similarities.Add(new SubmissionSimilarityViewModel { ProblemName = groupOfSubmissions[i].ProblemName, Points = groupOfSubmissions[i].Points, Differences = result.Differences.Count, Percentage = result.SimilarityPercentage, FirstSubmissionId = groupOfSubmissions[i].Id, FirstParticipantName = groupOfSubmissions[i].ParticipantName, FirstSubmissionCreatedOn = groupOfSubmissions[i].CreatedOn, SecondSubmissionId = groupOfSubmissions[j].Id, SecondParticipantName = groupOfSubmissions[j].ParticipantName, SecondSubmissionCreatedOn = groupOfSubmissions[j].CreatedOn, }); } } } } return this.PartialView("_SubmissionsGrid", similarities.GroupBy(s => s.ProblemName)); } private IEnumerable GetContestsListItems() { var contests = this.Data.Contests .All() .OrderByDescending(c => c.CreatedOn) .Select(c => new { Text = c.Name, Value = c.Id }) .ToList() .Select(c => new SelectListItem { Text = c.Text, Value = c.Value.ToString() }); return contests; } private PlagiarismDetectorCreationContext CreatePlagiarismDetectorCreationContext(PlagiarismDetectorType type) { var result = new PlagiarismDetectorCreationContext(type, this.similarityFinder); switch (type) { case PlagiarismDetectorType.CSharpCompileDisassemble: result.CompilerPath = Settings.CSharpCompilerPath; result.DisassemblerPath = Settings.DotNetDisassemblerPath; break; case PlagiarismDetectorType.JavaCompileDisassemble: result.CompilerPath = Settings.JavaCompilerPath; result.DisassemblerPath = Settings.JavaDisassemblerPath; break; case PlagiarismDetectorType.PlainText: break; } return result; } private IQueryable GetSimilarSubmissions( IEnumerable contestIds, PlagiarismDetectorType plagiarismDetectorType) { var orExpressionContestIds = ExpressionBuilder.BuildOrExpression( contestIds, s => s.Participant.ContestId); var plagiarismDetectorTypeCompatibleCompilerTypes = plagiarismDetectorType.GetCompatibleCompilerTypes(); var orExpressionCompilerTypes = ExpressionBuilder.BuildOrExpression( plagiarismDetectorTypeCompatibleCompilerTypes, s => s.SubmissionType.CompilerType); var result = this.Data.Submissions .All() .Where(orExpressionContestIds) .Where(orExpressionCompilerTypes) .Where(s => s.Participant.IsOfficial && s.Points >= MinSubmissionPointsToCheckForSimilarity); return result; } private IPlagiarismDetector GetPlagiarismDetector(PlagiarismDetectorType type) { var plagiarismDetectorCreationContext = this.CreatePlagiarismDetectorCreationContext(type); var plagiarismDetector = this.plagiarismDetectorFactory.CreatePlagiarismDetector(plagiarismDetectorCreationContext); return plagiarismDetector; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/CheckersController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.UI; using OJS.Data; using OJS.Web.Controllers; using DatabaseModelType = OJS.Data.Models.Checker; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.Checker.CheckerAdministrationViewModel; public class CheckersController : KendoGridAdministrationController { public CheckersController(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.Checkers .All() .Select(ViewModelType.ViewModel); } public override object GetById(object id) { return this.Data.Checkers .All() .FirstOrDefault(o => o.Id == (int)id); } public override string GetEntityKeyName() { return this.GetEntityKeyNameByType(typeof(DatabaseModelType)); } public ActionResult Index() { return this.View(); } [HttpPost] public ActionResult Create([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var databaseModel = model.GetEntityModel(); model.Id = (int)this.BaseCreate(databaseModel); this.UpdateAuditInfoValues(model, databaseModel); return this.GridOperation(request, model); } [HttpPost] public ActionResult Update([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var entity = this.GetById(model.Id) as DatabaseModelType; this.BaseUpdate(model.GetEntityModel(entity)); this.UpdateAuditInfoValues(model, entity); return this.GridOperation(request, model); } [HttpPost] public ActionResult Destroy([DataSourceRequest]DataSourceRequest request, ViewModelType model) { this.BaseDestroy(model.Id); return this.GridOperation(request, model); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/ContestCategoriesController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using OJS.Data; using OJS.Web.Controllers; using DatabaseModelType = OJS.Data.Models.ContestCategory; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.ContestCategory.ContestCategoryAdministrationViewModel; public class ContestCategoriesController : KendoGridAdministrationController { public ContestCategoriesController(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.ContestCategories .All() .Where(cat => !cat.IsDeleted) .Select(ViewModelType.ViewModel); } public override object GetById(object id) { return this.Data.ContestCategories .All() .FirstOrDefault(o => o.Id == (int)id); } public override string GetEntityKeyName() { return this.GetEntityKeyNameByType(typeof(DatabaseModelType)); } public ActionResult Index() { return this.View(); } [HttpPost] public ActionResult Create([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var databaseModel = model.GetEntityModel(); model.Id = (int)this.BaseCreate(databaseModel); this.UpdateAuditInfoValues(model, databaseModel); return this.GridOperation(request, model); } [HttpPost] public ActionResult Update([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var entity = this.GetById(model.Id) as DatabaseModelType; this.BaseUpdate(model.GetEntityModel(entity)); this.UpdateAuditInfoValues(model, entity); return this.GridOperation(request, model); } [HttpPost] public ActionResult Destroy([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var contest = this.Data.ContestCategories.GetById(model.Id.Value); this.CascadeDeleteCategories(contest); return this.Json(this.ModelState.ToDataSourceResult()); } public ActionResult Hierarchy() { return this.View(); } public ActionResult ReadCategories(int? id) { var categories = this.Data.ContestCategories.All() .Where(x => x.IsVisible) .Where(x => id.HasValue ? x.ParentId == id : x.ParentId == null) .OrderBy(x => x.OrderBy) .Select(x => new { id = x.Id, hasChildren = x.Children.Any(), x.Name, }); return this.Json(categories, JsonRequestBehavior.AllowGet); } public void MoveCategory(int id, int? to) { var category = this.Data.ContestCategories.GetById(id); category.ParentId = to; this.Data.SaveChanges(); } private void CascadeDeleteCategories(DatabaseModelType contest) { foreach (var children in contest.Children.ToList()) { this.CascadeDeleteCategories(children); } this.Data.ContestCategories.Delete(contest); this.Data.SaveChanges(); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/ContestQuestionAnswersController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System; using System.Collections; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using OJS.Data; using OJS.Web.Controllers; using DatabaseModelType = OJS.Data.Models.ContestQuestionAnswer; using Resource = Resources.Areas.Administration.Contests.ContestsControllers; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.ContestQuestionAnswer.ContestQuestionAnswerViewModel; public class ContestQuestionAnswersController : KendoGridAdministrationController { private int questionId; public ContestQuestionAnswersController(IOjsData data) : base(data) { } public override IEnumerable GetData() { var answers = this.Data.ContestQuestionAnswers .All() .Where(q => q.QuestionId == this.questionId) .Select(ViewModelType.ViewModel); return answers; } public override object GetById(object id) { var answer = this.Data.ContestQuestionAnswers .All() .FirstOrDefault(q => q.Id == (int)id); return answer; } [HttpPost] public JsonResult AnswersInQuestion([DataSourceRequest]DataSourceRequest request, int id) { this.questionId = id; var answers = this.GetData(); return this.Json(answers.ToDataSourceResult(request)); } [HttpPost] public JsonResult AddAnswerToQuestion([DataSourceRequest]DataSourceRequest request, ViewModelType model, int id) { var question = this.Data.ContestQuestions.All().FirstOrDefault(q => q.Id == id); var answer = model.GetEntityModel(); question.Answers.Add(answer); this.Data.SaveChanges(); this.UpdateViewModelValues(model, answer); model.QuestionId = question.Id; model.QuestionText = question.Text; return this.Json(new[] { model }.ToDataSourceResult(request)); } [HttpPost] public JsonResult UpdateAnswerInQuestion([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var entity = this.GetById(model.AnswerId) as DatabaseModelType; this.BaseUpdate(model.GetEntityModel(entity)); this.UpdateAuditInfoValues(model, entity); return this.GridOperation(request, model); } [HttpPost] public JsonResult DeleteAnswerFromQuestion([DataSourceRequest]DataSourceRequest request, ViewModelType model, int id) { this.Data.ContestQuestionAnswers.Delete(model.AnswerId.Value); this.Data.SaveChanges(); return this.GridOperation(request, model); } public void DeleteAllAnswers(int id) { var question = this.Data.ContestQuestions.GetById(id); if (question == null) { throw new ArgumentException(Resource.No_question_by_id, nameof(id)); } question.Answers.Select(a => a.Id).ToList().Each(a => this.Data.ContestQuestionAnswers.Delete(a)); this.Data.SaveChanges(); } protected void UpdateViewModelValues(ViewModelType viewModel, DatabaseModelType databaseModel) { var entry = this.Data.Context.Entry(databaseModel); viewModel.AnswerId = entry.Property(pr => pr.Id).CurrentValue; this.UpdateAuditInfoValues(viewModel, databaseModel); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/ContestQuestionsController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using OJS.Data; using OJS.Data.Models; using OJS.Web.Controllers; using DatabaseAnswerModelType = OJS.Data.Models.ContestQuestionAnswer; using DatabaseModelType = OJS.Data.Models.ContestQuestion; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.ContestQuestion.ContestQuestionViewModel; public class ContestQuestionsController : KendoGridAdministrationController { private int contestId; public ContestQuestionsController(IOjsData data) : base(data) { } public override IEnumerable GetData() { var questions = this.Data.ContestQuestions .All() .Where(q => q.ContestId == this.contestId) .Select(ViewModelType.ViewModel); return questions; } public override object GetById(object id) { var question = this.Data.ContestQuestions .All() .FirstOrDefault(q => q.Id == (int)id); return question; } [HttpPost] public JsonResult QuestionsInContest([DataSourceRequest]DataSourceRequest request, int id) { this.contestId = id; var questions = this.GetData(); return this.Json(questions.ToDataSourceResult(request)); } [HttpPost] public JsonResult AddQuestionToContest([DataSourceRequest]DataSourceRequest request, ViewModelType model, int id) { var contest = this.Data.Contests.All().FirstOrDefault(c => c.Id == id); var question = model.GetEntityModel(); contest.Questions.Add(question); this.Data.SaveChanges(); this.UpdateAuditInfoValues(model, question); model.QuestionId = this.Data.Context.Entry(question).Property(pr => pr.Id).CurrentValue; model.ContestId = contest.Id; return this.Json(new[] { model }.ToDataSourceResult(request)); } [HttpPost] public JsonResult UpdateQuestionInContest([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var entity = this.GetById(model.QuestionId) as DatabaseModelType; this.BaseUpdate(model.GetEntityModel(entity)); this.UpdateAuditInfoValues(model, entity); return this.GridOperation(request, model); } [HttpPost] public JsonResult DeleteQuestionFromContest([DataSourceRequest]DataSourceRequest request, ViewModelType model) { this.Data.ContestQuestions.Delete(model.QuestionId.Value); this.Data.SaveChanges(); return this.GridOperation(request, model); } public ActionResult CopyFromAnotherContest(int id) { var contests = this.Data.Contests .All() .OrderByDescending(c => c.CreatedOn) .Select(c => new { Text = c.Name, Value = c.Id }); this.ViewBag.ContestId = id; return this.PartialView("_CopyQuestionsFromContest", contests); } public void CopyTo(int id, int contestFrom, bool? deleteOld) { var copyFromContest = this.Data.Contests.GetById(contestFrom); var copyToContest = this.Data.Contests.GetById(id); if (deleteOld.HasValue && deleteOld.Value) { var oldQuestions = copyToContest.Questions.Select(q => q.Id).ToList(); this.DeleteQuestions(oldQuestions); } var questionsToCopy = copyFromContest.Questions.ToList(); this.CopyQuestionsToContest(copyToContest, questionsToCopy); } private void DeleteQuestions(IEnumerable questions) { foreach (var question in questions) { this.Data.ContestQuestions.Delete(question); } this.Data.SaveChanges(); } private void CopyQuestionsToContest(Contest contest, IEnumerable questions) { foreach (var question in questions) { var newQuestion = new DatabaseModelType { Text = question.Text, Type = question.Type, AskOfficialParticipants = question.AskOfficialParticipants, AskPracticeParticipants = question.AskPracticeParticipants, RegularExpressionValidation = question.RegularExpressionValidation }; foreach (var answer in question.Answers) { newQuestion.Answers.Add(new DatabaseAnswerModelType { Text = answer.Text }); } contest.Questions.Add(newQuestion); } this.Data.SaveChanges(); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/ContestsController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Globalization; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.UI; using OJS.Common; using OJS.Common.Extensions; using OJS.Data; using OJS.Web.Areas.Administration.ViewModels.Contest; using OJS.Web.Areas.Administration.ViewModels.SubmissionType; using OJS.Web.Controllers; using Resource = Resources.Areas.Administration.Contests.ContestsControllers; using ShortViewModelType = OJS.Web.Areas.Administration.ViewModels.Contest.ShortContestAdministrationViewModel; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.Contest.ContestAdministrationViewModel; public class ContestsController : KendoGridAdministrationController { public ContestsController(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.Contests .All() .Where(x => !x.IsDeleted) .Select(ViewModelType.ViewModel); } public override object GetById(object id) { return this.Data.Contests .All() .FirstOrDefault(o => o.Id == (int)id); } public ActionResult Index() { return this.View(); } [HttpGet] public ActionResult Create() { var newContest = new ViewModelType { SubmisstionTypes = this.Data.SubmissionTypes.All().Select(SubmissionTypeViewModel.ViewModel).ToList() }; return this.View(newContest); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(ContestAdministrationViewModel model) { if (!this.IsValidContest(model)) { return this.View(model); } if (model != null && this.ModelState.IsValid) { var contest = model.GetEntityModel(); model.SubmisstionTypes.ForEach(s => { if (s.IsChecked) { var submission = this.Data.SubmissionTypes.All().FirstOrDefault(t => t.Id == s.Id); contest.SubmissionTypes.Add(submission); } }); this.Data.Contests.Add(contest); this.Data.SaveChanges(); this.TempData.Add(GlobalConstants.InfoMessage, Resource.Contest_added); return this.RedirectToAction(GlobalConstants.Index); } return this.View(model); } [HttpGet] public ActionResult Edit(int id) { var contest = this.Data.Contests .All() .Where(con => con.Id == id) .Select(ContestAdministrationViewModel.ViewModel) .FirstOrDefault(); if (contest == null) { this.TempData.Add(GlobalConstants.DangerMessage, Resource.Contest_not_found); return this.RedirectToAction(GlobalConstants.Index); } this.Data.SubmissionTypes.All() .Select(SubmissionTypeViewModel.ViewModel) .ForEach(SubmissionTypeViewModel.ApplySelectedTo(contest)); return this.View(contest); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(ContestAdministrationViewModel model) { if (!this.IsValidContest(model)) { return this.View(model); } if (model != null && this.ModelState.IsValid) { var contest = this.Data.Contests.All().FirstOrDefault(c => c.Id == model.Id); if (contest == null) { this.TempData.Add(GlobalConstants.DangerMessage, Resource.Contest_not_found); return this.RedirectToAction(GlobalConstants.Index); } contest = model.GetEntityModel(contest); contest.SubmissionTypes.Clear(); model.SubmisstionTypes.ForEach(s => { if (s.IsChecked) { var submission = this.Data.SubmissionTypes.All().FirstOrDefault(t => t.Id == s.Id); contest.SubmissionTypes.Add(submission); } }); this.Data.Contests.Update(contest); this.Data.SaveChanges(); this.TempData.Add(GlobalConstants.InfoMessage, Resource.Contest_edited); return this.RedirectToAction(GlobalConstants.Index); } return this.View(model); } [HttpPost] public ActionResult Destroy([DataSourceRequest]DataSourceRequest request, ContestAdministrationViewModel model) { this.BaseDestroy(model.Id); return this.GridOperation(request, model); } public ActionResult GetFutureContests([DataSourceRequest]DataSourceRequest request) { var futureContests = this.Data.Contests .AllFuture() .OrderBy(contest => contest.StartTime) .Take(3) .Select(ShortViewModelType.FromContest); if (!futureContests.Any()) { return this.Content(Resource.No_future_contests); } return this.PartialView(GlobalConstants.QuickContestsGrid, futureContests); } public ActionResult GetActiveContests([DataSourceRequest]DataSourceRequest request) { var activeContests = this.Data.Contests .AllActive() .OrderBy(contest => contest.EndTime) .Take(3) .Select(ShortViewModelType.FromContest); if (!activeContests.Any()) { return this.Content(Resource.No_active_contests); } return this.PartialView(GlobalConstants.QuickContestsGrid, activeContests); } public ActionResult GetLatestContests([DataSourceRequest]DataSourceRequest request) { var latestContests = this.Data.Contests .AllVisible() .OrderByDescending(contest => contest.CreatedOn) .Take(3) .Select(ShortViewModelType.FromContest); if (!latestContests.Any()) { return this.Content(Resource.No_latest_contests); } return this.PartialView(GlobalConstants.QuickContestsGrid, latestContests); } public JsonResult GetCategories() { var dropDownData = this.Data.ContestCategories .All() .ToList() .Select(cat => new SelectListItem { Text = cat.Name, Value = cat.Id.ToString(CultureInfo.InvariantCulture) }); return this.Json(dropDownData, JsonRequestBehavior.AllowGet); } private bool IsValidContest(ContestAdministrationViewModel model) { bool isValid = true; if (model.StartTime >= model.EndTime) { this.ModelState.AddModelError(GlobalConstants.DateTimeError, Resource.Contest_start_date_before_end); isValid = false; } if (model.PracticeStartTime >= model.PracticeEndTime) { this.ModelState.AddModelError(GlobalConstants.DateTimeError, Resource.Practice_start_date_before_end); isValid = false; } if (model.SubmisstionTypes == null || !model.SubmisstionTypes.Any(s => s.IsChecked)) { this.ModelState.AddModelError("SelectedSubmissionTypes", Resource.Select_one_submission_type); isValid = false; } return isValid; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/ContestsExportController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.IO; using System.Linq; using System.Text; using System.Web.Mvc; using Ionic.Zip; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using OJS.Common; using OJS.Common.Extensions; using OJS.Common.Models; using OJS.Data; using OJS.Web.Common; using OJS.Web.Controllers; using Resource = Resources.Areas.Administration.Contests.ContestsControllers; public class ContestsExportController : AdministrationController { public ContestsExportController(IOjsData data) : base(data) { } public FileResult Results(int id, bool compete) { var contest = this.Data.Contests.GetById(id); var data = new { contest.Id, contest.Name, Problems = contest.Problems.AsQueryable().OrderBy(x => x.OrderBy).ThenBy(x => x.Name), Questions = contest.Questions.OrderBy(x => x.Id), Results = this.Data.Participants.All() .Where(participant => participant.ContestId == contest.Id && participant.IsOfficial == compete) .Select(participant => new { ParticipantUserName = participant.User.UserName, ParticipantFirstName = participant.User.UserSettings.FirstName, ParticipantLastName = participant.User.UserSettings.LastName, Answers = participant.Answers.OrderBy(answer => answer.ContestQuestionId), ProblemResults = participant.Contest.Problems .Select(problem => new { problem.Id, ProblemName = problem.Name, ProblemOrderBy = problem.OrderBy, ShowResult = problem.ShowResults, BestSubmission = problem.Submissions .Where(z => z.ParticipantId == participant.Id) .OrderByDescending(z => z.Points).ThenByDescending(z => z.Id) .Select(z => new { z.Id, z.Points }) .FirstOrDefault() }) .OrderBy(res => res.ProblemOrderBy).ThenBy(res => res.ProblemName), }) .ToList() .Select(x => new { Data = x, Total = x.ProblemResults.Where(y => y.ShowResult).Sum(y => y.BestSubmission == null ? 0 : y.BestSubmission.Points) }) .OrderByDescending(x => x.Total) }; var workbook = new HSSFWorkbook(); var sheet = workbook.CreateSheet(); // Header var headerRow = sheet.CreateRow(0); int columnNumber = 0; headerRow.CreateCell(columnNumber++).SetCellValue("Username"); headerRow.CreateCell(columnNumber++).SetCellValue("Name"); foreach (var question in data.Questions) { headerRow.CreateCell(columnNumber++).SetCellValue(question.Text); } foreach (var problem in data.Problems) { headerRow.CreateCell(columnNumber++).SetCellValue(problem.Name); } headerRow.CreateCell(columnNumber++).SetCellValue("Total"); // All rows var rowNumber = 1; foreach (var result in data.Results) { var cellNumber = 0; var row = sheet.CreateRow(rowNumber++); row.CreateCell(cellNumber++).SetCellValue(result.Data.ParticipantUserName); row.CreateCell(cellNumber++).SetCellValue(string.Format("{0} {1}", result.Data.ParticipantFirstName, result.Data.ParticipantLastName).Trim()); foreach (var answer in result.Data.Answers) { int answerId; if (answer.ContestQuestion.Type == ContestQuestionType.DropDown && int.TryParse(answer.Answer, out answerId)) { // TODO: N+1 query problem. Optimize it. var answerText = this.Data.ContestQuestionAnswers.All() .Where(x => x.Id == answerId) .Select(x => x.Text) .FirstOrDefault(); row.CreateCell(cellNumber++).SetCellValue(answerText); } else { row.CreateCell(cellNumber++).SetCellValue(answer.Answer); } } foreach (var problemResult in result.Data.ProblemResults) { if (problemResult.BestSubmission != null) { row.CreateCell(cellNumber++).SetCellValue(problemResult.BestSubmission.Points); } else { row.CreateCell(cellNumber++, CellType.Blank); } } row.CreateCell(cellNumber++).SetCellValue(result.Total); } // Auto-size all columns for (var i = 0; i < columnNumber; i++) { sheet.AutoSizeColumn(i); } // Write the workbook to a memory stream var outputStream = new MemoryStream(); workbook.Write(outputStream); // Return the result to the end user return this.File( outputStream.ToArray(), // The binary data of the XLS file GlobalConstants.ExcelMimeType, // MIME type of Excel files string.Format(Resource.Report_excel_format, compete ? Resource.Contest : Resource.Practice, contest.Name)); // Suggested file name in the "Save as" dialog which will be displayed to the end user } public ZipFileResult Solutions(int id, bool compete) { var contest = this.Data.Contests.GetById(id); var problems = contest.Problems.OrderBy(x => x.OrderBy).ThenBy(x => x.Name).ToList(); var participants = this.Data.Participants.All() .Where(x => x.ContestId == id && x.IsOfficial == compete) .Select( x => new { x.Id, x.User.UserName, x.User.Email, StudentsNumber = x.Answers.Select(a => a.Answer).FirstOrDefault(a => a.Length == 7) ?? this.Data.Context.ParticipantAnswers.Where( a => a.Participant.UserId == x.UserId && a.Participant.IsOfficial && a.Answer.Length == 7) .Select(a => a.Answer) .FirstOrDefault() }) .ToList() .OrderBy(x => x.UserName); // Prepare file comment var fileComment = new StringBuilder(); fileComment.AppendLine(string.Format("{1} submissions for {0}", contest.Name, compete ? "Contest" : "Practice")); fileComment.AppendLine(string.Format("Number of participants: {0}", participants.Count())); fileComment.AppendLine(); fileComment.AppendLine("Problems:"); foreach (var problem in problems) { fileComment.AppendLine( string.Format( "{0} - {1} points, time limit: {2:0.000} sec., memory limit: {3:0.00} MB", problem.Name, problem.MaximumPoints, problem.TimeLimit / 1000.0, problem.MemoryLimit / 1024.0 / 1024.0)); } // Prepare zip file var file = new ZipFile { Comment = fileComment.ToString(), AlternateEncoding = Encoding.UTF8, AlternateEncodingUsage = ZipOption.AsNecessary }; // Add participants solutions foreach (var participant in participants) { // Create directory with the participants name var directoryName = string.Format("{0} [{1}] [{2}]", participant.UserName, participant.Email, participant.StudentsNumber) .ToValidFilePath(); file.AddDirectoryByName(directoryName); foreach (var problem in problems) { // Find submission var bestSubmission = this.Data.Submissions.All() .Where( submission => submission.ParticipantId == participant.Id && submission.ProblemId == problem.Id) .OrderByDescending(submission => submission.Points) .ThenByDescending(submission => submission.Id) .FirstOrDefault(); // Create file if submission exists if (bestSubmission != null) { var fileName = string.Format("{0}.{1}", problem.Name, bestSubmission.FileExtension ?? bestSubmission.SubmissionType.FileNameExtension) .ToValidFileName(); var content = bestSubmission.IsBinaryFile ? bestSubmission.Content : bestSubmission.ContentAsString.ToByteArray(); var entry = file.AddEntry(string.Format("{0}\\{1}", directoryName, fileName), content); entry.CreationTime = bestSubmission.CreatedOn; entry.ModifiedTime = bestSubmission.CreatedOn; } } } // Send file to the user var zipFileName = string.Format("{1} submissions for {0}.zip", contest.Name, compete ? "Contest" : "Practice"); return new ZipFileResult(file, zipFileName); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/FeedbackController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.UI; using OJS.Data; using OJS.Web.Controllers; using DatabaseModelType = OJS.Data.Models.FeedbackReport; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.FeedbackReport.FeedbackReportViewModel; public class FeedbackController : KendoGridAdministrationController { public FeedbackController(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.FeedbackReports .All() .Select(ViewModelType.FromFeedbackReport); } public override object GetById(object id) { return this.Data.FeedbackReports .All() .FirstOrDefault(o => o.Id == (int)id); } public override string GetEntityKeyName() { return this.GetEntityKeyNameByType(typeof(DatabaseModelType)); } public ActionResult Index() { return this.View(); } [HttpPost] public ActionResult Create([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var databaseModel = model.GetEntityModel(); model.Id = (int)this.BaseCreate(databaseModel); this.UpdateAuditInfoValues(model, databaseModel); return this.GridOperation(request, model); } [HttpPost] public ActionResult Update([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var entity = this.GetById(model.Id) as DatabaseModelType; this.BaseUpdate(model.GetEntityModel(entity)); this.UpdateAuditInfoValues(model, entity); return this.GridOperation(request, model); } [HttpPost] public ActionResult Destroy([DataSourceRequest]DataSourceRequest request, ViewModelType model) { this.BaseDestroy(model.Id); return this.GridOperation(request, model); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/NavigationController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Web.Mvc; using OJS.Data; using OJS.Web.Controllers; public class NavigationController : AdministrationController { public NavigationController(IOjsData data) : base(data) { } public ActionResult Index() { return this.View(); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/NewsController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.UI; using OJS.Common; using OJS.Data; using OJS.Web.Areas.Administration.Providers; using OJS.Web.Areas.Administration.Providers.Contracts; using OJS.Web.Controllers; using Resources.News.Views; using DatabaseModelType = OJS.Data.Models.News; using Resource = Resources.News; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.News.NewsAdministrationViewModel; public class NewsController : KendoGridAdministrationController { public NewsController(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.News.All() .Where(news => !news.IsDeleted) .Select(ViewModelType.ViewModel); } public override object GetById(object id) { return this.Data.News .All() .FirstOrDefault(o => o.Id == (int)id); } public override string GetEntityKeyName() { return this.GetEntityKeyNameByType(typeof(DatabaseModelType)); } public ActionResult Index() { return this.View(); } [HttpPost] public ActionResult Create([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var databaseModel = model.GetEntityModel(); model.Id = (int)this.BaseCreate(databaseModel); this.UpdateAuditInfoValues(model, databaseModel); return this.GridOperation(request, model); } [HttpPost] public ActionResult Update([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var entity = this.GetById(model.Id) as DatabaseModelType; this.BaseUpdate(model.GetEntityModel(entity)); this.UpdateAuditInfoValues(model, entity); return this.GridOperation(request, model); } [HttpPost] public ActionResult Destroy([DataSourceRequest]DataSourceRequest request, ViewModelType model) { this.BaseDestroy(model.Id); return this.GridOperation(request, model); } public ActionResult Fetch() { var providers = new List { new InfoManNewsProvider(), new InfosNewsProvider() }; var allNews = new List(); foreach (var newsProvider in providers) { allNews.AddRange(newsProvider.FetchNews()); } this.PopulateDatabaseWithNews(allNews); this.TempData[GlobalConstants.InfoMessage] = All.News_successfully_added; return this.RedirectToAction("All", "News", new { Area = string.Empty }); } private void PopulateDatabaseWithNews(IEnumerable fetchedNews) { foreach (var news in fetchedNews) { if (!string.IsNullOrEmpty(news.Title) && !string.IsNullOrEmpty(news.Content) && news.Content.Length > 10 && !this.Data.News.All().Any(existingNews => existingNews.Title == news.Title)) { this.Data.News.Add(news); } this.Data.SaveChanges(); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/ParticipantsController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using Newtonsoft.Json; using OJS.Common; using OJS.Data; using OJS.Web.Areas.Administration.ViewModels.Participant; using OJS.Web.Controllers; using AnswerViewModelType = OJS.Web.Areas.Administration.ViewModels.Participant.ParticipantAnswerViewModel; using DatabaseModelType = OJS.Data.Models.Participant; using GlobalResource = Resources.Areas.Administration.Problems.ProblemsControllers; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.Participant.ParticipantAdministrationViewModel; public class ParticipantsController : KendoGridAdministrationController { public ParticipantsController(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.Participants .All() .Select(ViewModelType.ViewModel); } public override object GetById(object id) { return this.Data.Participants .All() .FirstOrDefault(o => o.Id == (int)id); } public override string GetEntityKeyName() { return this.GetEntityKeyNameByType(typeof(DatabaseModelType)); } public ActionResult Index() { return this.View(); } public ActionResult Contest(int id) { return this.View(id); } [HttpPost] public ActionResult ReadParticipants([DataSourceRequest]DataSourceRequest request, int? id) { if (id == null) { return this.Read(request); } var participants = this.Data.Participants .All() .Where(p => p.ContestId == id) .Select(ViewModelType.ViewModel); var serializationSettings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; var json = JsonConvert.SerializeObject(participants.ToDataSourceResult(request), Formatting.None, serializationSettings); return this.Content(json, GlobalConstants.JsonMimeType); } [HttpPost] public ActionResult Create([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var contest = this.Data.Contests.All().FirstOrDefault(c => c.Id == model.ContestId); var user = this.Data.Users.All().FirstOrDefault(u => u.Id == model.UserId); if (contest == null || user == null) { if (contest == null) { this.ModelState.AddModelError("ContestId", GlobalResource.Invalid_contest); } if (user == null) { this.ModelState.AddModelError("UserId", GlobalResource.Invalid_user); } return this.GridOperation(request, model); } var participant = model.GetEntityModel(); participant.Contest = contest; participant.User = user; model.Id = (int)this.BaseCreate(participant); model.UserName = user.UserName; model.ContestName = contest.Name; this.UpdateAuditInfoValues(model, participant); return this.GridOperation(request, model); } [HttpPost] public ActionResult Destroy([DataSourceRequest]DataSourceRequest request, ViewModelType model) { this.BaseDestroy(model.Id); return this.GridOperation(request, model); } public JsonResult Contests(string text) { var contests = this.Data.Contests .All() .Select(ContestViewModel.ViewModel); if (!string.IsNullOrEmpty(text)) { contests = contests.Where(c => c.Name.ToLower().Contains(text.ToLower())); } return this.Json(contests, JsonRequestBehavior.AllowGet); } public JsonResult Users(string text) { var users = this.Data.Users .All() .Select(UserViewModel.ViewModel); if (!string.IsNullOrEmpty(text)) { users = users.Where(c => c.Name.ToLower().Contains(text.ToLower())); } return this.Json(users, JsonRequestBehavior.AllowGet); } public ActionResult RenderGrid(int? id) { return this.PartialView("_Participants", id); } [HttpGet] public FileResult ExportToExcelByContest(DataSourceRequest request, int contestId) { var data = ((IEnumerable)this.GetData()).Where(p => p.ContestId == contestId); return this.ExportToExcel(request, data); } [HttpPost] public JsonResult Answers([DataSourceRequest]DataSourceRequest request, int id) { var answers = this.Data.Participants .GetById(id) .Answers .AsQueryable() .Select(AnswerViewModelType.ViewModel); return this.Json(answers.ToDataSourceResult(request)); } public JsonResult UpdateParticipantAnswer([DataSourceRequest]DataSourceRequest request, AnswerViewModelType model) { var participantAnswer = this.Data.Participants .GetById(model.ParticipantId) .Answers .First(a => a.ContestQuestionId == model.ContestQuestionId); participantAnswer.Answer = model.Answer; participantAnswer.Participant = this.Data.Participants.GetById(model.ParticipantId); participantAnswer.ContestQuestion = this.Data.ContestQuestions.GetById(model.ContestQuestionId); this.Data.SaveChanges(); return this.GridOperation(request, model); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/ProblemsController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using OJS.Common; using OJS.Common.Extensions; using OJS.Common.Models; using OJS.Data; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Contest; using OJS.Web.Areas.Administration.ViewModels.Problem; using OJS.Web.Areas.Administration.ViewModels.ProblemResource; using OJS.Web.Areas.Administration.ViewModels.Submission; using OJS.Web.Common; using OJS.Web.Common.Extensions; using OJS.Web.Common.ZippedTestManipulator; using OJS.Web.Controllers; using GlobalResource = Resources.Areas.Administration.Problems.ProblemsControllers; public class ProblemsController : AdministrationController { public ProblemsController(IOjsData data) : base(data) { } public ActionResult Index() { return this.View(); } public ActionResult Contest(int? id) { this.ViewBag.ContestId = id; return this.View(GlobalConstants.Index); } public ActionResult Resource(int? id) { var problem = this.Data.Problems .All() .FirstOrDefault(pr => pr.Id == id); if (problem == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } this.ViewBag.ContestId = problem.ContestId; this.ViewBag.ProblemId = problem.Id; return this.View(GlobalConstants.Index); } [HttpGet] public ActionResult Create(int? id) { if (id == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_contest); return this.RedirectToAction(GlobalConstants.Index); } var contest = this.Data.Contests.All().FirstOrDefault(x => x.Id == id); if (contest == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_contest); return this.RedirectToAction(GlobalConstants.Index); } var checkers = this.Data.Checkers.All() .Select(x => x.Name); var lastOrderBy = -1; var lastProblem = this.Data.Problems.All().Where(x => x.ContestId == id); if (lastProblem.Any()) { lastOrderBy = lastProblem.Max(x => x.OrderBy); } var problem = new DetailedProblemViewModel { Name = "Име", MaximumPoints = 100, TimeLimit = 100, MemoryLimit = 16777216, AvailableCheckers = this.Data.Checkers.All().Select(checker => new SelectListItem { Text = checker.Name, Value = checker.Name }), OrderBy = lastOrderBy + 1, ContestId = contest.Id, ContestName = contest.Name, ShowResults = true, ShowDetailedFeedback = false, }; return this.View(problem); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(int id, HttpPostedFileBase testArchive, DetailedProblemViewModel problem) { if (problem.Resources != null && problem.Resources.Any()) { var validResources = problem.Resources .All(res => !string.IsNullOrEmpty(res.Name) && ((res.Type == ProblemResourceType.AuthorsSolution && res.File != null && res.File.ContentLength > 0) || (res.Type == ProblemResourceType.ProblemDescription && res.File != null && res.File.ContentLength > 0) || (res.Type == ProblemResourceType.Video && !string.IsNullOrEmpty(res.Link)))); if (!validResources) { this.ModelState.AddModelError("Resources", GlobalResource.Resources_not_complete); } } if (this.ModelState.IsValid) { var newProblem = new Problem { Name = problem.Name, ContestId = id, MaximumPoints = problem.MaximumPoints, MemoryLimit = problem.MemoryLimit, TimeLimit = problem.TimeLimit, SourceCodeSizeLimit = problem.SourceCodeSizeLimit, ShowResults = problem.ShowResults, ShowDetailedFeedback = problem.ShowDetailedFeedback, OrderBy = problem.OrderBy, Checker = this.Data.Checkers.All().FirstOrDefault(x => x.Name == problem.Checker) }; if (problem.Resources != null && problem.Resources.Any()) { this.AddResourcesToProblem(newProblem, problem.Resources); } if (testArchive != null && testArchive.ContentLength != 0) { try { this.AddTestsToProblem(newProblem, testArchive); } catch (Exception ex) { // TempData is not working with return this.View var systemMessages = new SystemMessageCollection { new SystemMessage { Content = ex.Message, Type = SystemMessageType.Error, Importance = 0 } }; this.ViewBag.SystemMessages = systemMessages; problem.AvailableCheckers = this.Data.Checkers.All().Select(checker => new SelectListItem { Text = checker.Name, Value = checker.Name }); return this.View(problem); } } this.Data.Problems.Add(newProblem); this.Data.SaveChanges(); this.TempData.AddInfoMessage(GlobalResource.Problem_added); return this.RedirectToAction("Contest", new { id }); } problem.AvailableCheckers = this.Data.Checkers.All().Select(checker => new SelectListItem { Text = checker.Name, Value = checker.Name }); return this.View(problem); } [HttpGet] public ActionResult Edit(int? id) { if (id == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } // TODO: Fix this query to use the static method from DetailedProblemViewModel var selectedProblem = this.Data.Problems.All() .Where(x => x.Id == id) .Select(problem => new DetailedProblemViewModel { Id = problem.Id, Name = problem.Name, ContestId = problem.ContestId, ContestName = problem.Contest.Name, TrialTests = problem.Tests.AsQueryable().Count(x => x.IsTrialTest), CompeteTests = problem.Tests.AsQueryable().Count(x => !x.IsTrialTest), MaximumPoints = problem.MaximumPoints, TimeLimit = problem.TimeLimit, MemoryLimit = problem.MemoryLimit, ShowResults = problem.ShowResults, ShowDetailedFeedback = problem.ShowDetailedFeedback, SourceCodeSizeLimit = problem.SourceCodeSizeLimit, Checker = problem.Checker.Name, OrderBy = problem.OrderBy }) .FirstOrDefault(); if (selectedProblem == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } var checkers = this.Data.Checkers .All() .AsQueryable() .Select(checker => new SelectListItem { Text = checker.Name, Value = checker.Name }); selectedProblem.AvailableCheckers = checkers; return this.View(selectedProblem); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(int id, DetailedProblemViewModel problem) { if (problem != null && this.ModelState.IsValid) { var existingProblem = this.Data.Problems.All() .FirstOrDefault(x => x.Id == id); existingProblem.Name = problem.Name; existingProblem.MaximumPoints = problem.MaximumPoints; existingProblem.TimeLimit = problem.TimeLimit; existingProblem.MemoryLimit = problem.MemoryLimit; existingProblem.SourceCodeSizeLimit = problem.SourceCodeSizeLimit; existingProblem.ShowResults = problem.ShowResults; existingProblem.ShowDetailedFeedback = problem.ShowDetailedFeedback; existingProblem.Checker = this.Data.Checkers.All().FirstOrDefault(x => x.Name == problem.Checker); existingProblem.OrderBy = problem.OrderBy; this.Data.SaveChanges(); this.TempData.AddInfoMessage(GlobalResource.Problem_edited); return this.RedirectToAction("Contest", new { id = existingProblem.ContestId }); } problem.AvailableCheckers = this.Data.Checkers.All().Select(checker => new SelectListItem { Text = checker.Name, Value = checker.Name }); return this.View(problem); } [HttpGet] public ActionResult Delete(int? id) { if (id == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } var selectedProblem = this.Data.Problems.All() .Where(x => x.Id == id) .Select(problem => new DetailedProblemViewModel { Id = problem.Id, Name = problem.Name, ContestId = problem.ContestId, ContestName = problem.Contest.Name, TrialTests = problem.Tests.AsQueryable().Count(x => x.IsTrialTest), CompeteTests = problem.Tests.AsQueryable().Count(x => !x.IsTrialTest), MaximumPoints = problem.MaximumPoints, TimeLimit = problem.TimeLimit, MemoryLimit = problem.MemoryLimit, SourceCodeSizeLimit = problem.SourceCodeSizeLimit, Checker = problem.Checker.Name, OrderBy = problem.OrderBy, ShowResults = problem.ShowResults, ShowDetailedFeedback = problem.ShowDetailedFeedback }) .FirstOrDefault(); if (selectedProblem == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } return this.View(selectedProblem); } public ActionResult ConfirmDelete(int? id) { if (id == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } var problem = this.Data.Problems.All() .FirstOrDefault(x => x.Id == id); if (problem == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } foreach (var resource in problem.Resources.ToList()) { this.Data.Resources.Delete(resource.Id); } foreach (var submission in problem.Submissions.ToList()) { this.Data.TestRuns.DeleteBySubmissionId(submission.Id); this.Data.Submissions.Delete(submission.Id); } this.Data.Problems.Delete(id.Value); this.Data.SaveChanges(); this.TempData.AddInfoMessage(GlobalResource.Problem_deleted); return this.RedirectToAction("Contest", new { id = problem.ContestId }); } [HttpGet] public ActionResult DeleteAll(int? id) { if (id == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_contest); return this.RedirectToAction(GlobalConstants.Index); } var contest = this.Data.Contests.All() .Where(x => x.Id == id) .Select(ContestAdministrationViewModel.ViewModel) .FirstOrDefault(); if (contest == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_contest); return this.RedirectToAction(GlobalConstants.Index); } return this.View(contest); } public ActionResult ConfirmDeleteAll(int? id) { if (id == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_contest); return this.RedirectToAction(GlobalConstants.Index); } var contest = this.Data.Contests.All() .FirstOrDefault(x => x.Id == id); if (contest == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_contest); return this.RedirectToAction(GlobalConstants.Index); } // TODO: check for N + 1 foreach (var problem in contest.Problems.ToList()) { // TODO: Add cascading deletion of submissions, tests, resources this.Data.Problems.Delete(problem.Id); } this.Data.SaveChanges(); this.TempData.AddInfoMessage(GlobalResource.Problems_deleted); return this.RedirectToAction("Contest", new { id }); } public ActionResult Details(int? id) { if (id == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } var problem = this.Data.Problems.All() .Where(pr => pr.Id == id) .Select(DetailedProblemViewModel.FromProblem) .FirstOrDefault(); if (problem == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } return this.View(problem); } public ActionResult Retest(int? id) { if (id == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } var problem = this.Data.Problems .All() .FirstOrDefault(pr => pr.Id == id); if (problem == null) { this.TempData.AddDangerMessage(GlobalResource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } this.Data.Submissions.All().Where(s => s.ProblemId == id).Select(s => s.Id).ForEach(this.RetestSubmission); this.Data.SaveChanges(); this.TempData.AddInfoMessage(GlobalResource.Problem_retested); return this.RedirectToAction("Contest", new { id = problem.ContestId }); } [HttpGet] public ActionResult GetSubmissions(int id) { return this.PartialView("_SubmissionsGrid", id); } [HttpPost] public JsonResult ReadSubmissions([DataSourceRequest]DataSourceRequest request, int id) { var submissions = this.Data.Submissions .All() .Where(s => s.ProblemId == id) .Select(SubmissionAdministrationGridViewModel.ViewModel); return this.Json(submissions.ToDataSourceResult(request)); } [HttpGet] public ActionResult GetResources(int id) { return this.PartialView("_ResourcesGrid", id); } [HttpPost] public ActionResult ReadResources([DataSourceRequest]DataSourceRequest request, int id) { var resources = this.Data.Resources .All() .Where(r => r.ProblemId == id) .Select(ProblemResourceGridViewModel.FromResource); return this.Json(resources.ToDataSourceResult(request)); } [HttpGet] public JsonResult ByContest(int id) { var result = this.GetData(id); return this.Json(result, JsonRequestBehavior.AllowGet); } [HttpGet] public JsonResult GetCascadeCategories() { var result = this.Data.ContestCategories.All().Select(x => new { x.Id, x.Name }); return this.Json(result, JsonRequestBehavior.AllowGet); } [HttpGet] public JsonResult GetCascadeContests(string categories) { var contests = this.Data.Contests.All(); int categoryId; if (int.TryParse(categories, out categoryId)) { contests = contests.Where(x => x.CategoryId == categoryId); } var result = contests.Select(x => new { x.Id, x.Name }); return this.Json(result, JsonRequestBehavior.AllowGet); } [HttpGet] public JsonResult GetSearchedContests() { var result = this.Data.Contests.All().Select(x => new { x.Id, x.Name }); return this.Json(result, JsonRequestBehavior.AllowGet); } [HttpGet] public JsonResult GetContestInformation(string id) { // TODO: Add validation for Id var contestIdNumber = int.Parse(id); var contest = this.Data.Contests.All().FirstOrDefault(x => x.Id == contestIdNumber); var contestId = contestIdNumber; var categoryId = contest.CategoryId; var result = new { contest = contestId, category = categoryId }; return this.Json(result, JsonRequestBehavior.AllowGet); } [HttpGet] public FileResult ExportToExcel([DataSourceRequest] DataSourceRequest request, int contestId) { return this.ExportToExcel(request, this.GetData(contestId)); } // TODO: Transfer to ResourcesController public ActionResult AddResourceForm(int id) { // TODO: Add validation for Id var resourceViewModel = new ProblemResourceViewModel { Id = id, AllTypes = Enum.GetValues(typeof(ProblemResourceType)).Cast().Select(v => new SelectListItem { Text = v.GetDescription(), Value = ((int)v).ToString() }) }; return this.PartialView("_ProblemResourceForm", resourceViewModel); } private IEnumerable GetData(int id) { var result = this.Data.Problems.All() .Where(x => x.ContestId == id) .OrderBy(x => x.Name) .Select(DetailedProblemViewModel.FromProblem); return result; } private void AddResourcesToProblem(Problem problem, IEnumerable resources) { var orderCount = 0; foreach (var resource in resources) { if (!string.IsNullOrEmpty(resource.Name) && resource.Type == ProblemResourceType.Video && resource.Link != null) { problem.Resources.Add(new ProblemResource { Name = resource.Name, Type = resource.Type, OrderBy = orderCount, Link = resource.Link, }); orderCount++; } else if (!string.IsNullOrEmpty(resource.Name) && resource.Type != ProblemResourceType.Video && resource.File != null) { problem.Resources.Add(new ProblemResource { Name = resource.Name, Type = resource.Type, OrderBy = orderCount, File = resource.File.InputStream.ToByteArray(), FileExtension = resource.FileExtension }); orderCount++; } } } private void AddTestsToProblem(Problem problem, HttpPostedFileBase testArchive) { var extension = testArchive.FileName.Substring(testArchive.FileName.Length - 4, 4); if (extension != GlobalConstants.ZipFileExtension) { throw new ArgumentException(GlobalResource.Must_be_zip_file); } using (var memory = new MemoryStream()) { testArchive.InputStream.CopyTo(memory); memory.Position = 0; var parsedTests = ZippedTestsManipulator.Parse(memory); if (parsedTests.ZeroInputs.Count != parsedTests.ZeroOutputs.Count || parsedTests.Inputs.Count != parsedTests.Outputs.Count) { throw new ArgumentException(GlobalResource.Invalid_tests); } ZippedTestsManipulator.AddTestsToProblem(problem, parsedTests); } } private void RetestSubmission(int submissionId) { var submission = new Submission { Id = submissionId, Processed = false, Processing = false }; this.Data.Context.Submissions.Attach(submission); var entry = this.Data.Context.Entry(submission); entry.Property(pr => pr.Processed).IsModified = true; entry.Property(pr => pr.Processing).IsModified = true; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/ResourcesController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Linq; using System.Net.Mime; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using OJS.Common; using OJS.Common.Extensions; using OJS.Common.Models; using OJS.Data; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.ProblemResource; using OJS.Web.Common; using OJS.Web.Common.Extensions; using OJS.Web.Controllers; using Resource = Resources.Areas.Administration.Resources.ResourcesControllers; public class ResourcesController : AdministrationController { public ResourcesController(IOjsData data) : base(data) { } public JsonResult GetAll(int id, [DataSourceRequest] DataSourceRequest request) { var resources = this.Data.Resources .All() .Where(res => res.ProblemId == id) .OrderBy(res => res.OrderBy) .Select(ProblemResourceGridViewModel.FromResource); return this.Json(resources.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); } [HttpGet] public ActionResult Create(int id) { var problem = this.Data.Problems.All().FirstOrDefault(pr => pr.Id == id); if (problem == null) { this.TempData.AddDangerMessage(Resource.Problem_not_found); return this.RedirectToAction(GlobalConstants.Index, "Problems"); } int orderBy; var resources = problem.Resources.Where(res => !res.IsDeleted); if (!resources.Any()) { orderBy = 0; } else { orderBy = resources.Max(res => res.OrderBy) + 1; } var resource = new ProblemResourceViewModel { ProblemId = id, ProblemName = problem.Name, OrderBy = orderBy, AllTypes = EnumConverter.GetSelectListItems() }; return this.View(resource); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(int id, ProblemResourceViewModel resource) { if (resource == null) { this.TempData.AddDangerMessage(Resource.Invalid_resource); return this.RedirectToAction("Resource", "Problems", new { id }); } if (resource.Type == ProblemResourceType.Video && string.IsNullOrEmpty(resource.Link)) { this.ModelState.AddModelError("Link", Resource.Link_not_empty); } else if (resource.Type != ProblemResourceType.Video && (resource.File == null || resource.File.ContentLength == 0)) { this.ModelState.AddModelError("File", Resource.File_required); } if (this.ModelState.IsValid) { var problem = this.Data.Problems .All() .FirstOrDefault(x => x.Id == id); if (problem == null) { this.TempData.AddDangerMessage(Resource.Problem_not_found); return this.RedirectToAction(GlobalConstants.Index, "Problems"); } var newResource = new ProblemResource { Name = resource.Name, Type = resource.Type, OrderBy = resource.OrderBy, }; if (resource.Type == ProblemResourceType.Video) { newResource.Link = resource.Link; } else { newResource.File = resource.File.InputStream.ToByteArray(); newResource.FileExtension = resource.FileExtension; } problem.Resources.Add(newResource); this.Data.SaveChanges(); return this.RedirectToAction("Resource", "Problems", new { id }); } resource.AllTypes = EnumConverter.GetSelectListItems(); return this.View(resource); } [HttpGet] public ActionResult Edit(int? id) { if (id == null) { this.TempData.AddDangerMessage(Resource.Problem_not_found); return this.RedirectToAction(GlobalConstants.Index, "Problems"); } var existingResource = this.Data.Resources.All() .Where(res => res.Id == id) .Select(ProblemResourceViewModel.FromProblemResource) .FirstOrDefault(); if (existingResource == null) { this.TempData.AddDangerMessage(Resource.Problem_not_found); return this.RedirectToAction(GlobalConstants.Index, "Problems"); } existingResource.AllTypes = EnumConverter.GetSelectListItems(); return this.View(existingResource); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(int? id, ProblemResourceViewModel resource) { if (id == null) { this.TempData.AddDangerMessage(Resource.Problem_not_found); return this.RedirectToAction(GlobalConstants.Index, "Problems"); } if (this.ModelState.IsValid) { var existingResource = this.Data.Resources .All() .FirstOrDefault(res => res.Id == id); if (existingResource == null) { this.TempData.AddDangerMessage(Resource.Resource_not_found); return this.RedirectToAction(GlobalConstants.Index, "Problems"); } existingResource.Name = resource.Name; existingResource.Type = resource.Type; existingResource.OrderBy = resource.OrderBy; if (existingResource.Type == ProblemResourceType.Video && !string.IsNullOrEmpty(resource.Link)) { existingResource.Link = resource.Link; } else if (resource.Type != ProblemResourceType.Video && resource.File != null && resource.File.ContentLength > 0) { existingResource.File = resource.File.InputStream.ToByteArray(); existingResource.FileExtension = resource.FileExtension; } this.Data.SaveChanges(); return this.RedirectToAction("Resource", "Problems", new { id = existingResource.ProblemId }); } resource.AllTypes = EnumConverter.GetSelectListItems(); return this.View(resource); } [HttpGet] public JsonResult Delete(ProblemResourceGridViewModel resource, [DataSourceRequest] DataSourceRequest request) { this.Data.Resources.Delete(resource.Id); this.Data.SaveChanges(); return this.Json(new[] { resource }.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); } public ActionResult Download(int id) { var resource = this.Data.Resources .All() .FirstOrDefault(res => res.Id == id); var problem = this.Data.Problems .All() .FirstOrDefault(pr => pr.Id == resource.ProblemId); if (problem == null) { this.TempData.AddDangerMessage(Resource.Problem_not_found); return this.RedirectToAction(GlobalConstants.Index, "Problems"); } if (resource == null) { this.TempData.AddDangerMessage(Resource.Resource_not_found); return this.Redirect("/Administration/Problems/Contest/" + resource.Problem.ContestId); } var fileResult = resource.File.ToStream(); var fileName = "Resource-" + resource.Id + "-" + problem.Name.Replace(" ", string.Empty) + "." + resource.FileExtension; return this.File(fileResult, MediaTypeNames.Application.Octet, fileName); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/RolesController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System; using System.Collections; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using Microsoft.AspNet.Identity.EntityFramework; using OJS.Data; using OJS.Web.Areas.Administration.ViewModels.Roles; using OJS.Web.Controllers; using DatabaseModelType = Microsoft.AspNet.Identity.EntityFramework.IdentityRole; using DetailModelType = OJS.Web.Areas.Administration.ViewModels.Roles.UserInRoleAdministrationViewModel; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.Roles.RoleAdministrationViewModel; public class RolesController : KendoGridAdministrationController { private const string EntityKeyName = "Id"; public RolesController(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.Roles .All() .Select(ViewModelType.ViewModel); } public override object GetById(object id) { return this.Data.Roles .All() .FirstOrDefault(o => o.Id == (string)id); } public override string GetEntityKeyName() { return EntityKeyName; } public ActionResult Index() { return this.View(); } [HttpPost] public ActionResult Create([DataSourceRequest]DataSourceRequest request, ViewModelType model) { model.RoleId = Guid.NewGuid().ToString(); this.BaseCreate(model.GetEntityModel()); return this.GridOperation(request, model); } [HttpPost] public ActionResult Update([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var entity = this.GetById(model.RoleId) as DatabaseModelType; this.BaseUpdate(model.GetEntityModel(entity)); return this.GridOperation(request, model); } [HttpPost] public ActionResult Destroy([DataSourceRequest]DataSourceRequest request, ViewModelType model) { this.BaseDestroy(model.RoleId); return this.GridOperation(request, model); } [HttpPost] public JsonResult UsersInRole([DataSourceRequest]DataSourceRequest request, string id) { var users = this.Data.Users .All() .Where(u => u.Roles.Any(r => r.RoleId == id)) .Select(DetailModelType.ViewModel); return this.Json(users.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); } public ActionResult AvailableUsersForRole(string text) { var users = this.Data.Users.All(); if (!string.IsNullOrEmpty(text)) { users = users.Where(u => u.UserName.ToLower().Contains(text.ToLower())); } var result = users .ToList() .Select(pr => new SelectListItem { Text = pr.UserName, Value = pr.Id, }); return this.Json(result, JsonRequestBehavior.AllowGet); } [HttpPost] public ActionResult AddUserToRole([DataSourceRequest]DataSourceRequest request, string id, string userId) { var user = this.Data.Users.GetById(userId); var role = this.Data.Roles.All().FirstOrDefault(r => r.Id == id); user.Roles.Add(new IdentityUserRole { RoleId = role.Id, UserId = userId }); this.Data.SaveChanges(); var result = new UserInRoleAdministrationViewModel { UserId = user.Id, UserName = user.UserName, FirstName = user.UserSettings.FirstName, LastName = user.UserSettings.LastName, Email = user.Email }; return this.Json(new[] { result }.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); } [HttpPost] public ActionResult DeleteUserFromRole([DataSourceRequest]DataSourceRequest request, string id, DetailModelType model) { var user = this.Data.Users.GetById(model.UserId); var role = user.Roles.FirstOrDefault(r => r.RoleId == id); user.Roles.Remove(role); this.Data.SaveChanges(); return this.Json(this.ModelState.ToDataSourceResult()); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/SettingsController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.UI; using OJS.Data; using OJS.Web.Controllers; using DatabaseModelType = OJS.Data.Models.Setting; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.Setting.SettingAdministrationViewModel; public class SettingsController : KendoGridAdministrationController { public SettingsController(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.Settings .All() .Select(ViewModelType.ViewModel); } public override object GetById(object id) { return this.Data.Settings .All() .FirstOrDefault(o => o.Name == (string)id); } public override string GetEntityKeyName() { return this.GetEntityKeyNameByType(typeof(DatabaseModelType)); } public ActionResult Index() { return this.View(); } [HttpPost] public ActionResult Create([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var id = this.BaseCreate(model.GetEntityModel()); model.Name = (string)id; return this.GridOperation(request, model); } [HttpPost] public ActionResult Update([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var entity = this.GetById(model.Name) as DatabaseModelType; this.BaseUpdate(model.GetEntityModel(entity)); return this.GridOperation(request, model); } [HttpPost] public ActionResult Destroy([DataSourceRequest]DataSourceRequest request, ViewModelType model) { this.BaseDestroy(model.Name); return this.GridOperation(request, model); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/SubmissionTypesController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.UI; using OJS.Data; using OJS.Web.Controllers; using DatabaseModelType = OJS.Data.Models.SubmissionType; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.SubmissionType.SubmissionTypeAdministrationViewModel; public class SubmissionTypesController : KendoGridAdministrationController { public SubmissionTypesController(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.SubmissionTypes .All() .Select(ViewModelType.ViewModel); } public override object GetById(object id) { return this.Data.SubmissionTypes .All() .FirstOrDefault(o => o.Id == (int)id); } public override string GetEntityKeyName() { return this.GetEntityKeyNameByType(typeof(DatabaseModelType)); } public ActionResult Index() { return this.View(); } [HttpPost] public ActionResult Create([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var databaseModel = model.GetEntityModel(); model.Id = (int)this.BaseCreate(databaseModel); return this.GridOperation(request, model); } [HttpPost] public ActionResult Update([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var entity = this.GetById(model.Id) as DatabaseModelType; this.BaseUpdate(model.GetEntityModel(entity)); return this.GridOperation(request, model); } [HttpPost] public ActionResult Destroy([DataSourceRequest]DataSourceRequest request, ViewModelType model) { this.BaseDestroy(model.Id); return this.GridOperation(request, model); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/SubmissionsController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.UI; using OJS.Common; using OJS.Data; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Submission; using OJS.Web.Common.Extensions; using OJS.Web.Controllers; using DatabaseModelType = OJS.Data.Models.Submission; using GridModelType = OJS.Web.Areas.Administration.ViewModels.Submission.SubmissionAdministrationGridViewModel; using ModelType = OJS.Web.Areas.Administration.ViewModels.Submission.SubmissionAdministrationViewModel; using Resource = Resources.Areas.Administration.Submissions.SubmissionsControllers; public class SubmissionsController : KendoGridAdministrationController { private int? contestId; public SubmissionsController(IOjsData data) : base(data) { } public override IEnumerable GetData() { var submissions = this.Data.Submissions.All(); if (this.contestId != null) { submissions = submissions.Where(s => s.Problem.ContestId == this.contestId); } return submissions.Select(GridModelType.ViewModel); } public override object GetById(object id) { return this.Data.Submissions .All() .FirstOrDefault(o => o.Id == (int)id); } public override string GetEntityKeyName() { return this.GetEntityKeyNameByType(typeof(DatabaseModelType)); } public ActionResult Index() { return this.View(); } [HttpGet] public ActionResult Create() { this.ViewBag.SubmissionAction = "Create"; var model = new SubmissionAdministrationViewModel(); return this.View(model); } [HttpPost] public ActionResult ReadSubmissions([DataSourceRequest]DataSourceRequest request, int? id) { this.contestId = id; return this.Read(request); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(ModelType model) { if (model != null && this.ModelState.IsValid) { if (model.ProblemId.HasValue) { var problem = this.Data.Problems.GetById(model.ProblemId.Value); if (problem != null) { this.ValidateParticipant(model.ParticipantId, problem.ContestId); } var submissionType = this.GetSubmissionType(model.SubmissionTypeId.Value); if (submissionType != null) { this.ValidateSubmissionContentLength(model, problem); this.ValidateBinarySubmission(model, problem, submissionType); } } if (this.ModelState.IsValid) { this.BaseCreate(model.GetEntityModel()); this.TempData.AddInfoMessage(Resource.Successful_creation_message); return this.RedirectToAction(GlobalConstants.Index); } } this.ViewBag.SubmissionAction = "Create"; return this.View(model); } [HttpGet] public ActionResult Update(int id) { var submission = this.Data.Submissions .All() .Where(subm => subm.Id == id) .Select(ModelType.ViewModel) .FirstOrDefault(); if (submission == null) { this.TempData.AddDangerMessage(Resource.Invalid_submission_message); return this.RedirectToAction(GlobalConstants.Index); } this.ViewBag.SubmissionAction = "Update"; return this.View(submission); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Update(ModelType model) { if (model.Id.HasValue) { var submission = this.Data.Submissions.GetById(model.Id.Value); if (model.SubmissionTypeId.HasValue) { var submissionType = this.Data.SubmissionTypes.GetById(model.SubmissionTypeId.Value); if (submissionType.AllowBinaryFilesUpload && model.FileSubmission == null) { model.Content = submission.Content; model.FileExtension = submission.FileExtension; if (this.ModelState.ContainsKey("Content")) { this.ModelState["Content"].Errors.Clear(); } } } } if (this.ModelState.IsValid) { if (model.ProblemId.HasValue) { var problem = this.Data.Problems.GetById(model.ProblemId.Value); if (problem != null) { this.ValidateParticipant(model.ParticipantId, problem.ContestId); } var submissionType = this.GetSubmissionType(model.SubmissionTypeId.Value); if (submissionType != null) { this.ValidateSubmissionContentLength(model, problem); this.ValidateBinarySubmission(model, problem, submissionType); } } if (this.ModelState.IsValid) { var entity = this.GetById(model.Id) as DatabaseModelType; this.UpdateAuditInfoValues(model, entity); this.BaseUpdate(model.GetEntityModel(entity)); this.TempData.AddInfoMessage(Resource.Successful_edit_message); return this.RedirectToAction(GlobalConstants.Index); } } this.ViewBag.SubmissionAction = "Update"; return this.View(model); } [HttpGet] public ActionResult Delete(int id) { var submission = this.Data.Submissions .All() .Where(subm => subm.Id == id) .Select(GridModelType.ViewModel) .FirstOrDefault(); if (submission == null) { this.TempData.AddDangerMessage(Resource.Invalid_submission_message); return this.RedirectToAction(GlobalConstants.Index); } return this.View(submission); } public ActionResult ConfirmDelete(int id) { var submission = this.Data.Submissions .All() .FirstOrDefault(subm => subm.Id == id); if (submission == null) { this.TempData.AddDangerMessage(Resource.Invalid_submission_message); return this.RedirectToAction(GlobalConstants.Index); } foreach (var testRun in submission.TestRuns.ToList()) { this.Data.TestRuns.Delete(testRun.Id); } this.Data.Submissions.Delete(id); this.Data.SaveChanges(); return this.RedirectToAction(GlobalConstants.Index); } public JsonResult GetSubmissionTypes(int problemId, bool? allowBinaryFilesUpload) { var selectedProblemContest = this.Data.Contests.All().FirstOrDefault(contest => contest.Problems.Any(problem => problem.Id == problemId)); var submissionTypesSelectListItems = selectedProblemContest.SubmissionTypes .ToList() .Select(submissionType => new { Text = submissionType.Name, Value = submissionType.Id.ToString(), submissionType.AllowBinaryFilesUpload, submissionType.AllowedFileExtensions }); if (allowBinaryFilesUpload.HasValue) { submissionTypesSelectListItems = submissionTypesSelectListItems .Where(submissionType => submissionType.AllowBinaryFilesUpload == allowBinaryFilesUpload); } return this.Json(submissionTypesSelectListItems, JsonRequestBehavior.AllowGet); } public ActionResult Retest(int id) { var submission = this.Data.Submissions.GetById(id); if (submission == null) { this.TempData.AddDangerMessage(Resource.Invalid_submission_message); } else { submission.Processed = false; submission.Processing = false; this.Data.SaveChanges(); this.TempData.AddInfoMessage(Resource.Retest_successful); } return this.RedirectToAction("View", "Submissions", new { area = "Contests", id }); } public JsonResult GetProblems(string text) { var dropDownData = this.Data.Problems.All(); if (!string.IsNullOrEmpty(text)) { dropDownData = dropDownData.Where(pr => pr.Name.ToLower().Contains(text.ToLower())); } var result = dropDownData .ToList() .Select(pr => new SelectListItem { Text = pr.Name, Value = pr.Id.ToString(), }); return this.Json(result, JsonRequestBehavior.AllowGet); } public JsonResult GetParticipants(string text, int problem) { var selectedProblem = this.Data.Problems.All().FirstOrDefault(pr => pr.Id == problem); var dropDownData = this.Data.Participants.All().Where(part => part.ContestId == selectedProblem.ContestId); if (!string.IsNullOrEmpty(text)) { dropDownData = dropDownData.Where(part => part.User.UserName.ToLower().Contains(text.ToLower())); } var result = dropDownData .ToList() .Select(part => new SelectListItem { Text = part.User.UserName, Value = part.Id.ToString(), }); return this.Json(result, JsonRequestBehavior.AllowGet); } public ActionResult RenderGrid(int? id) { return this.PartialView("_SubmissionsGrid", id); } public JsonResult Contests(string text) { var contests = this.Data.Contests.All() .OrderByDescending(c => c.CreatedOn) .Select(c => new { c.Id, c.Name }); if (!string.IsNullOrEmpty(text)) { contests = contests.Where(c => c.Name.ToLower().Contains(text.ToLower())); } return this.Json(contests, JsonRequestBehavior.AllowGet); } public FileResult GetSubmissionFile(int submissionId) { var submission = this.Data.Submissions.GetById(submissionId); return this.File( submission.Content, GlobalConstants.BinaryFileMimeType, string.Format("{0}_{1}.{2}", submission.Participant.User.UserName, submission.Problem.Name, submission.FileExtension)); } private SubmissionType GetSubmissionType(int submissionTypeId) { var submissionType = this.Data.SubmissionTypes.GetById(submissionTypeId); if (submissionType != null) { return submissionType; } this.ModelState.AddModelError("SubmissionTypeId", Resource.Wrong_submision_type); return null; } private void ValidateParticipant(int? participantId, int contestId) { if (participantId.HasValue) { if (!this.Data.Participants.All().Any(participant => participant.Id == participantId.Value && participant.ContestId == contestId)) { this.ModelState.AddModelError("ParticipantId", Resource.Invalid_task_for_participant); } } } private void ValidateSubmissionContentLength(ModelType model, Problem problem) { if (model.Content.Length > problem.SourceCodeSizeLimit) { this.ModelState.AddModelError("Content", Resource.Submission_content_length_invalid); } } private void ValidateBinarySubmission(ModelType model, Problem problem, SubmissionType submissionType) { if (submissionType.AllowBinaryFilesUpload && !string.IsNullOrEmpty(model.ContentAsString)) { this.ModelState.AddModelError("SubmissionTypeId", Resource.Wrong_submision_type); } if (submissionType.AllowedFileExtensions != null) { if (!submissionType.AllowedFileExtensionsList.Contains(model.FileExtension)) { this.ModelState.AddModelError("Content", Resource.Invalid_file_extention); } } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/TestsController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Mime; using System.Web; using System.Web.Mvc; using Ionic.Zip; using Kendo.Mvc.UI; using OJS.Common; using OJS.Common.Models; using OJS.Data; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Problem; using OJS.Web.Areas.Administration.ViewModels.Test; using OJS.Web.Areas.Administration.ViewModels.TestRun; using OJS.Web.Common.Extensions; using OJS.Web.Common.ZippedTestManipulator; using OJS.Web.Controllers; using Resource = Resources.Areas.Administration.Tests.TestsControllers; /// /// Controller class for administrating problems' input and output tests, inherits Administration controller for authorisation /// public class TestsController : AdministrationController { /// /// Initializes a new instance of the class. /// /// Open Judge System Database context for the controller to work with public TestsController(IOjsData data) : base(data) { } /// /// Returns view for the tests administration index page /// /// View for /Administration/Tests/ public ActionResult Index() { return this.View(); } /// /// Returns view for the tests administration index page and populates problem, contest, category dropdowns and tests grid if problem id is correct /// /// Problem id which tests are populated /// View for /Administration/Tests/Problem/{id} public ActionResult Problem(int? id) { this.ViewBag.ProblemId = id; return this.View(GlobalConstants.Index); } /// /// Returns view for the tests administration create page with HTTP Get request - creating tests for a problem selected by id /// /// Problem id for which a test will be created /// View for /Administration/Tests/Create/ if problem id is correct otherwise redirects to /Administration/Tests/ with proper error message [HttpGet] public ActionResult Create(int? id) { if (id == null) { this.TempData.AddDangerMessage(Resource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } var problem = this.Data.Problems.All().FirstOrDefault(pr => pr.Id == id); if (problem == null) { this.TempData.AddDangerMessage(Resource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } var test = new TestViewModel { ProblemId = problem.Id, ProblemName = problem.Name, }; return this.View(test); } /// /// Redirects to Problem action after successful creation of new test with HTTP Post request /// /// Problem id for which the posted test will be saved /// Created test posted information /// Redirects to /Administration/Tests/Problem/{id} after succesful creation otherwise to /Administration/Test/ with proper error message [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(int id, TestViewModel test) { var problem = this.Data.Problems.All().FirstOrDefault(pr => pr.Id == id); if (problem == null) { this.TempData.AddDangerMessage(Resource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } if (test != null && this.ModelState.IsValid) { this.Data.Tests.Add(new Test { InputDataAsString = test.InputFull, OutputDataAsString = test.OutputFull, ProblemId = id, IsTrialTest = test.IsTrialTest, OrderBy = test.OrderBy }); this.Data.SaveChanges(); this.RetestSubmissions(problem.Id); this.TempData.AddInfoMessage(Resource.Test_added_successfully); return this.RedirectToAction("Problem", new { id }); } return this.View(test); } /// /// Returns view for the tests administration edit page with HTTP Get request - editing test by id /// /// Id for test to be edited /// View for /Administration/Tests/Edit/{id} otherwise redirects to /Administration/Test/ with proper error message [HttpGet] public ActionResult Edit(int id) { var test = this.Data.Tests.All() .Where(t => t.Id == id) .Select(TestViewModel.FromTest) .FirstOrDefault(); if (test == null) { this.TempData.AddDangerMessage(Resource.Invalid_test); return this.RedirectToAction(GlobalConstants.Index); } return this.View(test); } /// /// Redirects to Problem action after successful edit of the test with HTTP Post request /// /// Id for edited test /// Edited test posted information /// Redirects to /Administration/Tests/Problem/{id} after succesful edit otherwise to /Administration/Test/ with proper error message [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(int id, TestViewModel test) { if (test != null && this.ModelState.IsValid) { var existingTest = this.Data.Tests .All() .FirstOrDefault(t => t.Id == id); if (existingTest == null) { this.TempData.AddDangerMessage(Resource.Invalid_test); return this.RedirectToAction("Problem", new { id }); } existingTest.InputData = test.InputData; existingTest.OutputData = test.OutputData; existingTest.OrderBy = test.OrderBy; existingTest.IsTrialTest = test.IsTrialTest; this.Data.SaveChanges(); this.RetestSubmissions(existingTest.ProblemId); this.TempData.AddInfoMessage(Resource.Test_edited_successfully); return this.RedirectToAction("Problem", new { id = existingTest.ProblemId }); } return this.View(test); } /// /// Returns view for the tests administration delete page with HTTP Get request - deleting test by id /// /// Id for test to be deleted /// View for /Administration/Tests/Delete/{id} otherwise redirects to /Administration/Test/ with proper error message [HttpGet] public ActionResult Delete(int? id) { if (id == null) { this.TempData.AddDangerMessage(Resource.Invalid_test); return this.RedirectToAction(GlobalConstants.Index); } var test = this.Data.Tests.All() .Where(t => t.Id == id) .Select(TestViewModel.FromTest) .FirstOrDefault(); if (test == null) { this.TempData.AddDangerMessage(Resource.Invalid_test); return this.RedirectToAction(GlobalConstants.Index); } return this.View(test); } /// /// Redirects to Problem action after successful deletion of the test /// /// Id for test to be deleted /// Redirects to /Administration/Tests/Problem/{id} after succesful deletion otherwise to /Administration/Test/ with proper error message public ActionResult ConfirmDelete(int? id) { if (id == null) { this.TempData.AddDangerMessage(Resource.Invalid_test); return this.RedirectToAction(GlobalConstants.Index); } var test = this.Data.Tests.All().FirstOrDefault(t => t.Id == id); if (test == null) { this.TempData.AddDangerMessage(Resource.Invalid_test); return this.RedirectToAction(GlobalConstants.Index); } // delete all test runs for the current test this.Data.TestRuns.Delete(testRun => testRun.TestId == id.Value); this.Data.SaveChanges(); // delete the test this.Data.Tests.Delete(test); this.Data.SaveChanges(); // recalculate submissions point var submissionResults = this.Data.Submissions .All() .Where(s => s.ProblemId == test.ProblemId) .Select(s => new { s.Id, CorrectTestRuns = s.TestRuns.Count(t => t.ResultType == TestRunResultType.CorrectAnswer), AllTestRuns = s.TestRuns.Count(), MaxPoints = s.Problem.MaximumPoints }) .ToList(); foreach (var submissionResult in submissionResults) { var submission = this.Data.Submissions.GetById(submissionResult.Id); int points = 0; if (submissionResult.AllTestRuns != 0) { points = submissionResult.CorrectTestRuns / submissionResult.AllTestRuns * submissionResult.MaxPoints; } submission.Points = points; } this.Data.SaveChanges(); this.TempData.AddInfoMessage(Resource.Test_deleted_successfully); return this.RedirectToAction("Problem", new { id = test.ProblemId }); } /// /// Returns view for the tests administration delete all page with HTTP Get request - deleting all test for problem by id /// /// Id for the problem which tests will be deleted /// View for /Administration/Tests/DeleteAll/{id} otherwise redirects to /Administration/Test/ with proper error message [HttpGet] public ActionResult DeleteAll(int? id) { if (id == null) { this.TempData.AddDangerMessage(Resource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } var problem = this.Data.Problems.All() .Where(pr => pr.Id == id) .Select(pr => new ProblemViewModel { Id = pr.Id, Name = pr.Name, ContestName = pr.Contest.Name }) .FirstOrDefault(); if (problem == null) { this.TempData.AddDangerMessage(Resource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } return this.View(problem); } /// /// Redirects to Problem action after successful deletion of all tests /// /// Id for the problem which tests will be deleted /// Redirects to /Administration/Tests/Problem/{id} after succesful deletion otherwise to /Administration/Test/ with proper error message public ActionResult ConfirmDeleteAll(int? id) { if (id == null) { this.TempData.AddDangerMessage(Resource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } var problem = this.Data.Problems.All().FirstOrDefault(pr => pr.Id == id); if (problem == null) { this.TempData.AddDangerMessage(Resource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } this.Data.TestRuns.Delete(testRun => testRun.Submission.ProblemId == id); this.Data.SaveChanges(); this.Data.Tests.Delete(test => test.ProblemId == id); this.Data.SaveChanges(); this.RetestSubmissions(problem.Id); this.TempData.AddInfoMessage(Resource.Tests_deleted_successfully); return this.RedirectToAction("Problem", new { id }); } /// /// Returns view for the tests administration details page - showing information about test by id /// /// Id for test which details will be shown /// View for /Administration/Tests/Details/{id} otherwise redirects to /Administration/Test/ with proper error message public ActionResult Details(int? id) { if (id == null) { this.TempData.AddDangerMessage(Resource.Invalid_test); return this.RedirectToAction(GlobalConstants.Index); } var test = this.Data.Tests.All() .Where(t => t.Id == id) .Select(TestViewModel.FromTest) .FirstOrDefault(); if (test == null) { this.TempData.AddDangerMessage(Resource.Invalid_test); return this.RedirectToAction(GlobalConstants.Index); } return this.View(test); } /// /// Returns full input data as string content for test by id /// /// Id of the test to show full input /// Content as html of the test input public ActionResult FullInput(int id) { var result = this.Data.Tests.All().FirstOrDefault(t => t.Id == id).InputDataAsString; return this.Content(HttpUtility.HtmlEncode(result), "text/html"); } /// /// Returns full output data as string content for test by id /// /// Id of the test to show full output /// Content as html of the test output public ActionResult FullOutput(int id) { var result = this.Data.Tests.All().FirstOrDefault(t => t.Id == id).OutputDataAsString; return this.Content(HttpUtility.HtmlEncode(result), "text/html"); } /// /// Returns test runs for test by id /// /// Id of the test to get test runs /// JSON result of all test runs for the test public JsonResult GetTestRuns(int id) { // TODO: Add server side paging and sorting to test runs grid var result = this.Data.TestRuns.All() .Where(tr => tr.TestId == id) .OrderByDescending(tr => tr.Submission.CreatedOn) .Select(TestRunViewModel.FromTestRun); return this.Json(result, JsonRequestBehavior.AllowGet); } /// /// Returns all available contest categories /// /// JSON result of all categores as objects with Id and Name properties [HttpGet] public JsonResult GetCascadeCategories() { var result = this.Data.ContestCategories.All().Select(cat => new { cat.Id, cat.Name }); return this.Json(result, JsonRequestBehavior.AllowGet); } /// /// Returns all available contests in category by id /// /// Id of category to get all contests from /// JSON result of all contests in category as objects with Id and Name properties [HttpGet] public JsonResult GetCascadeContests(int id) { var contests = this.Data.Contests .All() .Where(con => con.CategoryId == id) .Select(con => new { con.Id, con.Name }); return this.Json(contests, JsonRequestBehavior.AllowGet); } /// /// Returns all available problems in contest by id /// /// Id of contest to get all problem from /// JSON result of all problems in contest as objects with Id and Name properties [HttpGet] public JsonResult GetCascadeProblems(int id) { var problems = this.Data.Problems .All() .Where(pr => pr.ContestId == id) .Select(pr => new { pr.Id, pr.Name }); return this.Json(problems, JsonRequestBehavior.AllowGet); } /// /// Returns contest and category id for a problem /// /// Id of the problem to get information for /// JSON result of contest and category id as object [HttpGet] public JsonResult GetProblemInformation(int id) { var problem = this.Data.Problems.All().FirstOrDefault(pr => pr.Id == id); var contestId = problem.ContestId; var categoryId = problem.Contest.CategoryId; var result = new { Contest = contestId, Category = categoryId }; return this.Json(result, JsonRequestBehavior.AllowGet); } /// /// Returns all problems as pair of Id and Name if problem name contains given substring /// /// Substring which problems should contain in name /// JSON result of all problems that contain the given substring [HttpGet] public JsonResult GetSearchedProblems(string text) { var result = this.Data.Problems .All() .Where(pr => pr.Name.ToLower().Contains(text.ToLower())) .Select(pr => new { pr.Id, pr.Name }); return this.Json(result, JsonRequestBehavior.AllowGet); } /// /// Returns all tests for particular problem by id /// /// Id of the problem to get all tests /// JSON result of all tests for the problem public ContentResult ProblemTests(int id) { var result = this.GetData(id); return this.LargeJson(result); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Import(string problemId, HttpPostedFileBase file, bool retestTask, bool deleteOldFiles) { int id; if (!int.TryParse(problemId, out id)) { this.TempData.AddDangerMessage(Resource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } var problem = this.Data.Problems.All().FirstOrDefault(x => x.Id == id); if (problem == null) { this.TempData.AddDangerMessage(Resource.Invalid_problem); return this.RedirectToAction(GlobalConstants.Index); } if (file == null || file.ContentLength == 0) { this.TempData.AddDangerMessage(Resource.No_empty_file); return this.RedirectToAction("Problem", new { id }); } var extension = file.FileName.Substring(file.FileName.Length - 4, 4); if (extension != ".zip") { this.TempData.AddDangerMessage(Resource.Must_be_zip); return this.RedirectToAction("Problem", new { id }); } if (deleteOldFiles) { var tests = problem.Tests.Select(t => new { t.Id, TestRuns = t.TestRuns.Select(tr => tr.Id) }).ToList(); foreach (var test in tests) { var testRuns = test.TestRuns.ToList(); foreach (var testRun in testRuns) { this.Data.TestRuns.Delete(testRun); } this.Data.Tests.Delete(test.Id); } problem.Tests = new HashSet(); } using (var memory = new MemoryStream()) { file.InputStream.CopyTo(memory); memory.Position = 0; TestsParseResult parsedTests; try { parsedTests = ZippedTestsManipulator.Parse(memory); } catch { this.TempData.AddDangerMessage(Resource.Zip_damaged); return this.RedirectToAction("Problem", new { id }); } if (parsedTests.ZeroInputs.Count != parsedTests.ZeroOutputs.Count || parsedTests.Inputs.Count != parsedTests.Outputs.Count) { this.TempData.AddDangerMessage(Resource.Invalid_tests); return this.RedirectToAction("Problem", new { id }); } ZippedTestsManipulator.AddTestsToProblem(problem, parsedTests); this.Data.SaveChanges(); } if (retestTask) { this.RetestSubmissions(problem.Id); } this.TempData.AddInfoMessage(Resource.Tests_addted_to_problem); return this.RedirectToAction("Problem", new { id }); } /// /// Creates zip files with all tests in given task /// /// Task id /// Zip file containing all tests in format {task}.{testNum}[.{zeroNum}].{in|out}.txt public ActionResult Export(int id) { var problem = this.Data.Problems.All().FirstOrDefault(x => x.Id == id); if (problem == null) { this.TempData.AddDangerMessage(Resource.Problem_does_not_exist); return this.RedirectToAction(GlobalConstants.Index); } var tests = problem.Tests.OrderBy(x => x.OrderBy); var zipFile = new ZipFile(string.Format("{0}_Tests_{1}", problem.Name, DateTime.Now)); using (zipFile) { int trialTestCounter = 1; int testCounter = 1; foreach (var test in tests) { if (test.IsTrialTest) { zipFile.AddEntry(string.Format("test.000.{0:D3}.in.txt", trialTestCounter), test.InputDataAsString); zipFile.AddEntry(string.Format("test.000.{0:D3}.out.txt", trialTestCounter), test.OutputDataAsString); trialTestCounter++; } else { zipFile.AddEntry(string.Format("test.{0:D3}.in.txt", testCounter), test.InputDataAsString); zipFile.AddEntry(string.Format("test.{0:D3}.out.txt", testCounter), test.OutputDataAsString); testCounter++; } } } var stream = new MemoryStream(); zipFile.Save(stream); stream.Position = 0; return this.File(stream, MediaTypeNames.Application.Zip, zipFile.Name); } [HttpGet] public FileResult ExportToExcel([DataSourceRequest] DataSourceRequest request, int id) { return this.ExportToExcel(request, this.GetData(id)); } private IEnumerable GetData(int id) { var result = this.Data.Tests.All() .Where(test => test.ProblemId == id) .OrderByDescending(test => test.IsTrialTest) .ThenBy(test => test.OrderBy) .Select(TestViewModel.FromTest); return result; } private void RetestSubmissions(int problemId) { this.Data.Submissions.Update( submission => submission.ProblemId == problemId, submission => new Submission { Processed = false, Processing = false }); this.Data.SaveChanges(); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Controllers/UsersController.cs ================================================ namespace OJS.Web.Areas.Administration.Controllers { using System.Collections; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using OJS.Data; using OJS.Web.Controllers; using ViewModelType = OJS.Web.Areas.Administration.ViewModels.User.UserProfileAdministrationViewModel; public class UsersController : KendoGridAdministrationController { public UsersController(IOjsData data) : base(data) { } public override IEnumerable GetData() { return this.Data.Users .All() .Select(ViewModelType.ViewModel); } public override object GetById(object id) { return this.Data.Users .All() .FirstOrDefault(o => o.Id == (string)id); } public ActionResult Index() { return this.View(); } [HttpPost] public ActionResult Update([DataSourceRequest]DataSourceRequest request, ViewModelType model) { var list = new List(); if (model != null && this.ModelState.IsValid) { var userProfile = this.Data.Users.All().FirstOrDefault(u => u.Id == model.Id); var itemForUpdating = this.Data.Context.Entry(model.GetEntityModel(userProfile)); itemForUpdating.State = EntityState.Modified; this.Data.SaveChanges(); list.Add(model); } return this.Json(list.ToDataSourceResult(request)); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Providers/Common/BaseNewsProvider.cs ================================================ namespace OJS.Web.Areas.Administration.Providers.Common { using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using HtmlAgilityPack; using OJS.Data.Models; using OJS.Web.Areas.Administration.Providers.Contracts; public abstract class BaseNewsProvider : INewsProvider { public abstract IEnumerable FetchNews(); protected string ConvertLinks(string content, string newLink) { var result = new StringBuilder(); for (int i = 0; i < content.Length; i++) { if (i + 6 < content.Length && content.Substring(i, 6) == "href=\"") { result.Append("href=\""); i += 6; if (i + 4 < content.Length && content.Substring(i, 4) == "http") { i += 4; result.Append("http"); } else { result.Append(newLink); } } result.Append(content[i]); } return result.ToString(); } protected HtmlDocument GetHtmlDocument(string url, string encoding) { var document = new HtmlDocument(); using (var client = new WebClient()) { using (var stream = client.OpenRead(url)) { var reader = new StreamReader(stream, Encoding.GetEncoding(encoding)); var html = reader.ReadToEnd(); document.LoadHtml(html); } } document.OptionFixNestedTags = true; return document; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Providers/Contracts/INewsProvider.cs ================================================ namespace OJS.Web.Areas.Administration.Providers.Contracts { using System.Collections.Generic; using OJS.Data.Models; public interface INewsProvider { IEnumerable FetchNews(); } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Providers/InfoManNewsProvider.cs ================================================ namespace OJS.Web.Areas.Administration.Providers { using System; using System.Collections.Generic; using System.Linq; using System.Web; using OJS.Data.Models; using OJS.Web.Areas.Administration.Providers.Common; public class InfoManNewsProvider : BaseNewsProvider { private const string ContentUrl = "http://infoman.musala.com/feeds/"; private const string ContentEncoding = "utf-8"; public override IEnumerable FetchNews() { var document = this.GetHtmlDocument(ContentUrl, ContentEncoding); var nodes = document.DocumentNode.SelectNodes("//rss//channel//item"); var currentListOfNews = new List(); foreach (var node in nodes) { var title = node.ChildNodes.First(n => n.Name == "title").InnerHtml; var description = node.ChildNodes.First(n => n.Name == "description").InnerHtml; var date = node.ChildNodes.First(n => n.Name == "pubdate").InnerHtml; var linkAddress = node.ChildNodes.First(n => n.Name == "guid").InnerHtml; var link = string.Format("{0}", linkAddress); var decodedDescription = HttpUtility.HtmlDecode(description); var parsedDate = DateTime.Parse(date); currentListOfNews.Add(new News { Title = title, Content = string.Format("{0}
{1}", this.ConvertLinks(decodedDescription, "http://infoman.musala.com/"), link), Author = "ИнфоМан", Source = "http://infoman.musala.com/", IsVisible = true, CreatedOn = parsedDate, PreserveCreatedOn = true, }); } return currentListOfNews; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Providers/InfosNewsProvider.cs ================================================ namespace OJS.Web.Areas.Administration.Providers { using System.Collections.Generic; using System.Linq; using System.Text; using HtmlAgilityPack; using OJS.Common.Extensions; using OJS.Data.Models; using OJS.Web.Areas.Administration.Providers.Common; public class InfosNewsProvider : BaseNewsProvider { private const string ContentUrl = "http://www.math.bas.bg/infos/index.html"; private const string ContentEncoding = "windows-1251"; public override IEnumerable FetchNews() { var document = this.GetHtmlDocument(ContentUrl, ContentEncoding); var currentListOfNews = new List(); var node = document.DocumentNode.SelectSingleNode("//body//div//div//div[4]"); this.GenerateNewsFromInfos(node, currentListOfNews); return currentListOfNews; } private void GenerateNewsFromInfos(HtmlNode node, ICollection fetchedNews) { var title = string.Empty; var content = new StringBuilder(); while (true) { if (node == null) { break; } if (node.FirstChild == null) { node = node.NextSibling; continue; } if (node.FirstChild.InnerText == string.Empty && content.Length > 0) { node = node.NextSibling; continue; } if (node.FirstChild.InnerText == string.Empty) { node.PreviousSibling.PreviousSibling.FirstChild.InnerText.TryGetDate(); node = node.NextSibling; continue; } if (node.FirstChild.Attributes.Any(x => x.Name == "class" && x.Value == "ws14") && content.Length == 0) { title += node.FirstChild.InnerText + " "; } else if (node.FirstChild.Attributes.Any(x => x.Name == "class" && x.Value == "ws14") && content.Length > 0) { var date = content.ToString().Substring(0, 10).TryGetDate(); var contentAsString = content.ToString().Trim().Substring(10); if (contentAsString.StartsWith("
")) { contentAsString = contentAsString.Substring(6); } contentAsString = this.ConvertLinks(contentAsString, "http://www.math.bas.bg/infos/"); fetchedNews.Add(new News { Title = title.Trim(), CreatedOn = date, IsVisible = true, Author = "Инфос", Source = "http://www.math.bas.bg/infos/index.html", Content = contentAsString, PreserveCreatedOn = true, }); title = string.Empty; content.Length = 0; continue; } else if (node.FirstChild.Attributes.Any(x => x.Name == "class" && x.Value == "ws12")) { content.Append(node.FirstChild.InnerHtml); var nestedNode = node.FirstChild.NextSibling; while (nestedNode != null) { if (nestedNode.Name == "#text") { nestedNode = nestedNode.NextSibling; continue; } if (nestedNode.Attributes.Any(x => x.Name == "class" && x.Value == "ws12")) { content.Append(nestedNode.InnerHtml); } else { break; } nestedNode = nestedNode.NextSibling; } content.Append("
"); } node = node.NextSibling; } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/AccessLogs/AccessLogGridViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.AccessLogs { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.AccessLogs.ViewModels.AccessLogGridViewModel; public class AccessLogGridViewModel : AdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return log => new AccessLogGridViewModel { Id = log.Id, UserName = log.User != null ? log.User.UserName : null, IpAddress = log.IpAddress, RequestType = log.RequestType, Url = log.Url, PostParams = log.PostParams, CreatedOn = log.CreatedOn, ModifiedOn = log.ModifiedOn }; } } [Display(Name = "№")] public long Id { get; set; } [Display(Name = "UserName", ResourceType = typeof(Resource))] public string UserName { get; set; } [Display(Name = "Ip", ResourceType = typeof(Resource))] public string IpAddress { get; set; } [Display(Name = "Request_type", ResourceType = typeof(Resource))] public string RequestType { get; set; } [Display(Name = "Url", ResourceType = typeof(Resource))] public string Url { get; set; } [Display(Name = "Post_params", ResourceType = typeof(Resource))] public string PostParams { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/AntiCheat/AntiCheatByIpAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.AntiCheat { using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using OJS.Data.Models; public class AntiCheatByIpAdministrationViewModel { public static Expression> ViewModel { get { return p => new AntiCheatByIpAdministrationViewModel { Id = p.Id, UserName = p.User.UserName, Points = p.Submissions .AsQueryable() .Where(s => !s.IsDeleted) .GroupBy(s => s.ProblemId) .Sum(s => s.Max(z => z.Points)), DifferentIps = p.Submissions .AsQueryable() .Where(s => !s.IsDeleted && s.IpAddress != null) .GroupBy(s => s.IpAddress) .Select(g => g.FirstOrDefault().IpAddress) }; } } public int Id { get; set; } public string UserName { get; set; } public int Points { get; set; } public IEnumerable DifferentIps { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/AntiCheat/IpSubmissionsAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.AntiCheat { using System.Collections.Generic; public class IpSubmissionsAdministrationViewModel { public string Ip { get; set; } public IEnumerable SubmissionIds { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/AntiCheat/SubmissionSimilarityFiltersInputModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.AntiCheat { using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Web.Mvc; using OJS.Common.Models; public class SubmissionSimilarityFiltersInputModel { [Required] [Display(Name = "Състезание")] public int? ContestId { get; set; } [Display(Name = "Тип детектор")] public PlagiarismDetectorType PlagiarismDetectorType { get; set; } public IEnumerable PlagiarismDetectorTypes { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/AntiCheat/SubmissionSimilarityViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.AntiCheat { using System; public class SubmissionSimilarityViewModel { public int ProblemId { get; set; } public string ProblemName { get; set; } public int Points { get; set; } public int Differences { get; set; } public decimal Percentage { get; set; } public int FirstSubmissionId { get; set; } public int SecondSubmissionId { get; set; } public string FirstParticipantName { get; set; } public string SecondParticipantName { get; set; } public DateTime FirstSubmissionCreatedOn { get; set; } public DateTime SecondSubmissionCreatedOn { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Checker/CheckerAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Checker { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.Checkers.ViewModels.CheckerAdministrationViewModel; public class CheckerAdministrationViewModel : AdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return ch => new CheckerAdministrationViewModel { Id = ch.Id, Name = ch.Name, Description = ch.Description, DllFile = ch.DllFile, ClassName = ch.ClassName, Parameter = ch.Parameter, CreatedOn = ch.CreatedOn, ModifiedOn = ch.ModifiedOn, }; } } [DatabaseProperty] [Display(Name = "№")] [DefaultValue(null)] [HiddenInput(DisplayValue = false)] public int? Id { get; set; } [DatabaseProperty] [Display(Name = "Name", ResourceType = typeof(Resource))] [Required( AllowEmptyStrings = false, ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "Name_required")] [StringLength( GlobalConstants.CheckerNameMaxLength, MinimumLength = GlobalConstants.CheckerNameMinLength, ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "Name_length")] [UIHint("SingleLineText")] public string Name { get; set; } [DatabaseProperty] [Display(Name = "Description", ResourceType = typeof(Resource))] [UIHint("MultiLineText")] public string Description { get; set; } [DatabaseProperty] [Display(Name = "Dll_file", ResourceType = typeof(Resource))] [Required( AllowEmptyStrings = false, ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "Dll_file_required")] [UIHint("SingleLineText")] public string DllFile { get; set; } [DatabaseProperty] [Display(Name = "Class_name", ResourceType = typeof(Resource))] [Required( AllowEmptyStrings = false, ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "Class_name_required")] [UIHint("SingleLineText")] public string ClassName { get; set; } [AllowHtml] [DatabaseProperty] [Display(Name = "Param", ResourceType = typeof(Resource))] [UIHint("MultiLineText")] public string Parameter { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Common/AdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Common { using System; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web.Mvc; using OJS.Common.DataAnnotations; using OJS.Web.Common.Interfaces; using Resource = Resources.Areas.Administration.AdministrationGeneral; public abstract class AdministrationViewModel : IAdministrationViewModel where T : class, new() { [DatabaseProperty] [Display(Name = "Created_on", ResourceType = typeof(Resource))] [DataType(DataType.DateTime)] [HiddenInput(DisplayValue = false)] public DateTime? CreatedOn { get; set; } [DatabaseProperty] [Display(Name = "Modified_on", ResourceType = typeof(Resource))] [DataType(DataType.DateTime)] [HiddenInput(DisplayValue = false)] public DateTime? ModifiedOn { get; set; } public virtual T GetEntityModel(T model = null) { model = model ?? new T(); return this.ConvertToDatabaseEntity(model); } protected T ConvertToDatabaseEntity(T model) { foreach (var viewModelProperty in this.GetType().GetProperties()) { var customAttributes = viewModelProperty.GetCustomAttributes(typeof(DatabasePropertyAttribute), true); if (customAttributes.Any()) { var name = (customAttributes.First() as DatabasePropertyAttribute).Name; if (string.IsNullOrEmpty(name)) { name = viewModelProperty.Name; } var databaseEntityProperty = model.GetType().GetProperties().FirstOrDefault(pr => pr.Name == name); databaseEntityProperty?.SetValue(model, viewModelProperty.GetValue(this)); } } return model; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Contest/ContestAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Contest { using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using OJS.Web.Areas.Administration.ViewModels.SubmissionType; using Resource = Resources.Areas.Administration.Contests.ViewModels.ContestAdministration; public class ContestAdministrationViewModel : AdministrationViewModel { public ContestAdministrationViewModel() { this.SubmisstionTypes = new List(); } [ExcludeFromExcel] public static Expression> ViewModel { get { return contest => new ContestAdministrationViewModel { Id = contest.Id, Name = contest.Name, StartTime = contest.StartTime, EndTime = contest.EndTime, PracticeStartTime = contest.PracticeStartTime, PracticeEndTime = contest.PracticeEndTime, IsVisible = contest.IsVisible, CategoryId = contest.CategoryId.Value, ContestPassword = contest.ContestPassword, PracticePassword = contest.PracticePassword, Description = contest.Description, LimitBetweenSubmissions = contest.LimitBetweenSubmissions, OrderBy = contest.OrderBy, SelectedSubmissionTypes = contest.SubmissionTypes.AsQueryable().Select(SubmissionTypeViewModel.ViewModel), CreatedOn = contest.CreatedOn, ModifiedOn = contest.ModifiedOn, }; } } [DatabaseProperty] [Display(Name = "№")] [DefaultValue(null)] [HiddenInput(DisplayValue = false)] public int? Id { get; set; } [DatabaseProperty] [Display(Name = "Name", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Name_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( GlobalConstants.ContestNameMaxLength, MinimumLength = GlobalConstants.ContestNameMinLength, ErrorMessageResourceName = "Name_length", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Name { get; set; } [DatabaseProperty] [Display(Name = "Start_time", ResourceType = typeof(Resource))] [UIHint("DateAndTime")] public DateTime? StartTime { get; set; } [DatabaseProperty] [Display(Name = "End_time", ResourceType = typeof(Resource))] [UIHint("DateAndTime")] public DateTime? EndTime { get; set; } [DatabaseProperty] [Display(Name = "Practice_start_time", ResourceType = typeof(Resource))] [UIHint("DateAndTime")] public DateTime? PracticeStartTime { get; set; } [DatabaseProperty] [Display(Name = "Practice_end_time", ResourceType = typeof(Resource))] [UIHint("DateAndTime")] public DateTime? PracticeEndTime { get; set; } [DatabaseProperty] [Display(Name = "Contest_password", ResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string ContestPassword { get; set; } [DatabaseProperty] [Display(Name = "Practice_password", ResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string PracticePassword { get; set; } [DatabaseProperty] [Display(Name = "Description", ResourceType = typeof(Resource))] [UIHint("MultiLineText")] public string Description { get; set; } [DatabaseProperty] [Display(Name = "Submissions_limit", ResourceType = typeof(Resource))] [UIHint("PositiveInteger")] [DefaultValue(0)] public int LimitBetweenSubmissions { get; set; } [DatabaseProperty] [Display(Name = "Order", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Order_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("Integer")] public int OrderBy { get; set; } [DatabaseProperty] [Display(Name = "Visibility", ResourceType = typeof(Resource))] public bool IsVisible { get; set; } [DatabaseProperty] [Display(Name = "Category", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Category_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("CategoryDropDown")] [DefaultValue(null)] public int? CategoryId { get; set; } [Display(Name = "Submision_types", ResourceType = typeof(Resource))] [ExcludeFromExcel] [UIHint("SubmissionTypeCheckBoxes")] public IList SubmisstionTypes { get; set; } [ExcludeFromExcel] public IEnumerable SelectedSubmissionTypes { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Contest/ShortContestAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Contest { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using OJS.Common.DataAnnotations; using OJS.Data.Models; using Resource = Resources.Areas.Administration.Contests.ViewModels.ShortContestAdministration; public class ShortContestAdministrationViewModel { [ExcludeFromExcel] public static Expression> FromContest { get { return contest => new ShortContestAdministrationViewModel { Id = contest.Id, Name = contest.Name, StartTime = contest.StartTime, EndTime = contest.EndTime, CategoryName = contest.Category.Name, }; } } public int Id { get; set; } [Display(Name = "Name", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Name_required", ErrorMessageResourceType = typeof(Resource))] public string Name { get; set; } [Display(Name = "Start_time", ResourceType = typeof(Resource))] public DateTime? StartTime { get; set; } [Display(Name = "End_time", ResourceType = typeof(Resource))] public DateTime? EndTime { get; set; } [Display(Name = "Category_name", ResourceType = typeof(Resource))] public string CategoryName { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/ContestCategory/ContestCategoryAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.ContestCategory { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.ContestCategories.ViewModels.ContestCategoryAdministrationViewModel; public class ContestCategoryAdministrationViewModel : AdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return category => new ContestCategoryAdministrationViewModel { Id = category.Id, Name = category.Name, OrderBy = category.OrderBy, IsVisible = category.IsVisible, CreatedOn = category.CreatedOn, ModifiedOn = category.ModifiedOn }; } } [DatabaseProperty] [Display(Name = "№")] [DefaultValue(null)] [HiddenInput(DisplayValue = false)] public int? Id { get; set; } [DatabaseProperty] [Display(Name = "Name", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Name_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( GlobalConstants.ContestCategoryNameMaxLength, MinimumLength = GlobalConstants.ContestCategoryNameMinLength, ErrorMessageResourceName = "Name_length", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Name { get; set; } [DatabaseProperty] [Display(Name = "Order_by", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Order_by_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("Integer")] public int OrderBy { get; set; } [DatabaseProperty] [Display(Name = "Visibility", ResourceType = typeof(Resource))] public bool IsVisible { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/ContestQuestion/ContestQuestionViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.ContestQuestion { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Common.Models; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.Contests.ViewModels.ContestQuestion; public class ContestQuestionViewModel : AdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return question => new ContestQuestionViewModel { QuestionId = question.Id, ContestId = question.ContestId, Text = question.Text, AskOfficialParticipants = question.AskOfficialParticipants, AskPracticeParticipants = question.AskPracticeParticipants, Type = question.Type, RegularExpressionValidation = question.RegularExpressionValidation, CreatedOn = question.CreatedOn, ModifiedOn = question.ModifiedOn, }; } } [DatabaseProperty(Name = "Id")] [DefaultValue(null)] [Display(Name = "№")] [HiddenInput(DisplayValue = false)] public int? QuestionId { get; set; } [DatabaseProperty] [HiddenInput(DisplayValue = false)] public int? ContestId { get; set; } [DatabaseProperty] [Display(Name = "Text", ResourceType = typeof(Resource))] [Required( AllowEmptyStrings = false, ErrorMessageResourceName = "Text_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( GlobalConstants.ContestQuestionMaxLength, MinimumLength = GlobalConstants.ContestQuestionMinLength, ErrorMessageResourceName = "Text_length", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Text { get; set; } [DatabaseProperty] [Display(Name = "Question_type", ResourceType = typeof(Resource))] [UIHint("ContestQuestionType")] public ContestQuestionType Type { get; set; } [DatabaseProperty] [Display(Name = "Regex_validation", ResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string RegularExpressionValidation { get; set; } [DatabaseProperty] [Display(Name = "Ask_in_contest", ResourceType = typeof(Resource))] [DefaultValue(true)] public bool AskOfficialParticipants { get; set; } [DatabaseProperty] [Display(Name = "Ask_in_practice", ResourceType = typeof(Resource))] [DefaultValue(true)] public bool AskPracticeParticipants { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/ContestQuestionAnswer/ContestQuestionAnswerViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.ContestQuestionAnswer { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.Contests.ViewModels.ContestQuestionAnswer; public class ContestQuestionAnswerViewModel : AdministrationViewModel { public static Expression> ViewModel { get { return qa => new ContestQuestionAnswerViewModel { AnswerId = qa.Id, QuestionId = qa.QuestionId, QuestionText = qa.Question.Text, Text = qa.Text, CreatedOn = qa.CreatedOn, ModifiedOn = qa.ModifiedOn }; } } [DatabaseProperty(Name = "Id")] [DefaultValue(null)] [Display(Name = "№")] [HiddenInput(DisplayValue = false)] public int? AnswerId { get; set; } [DatabaseProperty] [HiddenInput(DisplayValue = false)] public int? QuestionId { get; set; } [Display(Name = "Question", ResourceType = typeof(Resource))] [UIHint("NonEditable")] public string QuestionText { get; set; } [DatabaseProperty] [Display(Name = "Text", ResourceType = typeof(Resource))] [Required( AllowEmptyStrings = false, ErrorMessageResourceName = "Text_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( GlobalConstants.ContestQuestionAnswerMaxLength, MinimumLength = GlobalConstants.ContestQuestionAnswerMinLength, ErrorMessageResourceName = "Text_length", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Text { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/FeedbackReport/FeedbackReportViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.FeedbackReport { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.Feedback.ViewModels.FeedbackReport; public class FeedbackReportViewModel : AdministrationViewModel { [ExcludeFromExcel] public static Expression> FromFeedbackReport { get { return feedback => new FeedbackReportViewModel { Id = feedback.Id, Name = feedback.Name, Email = feedback.Email, Content = feedback.Content, Username = feedback.User == null ? Resource.Anonymous : feedback.User.UserName, IsFixed = feedback.IsFixed, CreatedOn = feedback.CreatedOn, ModifiedOn = feedback.ModifiedOn }; } } [DatabaseProperty] [Display(Name = "№")] [DefaultValue(null)] [HiddenInput(DisplayValue = false)] public int? Id { get; set; } [DatabaseProperty] [Display(Name = "Name", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Name_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Name { get; set; } [DatabaseProperty] [Display(Name = "Mail", ResourceType = typeof(Resource))] [DataType(DataType.EmailAddress)] [RegularExpression( GlobalConstants.EmailRegEx, ErrorMessageResourceName = "Mail_invalid", ErrorMessageResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Mail_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Email { get; set; } [DatabaseProperty] [Display(Name = "Contet", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Contet_required", ErrorMessageResourceType = typeof(Resource))] [DataType(DataType.MultilineText)] [UIHint("MultiLineText")] public string Content { get; set; } [Display(Name = "UserName", ResourceType = typeof(Resource))] [UIHint("NonEditable")] public string Username { get; set; } [DatabaseProperty] [Display(Name = "Is_fixed", ResourceType = typeof(Resource))] public bool IsFixed { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/News/NewsAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.News { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.News.ViewModels.NewsAdministration; public class NewsAdministrationViewModel : AdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return news => new NewsAdministrationViewModel { Id = news.Id, Title = news.Title, Author = news.Author, Source = news.Source, Content = news.Content, IsVisible = news.IsVisible, CreatedOn = news.CreatedOn, ModifiedOn = news.ModifiedOn }; } } [DatabaseProperty] [Display(Name = "№")] [DefaultValue(null)] [HiddenInput(DisplayValue = false)] public int? Id { get; set; } [DatabaseProperty] [Display(Name = "Title", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Title_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( GlobalConstants.NewsTitleMaxLength, MinimumLength = GlobalConstants.NewsTitleMinLength, ErrorMessageResourceName = "Title_length", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Title { get; set; } [DatabaseProperty] [Display(Name = "Author", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Author_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( GlobalConstants.NewsAuthorNameMaxLength, MinimumLength = GlobalConstants.NewsAuthorNameMinLength, ErrorMessageResourceName = "Author_length", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Author { get; set; } [DatabaseProperty] [Display(Name = "Source", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Source_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( GlobalConstants.NewsSourceMaxLength, MinimumLength = GlobalConstants.NewsSourceMinLength, ErrorMessageResourceName = "Source_length", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Source { get; set; } [AllowHtml] [DatabaseProperty] [Display(Name = "Content", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Content_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( int.MaxValue, MinimumLength = GlobalConstants.NewsContentMinLength, ErrorMessageResourceName = "Content_length", ErrorMessageResourceType = typeof(Resource))] [DataType(DataType.MultilineText)] [UIHint("HtmlContent")] public string Content { get; set; } [Display(Name = "Visibility", ResourceType = typeof(Resource))] [DatabaseProperty] public bool IsVisible { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Participant/ContestViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Participant { using System; using System.Linq.Expressions; using OJS.Common.DataAnnotations; using OJS.Data.Models; public class ContestViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return c => new ContestViewModel { Id = c.Id, Name = c.Name }; } } public int Id { get; set; } public string Name { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Participant/ParticipantAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Participant { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.Participants.ViewModels.ParticipantViewModels; public class ParticipantAdministrationViewModel : AdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return p => new ParticipantAdministrationViewModel { Id = p.Id, ContestId = p.ContestId, ContestName = p.Contest.Name, UserId = p.UserId, UserName = p.User.UserName, IsOfficial = p.IsOfficial, CreatedOn = p.CreatedOn, ModifiedOn = p.ModifiedOn, }; } } [DatabaseProperty] [Display(Name = "№")] [HiddenInput(DisplayValue = false)] public int Id { get; set; } [DatabaseProperty] [Display(Name = "Contest", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Contest_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("ContestsComboBox")] public int ContestId { get; set; } [Display(Name = "Contest_name", ResourceType = typeof(Resource))] [HiddenInput(DisplayValue = false)] public string ContestName { get; set; } [DatabaseProperty] [Display(Name = "User", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "User_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("UsersComboBox")] public string UserId { get; set; } [Display(Name = "UserName", ResourceType = typeof(Resource))] [HiddenInput(DisplayValue = false)] public string UserName { get; set; } [DatabaseProperty] [Display(Name = "Is_official", ResourceType = typeof(Resource))] public bool IsOfficial { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Participant/ParticipantAnswerViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Participant { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Data.Models; using Resource = Resources.Areas.Administration.Participants.ViewModels.ParticipantViewModels; public class ParticipantAnswerViewModel { public static Expression> ViewModel { get { return pa => new ParticipantAnswerViewModel { ParticipantId = pa.ParticipantId, ContestQuestionId = pa.ContestQuestionId, QuestionText = pa.ContestQuestion.Text, Answer = pa.Answer }; } } [HiddenInput(DisplayValue = false)] public int ParticipantId { get; set; } [HiddenInput(DisplayValue = false)] public int ContestQuestionId { get; set; } [Display(Name = "Question", ResourceType = typeof(Resource))] [UIHint("NonEditable")] public string QuestionText { get; set; } [Display(Name = "Answer", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Answer_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Answer { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Participant/UserViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Participant { using System; using System.Linq.Expressions; using OJS.Common.DataAnnotations; using OJS.Data.Models; public class UserViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return c => new UserViewModel { Id = c.Id, Name = c.UserName }; } } public string Id { get; set; } public string Name { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Problem/DetailedProblemViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Problem { using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.ProblemResource; using Resource = Resources.Areas.Administration.Problems.ViewModels.DetailedProblem; public class DetailedProblemViewModel { [ExcludeFromExcel] public static Expression> FromProblem { get { return problem => new DetailedProblemViewModel { Id = problem.Id, Name = problem.Name, ContestId = problem.ContestId, ContestName = problem.Contest.Name, TrialTests = problem.Tests.AsQueryable().Count(x => x.IsTrialTest), CompeteTests = problem.Tests.AsQueryable().Count(x => !x.IsTrialTest), MaximumPoints = problem.MaximumPoints, TimeLimit = problem.TimeLimit, MemoryLimit = problem.MemoryLimit, ShowResults = problem.ShowResults, ShowDetailedFeedback = problem.ShowDetailedFeedback, SourceCodeSizeLimit = problem.SourceCodeSizeLimit, Checker = problem.Checker.Name, OrderBy = problem.OrderBy }; } } public int Id { get; set; } [Display(Name = "Name", ResourceType = typeof(Resource))] [Required( AllowEmptyStrings = false, ErrorMessageResourceName = "Name_required", ErrorMessageResourceType = typeof(Resource))] [MaxLength( GlobalConstants.ProblemNameMaxLength, ErrorMessageResourceName = "Name_length", ErrorMessageResourceType = typeof(Resource))] [DefaultValue("Име")] public string Name { get; set; } public int ContestId { get; set; } [Display(Name = "Contest", ResourceType = typeof(Resource))] public string ContestName { get; set; } [Display(Name = "Trial_tests", ResourceType = typeof(Resource))] public int TrialTests { get; set; } [Display(Name = "Compete_tests", ResourceType = typeof(Resource))] public int CompeteTests { get; set; } [Display(Name = "Max_points", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Max_points_required", ErrorMessageResourceType = typeof(Resource))] [DefaultValue(GlobalConstants.ProblemDefaultMaximumPoints)] public short MaximumPoints { get; set; } [Display(Name = "Time_limit", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Time_limit_required", ErrorMessageResourceType = typeof(Resource))] [DefaultValue(GlobalConstants.ProblemDefaultTimeLimit)] public int TimeLimit { get; set; } [Display(Name = "Memory_limit", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Memory_limit_required", ErrorMessageResourceType = typeof(Resource))] [DefaultValue(GlobalConstants.ProblemDefaultMemoryLimit)] public int MemoryLimit { get; set; } [Display(Name = "Checker", ResourceType = typeof(Resource))] public string Checker { get; set; } [ExcludeFromExcel] public IEnumerable AvailableCheckers { get; set; } [Display(Name = "Order", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Order_required", ErrorMessageResourceType = typeof(Resource))] [DefaultValue(0)] public int OrderBy { get; set; } [Display(Name = "Source_code_size_limit", ResourceType = typeof(Resource))] [DefaultValue(null)] public int? SourceCodeSizeLimit { get; set; } [Display(Name = "Show_results", ResourceType = typeof(Resource))] public bool ShowResults { get; set; } [Display(Name = "Show_detailed_feedback", ResourceType = typeof(Resource))] public bool ShowDetailedFeedback { get; set; } [ExcludeFromExcel] public IEnumerable Resources { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Problem/ProblemViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Problem { using System; using System.Linq.Expressions; using OJS.Common.DataAnnotations; using OJS.Data.Models; public class ProblemViewModel { [ExcludeFromExcel] public static Expression> FromProblem { get { return problem => new ProblemViewModel { Id = problem.Id, Name = problem.Name, ContestName = problem.Contest.Name }; } } public int Id { get; set; } public string Name { get; set; } public string ContestName { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/ProblemResource/ProblemResourceGridViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.ProblemResource { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common.DataAnnotations; using OJS.Common.Extensions; using OJS.Common.Models; using OJS.Data.Models; using Resource = Resources.Areas.Administration.Problems.ViewModels.ProblemResources; public class ProblemResourceGridViewModel { [ExcludeFromExcel] public static Expression> FromResource { get { return resource => new ProblemResourceGridViewModel { Id = resource.Id, ProblemId = resource.ProblemId, Name = resource.Name, Type = resource.Type, Link = resource.Link, OrderBy = resource.OrderBy, }; } } [Display(Name = "№")] [DefaultValue(null)] [HiddenInput(DisplayValue = false)] public int Id { get; set; } public int ProblemId { get; set; } [Display(Name = "Name", ResourceType = typeof(Resource))] public string Name { get; set; } [Display(Name = "Type", ResourceType = typeof(Resource))] public ProblemResourceType Type { get; set; } [Display(Name = "Link", ResourceType = typeof(Resource))] public string Link { get; set; } [Display(Name = "Order", ResourceType = typeof(Resource))] public int OrderBy { get; set; } public string TypeName => this.Type.GetDescription(); } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/ProblemResource/ProblemResourceViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.ProblemResource { using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web; using System.Web.Mvc; using OJS.Common; using OJS.Common.Models; using OJS.Data.Models; using Resource = Resources.Areas.Administration.Problems.ViewModels.ProblemResources; public class ProblemResourceViewModel { public static Expression> FromProblemResource { get { return res => new ProblemResourceViewModel { Id = res.Id, Name = res.Name, Type = res.Type, OrderBy = res.OrderBy, ProblemId = res.ProblemId, ProblemName = res.Problem.Name, }; } } public int? Id { get; set; } [Display(Name = "Name", ResourceType = typeof(Resource))] [Required( AllowEmptyStrings = false, ErrorMessageResourceName = "Name_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( GlobalConstants.ProblemResourceNameMaxLength, MinimumLength = GlobalConstants.ProblemResourceNameMinLength, ErrorMessageResourceName = "Name_length", ErrorMessageResourceType = typeof(Resource))] [DefaultValue("Име")] public string Name { get; set; } public int ProblemId { get; set; } public string ProblemName { get; set; } [Display(Name = "Type", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Type_required", ErrorMessageResourceType = typeof(Resource))] [DefaultValue(ProblemResourceType.ProblemDescription)] public ProblemResourceType Type { get; set; } public int DropDownTypeIndex => (int)this.Type - 1; public IEnumerable AllTypes { get; set; } public HttpPostedFileBase File { get; set; } public string FileExtension { get { var fileName = this.File.FileName; return fileName.Substring(fileName.LastIndexOf('.') + 1); } } [Display(Name = "Link", ResourceType = typeof(Resource))] [DefaultValue("http://")] public string Link { get; set; } [Display(Name = "Order", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Order_required", ErrorMessageResourceType = typeof(Resource))] public int OrderBy { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Roles/RoleAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Roles { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using Microsoft.AspNet.Identity.EntityFramework; using OJS.Common.DataAnnotations; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.Roles.ViewModels.RolesViewModels; public class RoleAdministrationViewModel : AdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return role => new RoleAdministrationViewModel { RoleId = role.Id, Name = role.Name, }; } } [DatabaseProperty(Name = "Id")] [HiddenInput(DisplayValue = false)] public string RoleId { get; set; } [DatabaseProperty] [Display(Name = "Name", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Name_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Name { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Roles/UserInRoleAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Roles { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using OJS.Common.DataAnnotations; using OJS.Data.Models; using Resource = Resources.Areas.Administration.Roles.ViewModels.RolesViewModels; public class UserInRoleAdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return us => new UserInRoleAdministrationViewModel { UserId = us.Id, UserName = us.UserName, FirstName = us.UserSettings.FirstName ?? Resource.Not_entered, LastName = us.UserSettings.LastName ?? Resource.Not_entered, Email = us.Email }; } } public string UserId { get; set; } [Display(Name = "UserName", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "UserName_required", ErrorMessageResourceType = typeof(Resource))] public string UserName { get; set; } [Display(Name = "Name", ResourceType = typeof(Resource))] public string FirstName { get; set; } [Display(Name = "Last_name", ResourceType = typeof(Resource))] public string LastName { get; set; } [Display(Name = "Email", ResourceType = typeof(Resource))] public string Email { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Setting/SettingAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Setting { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using OJS.Common.DataAnnotations; using OJS.Data.Models; using Resource = Resources.Areas.Administration.Settings.ViewModels.SettingAdministration; public class SettingAdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return set => new SettingAdministrationViewModel { Name = set.Name, Value = set.Value, }; } } [DatabaseProperty] [Display(Name = "Name", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Name_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Name { get; set; } [DatabaseProperty] [Display(Name = "Value", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Value_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("MultiLineText")] public string Value { get; set; } public Setting GetEntityModel(Setting model = null) { model = model ?? new Setting(); model.Name = this.Name; model.Value = this.Value; return model; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Submission/SubmissionAdministrationGridViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Submission { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.Submissions.ViewModels.SubmissionAdministration; public class SubmissionAdministrationGridViewModel : AdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return sub => new SubmissionAdministrationGridViewModel { Id = sub.Id, ParticipantName = sub.Participant.User.UserName, ProblemId = sub.ProblemId, ProblemName = sub.Problem.Name, SubmissionTypeName = sub.SubmissionType.Name, Points = sub.Points, Processed = sub.Processed, Processing = sub.Processing, CreatedOn = sub.CreatedOn, ModifiedOn = sub.ModifiedOn, }; } } [Display(Name = "№")] [DefaultValue(null)] [HiddenInput(DisplayValue = false)] public int? Id { get; set; } public int? ProblemId { get; set; } [Display(Name = "Problem", ResourceType = typeof(Resource))] public string ProblemName { get; set; } [Display(Name = "Participant", ResourceType = typeof(Resource))] public string ParticipantName { get; set; } [Display(Name = "Type", ResourceType = typeof(Resource))] public string SubmissionTypeName { get; set; } [Display(Name = "Points", ResourceType = typeof(Resource))] public int? Points { get; set; } [ScaffoldColumn(false)] public bool Processing { get; set; } [ScaffoldColumn(false)] public bool Processed { get; set; } [Display(Name = "Status", ResourceType = typeof(Resource))] public string Status { get { if (!this.Processing && this.Processed) { return Resource.Processed; } else if (this.Processing && !this.Processed) { return Resource.Processing; } else if (!this.Processing && !this.Processed) { return Resource.Pending; } else { throw new InvalidOperationException(Resource.Invalid_state); } } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Submission/SubmissionAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Submission { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web; using System.Web.Mvc; using OJS.Common.DataAnnotations; using OJS.Common.Extensions; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.Submissions.ViewModels.SubmissionAdministration; public class SubmissionAdministrationViewModel : AdministrationViewModel { private HttpPostedFileBase fileSubmission; [ExcludeFromExcel] public static Expression> ViewModel { get { return sub => new SubmissionAdministrationViewModel { Id = sub.Id, ProblemId = sub.ProblemId, ParticipantId = sub.ParticipantId, SubmissionTypeId = sub.SubmissionTypeId, AllowBinaryFilesUpload = sub.SubmissionType.AllowBinaryFilesUpload, Content = sub.Content, FileExtension = sub.FileExtension, CreatedOn = sub.CreatedOn, ModifiedOn = sub.ModifiedOn, }; } } [DatabaseProperty] [Display(Name = "№")] [DefaultValue(null)] [HiddenInput(DisplayValue = false)] public int? Id { get; set; } [DatabaseProperty] [Display(Name = "Problem", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Problem_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("ProblemComboBox")] public int? ProblemId { get; set; } [DatabaseProperty] [Display(Name = "Participant", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Participant_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("ParticipantDropDownList")] public int? ParticipantId { get; set; } [DatabaseProperty] [Display(Name = "Type", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Type_required", ErrorMessageResourceType = typeof(Resource))] [UIHint("SubmissionTypesDropDownList")] public int? SubmissionTypeId { get; set; } public bool? AllowBinaryFilesUpload { get; set; } [DatabaseProperty] [ScaffoldColumn(false)] [Required( ErrorMessageResourceName = "Content_required", ErrorMessageResourceType = typeof(Resource))] public byte[] Content { get; set; } [AllowHtml] [Display(Name = "Content_as_string", ResourceType = typeof(Resource))] [UIHint("MultiLineText")] public string ContentAsString { get { if (this.AllowBinaryFilesUpload.HasValue && !this.AllowBinaryFilesUpload.Value) { return this.Content.Decompress(); } return null; } set { this.Content = value.Compress(); } } [Display(Name = "File_submission", ResourceType = typeof(Resource))] [ScaffoldColumn(false)] public HttpPostedFileBase FileSubmission { get { return this.fileSubmission; } set { this.fileSubmission = value; this.Content = value.InputStream.ToByteArray(); this.FileExtension = value.FileName.GetFileExtension(); } } [DatabaseProperty] public string FileExtension { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/SubmissionType/SubmissionTypeAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.SubmissionType { using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Common.Models; using OJS.Data.Models; using Resource = Resources.Areas.Administration.SubmissionTypes.ViewModels.SubmissionTypeAdministration; public class SubmissionTypeAdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return st => new SubmissionTypeAdministrationViewModel { Id = st.Id, Name = st.Name, IsSelectedByDefault = st.IsSelectedByDefault, ExecutionStrategyType = st.ExecutionStrategyType, CompilerType = st.CompilerType, AdditionalCompilerArguments = st.AdditionalCompilerArguments, Description = st.Description, AllowBinaryFilesUpload = st.AllowBinaryFilesUpload, AllowedFileExtensions = st.AllowedFileExtensions }; } } [DatabaseProperty] [Display(Name = "№")] [DefaultValue(null)] [HiddenInput(DisplayValue = false)] public int Id { get; set; } [DatabaseProperty] [Display(Name = "Name", ResourceType = typeof(Resource))] [Required( AllowEmptyStrings = false, ErrorMessageResourceName = "Name_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( GlobalConstants.SubmissionTypeNameMaxLength, MinimumLength = GlobalConstants.SubmissionTypeNameMinLength, ErrorMessageResourceName = "Name_length", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Name { get; set; } [DatabaseProperty] [Display(Name = "Is_selected", ResourceType = typeof(Resource))] public bool IsSelectedByDefault { get; set; } [DatabaseProperty] [Display(Name = "Execution_strategy_type", ResourceType = typeof(Resource))] [UIHint("Enum")] public ExecutionStrategyType ExecutionStrategyType { get; set; } [DatabaseProperty] [Display(Name = "Compiler_type", ResourceType = typeof(Resource))] [UIHint("Enum")] public CompilerType CompilerType { get; set; } [DatabaseProperty] [Display(Name = "Additional_compiler_arguments", ResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string AdditionalCompilerArguments { get; set; } [DatabaseProperty] [Display(Name = "Description", ResourceType = typeof(Resource))] [UIHint("MultiLineText")] public string Description { get; set; } [DatabaseProperty] [Display(Name = "Allow_binary_files_upload", ResourceType = typeof(Resource))] public bool AllowBinaryFilesUpload { get; set; } [DatabaseProperty] [Display(Name = "Allowed_file_extensions", ResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string AllowedFileExtensions { get; set; } public SubmissionType GetEntityModel(SubmissionType model = null) { model = model ?? new SubmissionType(); model.Id = this.Id; model.Name = this.Name; model.IsSelectedByDefault = this.IsSelectedByDefault; model.ExecutionStrategyType = this.ExecutionStrategyType; model.CompilerType = this.CompilerType; model.AdditionalCompilerArguments = this.AdditionalCompilerArguments; model.Description = this.Description; model.AllowBinaryFilesUpload = this.AllowBinaryFilesUpload; model.AllowedFileExtensions = this.AllowedFileExtensions; return model; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/SubmissionType/SubmissionTypeViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.SubmissionType { using System; using System.Linq; using System.Linq.Expressions; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Contest; public class SubmissionTypeViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return st => new SubmissionTypeViewModel { Id = st.Id, Name = st.Name }; } } public int? Id { get; set; } public string Name { get; set; } public bool IsChecked { get; set; } public static Action ApplySelectedTo(ContestAdministrationViewModel contest) { return st => { var submissionViewModel = new SubmissionTypeViewModel { Id = st.Id, Name = st.Name, IsChecked = false, }; var selectedSubmission = contest.SelectedSubmissionTypes.FirstOrDefault(s => s.Id == st.Id); if (selectedSubmission != null) { submissionViewModel.IsChecked = true; } contest.SubmisstionTypes.Add(submissionViewModel); }; } public SubmissionType GetEntityModel(SubmissionType model = null) { model = model ?? new SubmissionType(); model.Id = this.Id.Value; return model; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/Test/TestViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.Test { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using System.Web.Script.Serialization; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Common.Extensions; using OJS.Data.Models; using Resource = Resources.Areas.Administration.Tests.ViewModels.TestAdministration; public class TestViewModel { [ExcludeFromExcel] public static Expression> FromTest { get { return test => new TestViewModel { Id = test.Id, InputData = test.InputData, OutputData = test.OutputData, IsTrialTest = test.IsTrialTest, OrderBy = test.OrderBy, ProblemId = test.Problem.Id, ProblemName = test.Problem.Name, TestRunsCount = test.TestRuns.Count }; } } public int Id { get; set; } [Display(Name = "Problem_name", ResourceType = typeof(Resource))] public string ProblemName { get; set; } [Display(Name = "Input", ResourceType = typeof(Resource))] [AllowHtml] [DataType(DataType.MultilineText)] [Required( AllowEmptyStrings = false, ErrorMessageResourceName = "Input_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( int.MaxValue, MinimumLength = GlobalConstants.TestInputMinLength)] public string Input { get { if (this.InputData == null) { return string.Empty; } var result = this.InputData.Decompress(); return result.Length > 20 ? result.Substring(0, 20) : result; } set { this.InputData = value.Compress(); } } [Display(Name = "Input", ResourceType = typeof(Resource))] [AllowHtml] [DataType(DataType.MultilineText)] [Required( AllowEmptyStrings = false, ErrorMessageResourceName = "Input_required", ErrorMessageResourceType = typeof(Resource))] [ScriptIgnore] [StringLength( int.MaxValue, MinimumLength = GlobalConstants.TestInputMinLength)] public string InputFull { get { if (this.InputData == null) { return string.Empty; } var result = this.InputData.Decompress(); return result; } set { this.InputData = value.Compress(); } } [Display(Name = "Output", ResourceType = typeof(Resource))] [AllowHtml] [DataType(DataType.MultilineText)] [Required( AllowEmptyStrings = false, ErrorMessageResourceName = "Output_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( int.MaxValue, MinimumLength = GlobalConstants.TestOutputMinLength)] public string Output { get { if (this.OutputData == null) { return string.Empty; } var result = this.OutputData.Decompress(); return result.Length > 20 ? result.Substring(0, 20) : result; } set { this.OutputData = value.Compress(); } } [Display(Name = "Output", ResourceType = typeof(Resource))] [AllowHtml] [DataType(DataType.MultilineText)] [Required( AllowEmptyStrings = false, ErrorMessageResourceName = "Output_required", ErrorMessageResourceType = typeof(Resource))] [ScriptIgnore] [StringLength( int.MaxValue, MinimumLength = GlobalConstants.TestOutputMinLength)] public string OutputFull { get { if (this.OutputData == null) { return string.Empty; } var result = this.OutputData.Decompress(); return result; } set { this.OutputData = value.Compress(); } } [Display(Name = "Trial_test_name", ResourceType = typeof(Resource))] public string TrialTestName => this.IsTrialTest ? Resource.Practice : Resource.Contest; [Display(Name = "Trial_test_name", ResourceType = typeof(Resource))] public bool IsTrialTest { get; set; } [Display(Name = "Order", ResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Order_required", ErrorMessageResourceType = typeof(Resource))] [RegularExpression(@"(0|[1-9]{1}[0-9]{0,8}|[1]{1}[0-9]{1,9}|[-]{1}[2]{1}([0]{1}[0-9]{8}|[1]{1}([0-3]{1}[0-9]{7}|[4]{1}([0-6]{1}[0-9]{6}|[7]{1}([0-3]{1}[0-9]{5}|[4]{1}([0-7]{1}[0-9]{4}|[8]{1}([0-2]{1}[0-9]{3}|[3]{1}([0-5]{1}[0-9]{2}|[6]{1}([0-3]{1}[0-9]{1}|[4]{1}[0-8]{1}))))))))|(\+)?[2]{1}([0]{1}[0-9]{8}|[1]{1}([0-3]{1}[0-9]{7}|[4]{1}([0-6]{1}[0-9]{6}|[7]{1}([0-3]{1}[0-9]{5}|[4]{1}([0-7]{1}[0-9]{4}|[8]{1}([0-2]{1}[0-9]{3}|[3]{1}([0-5]{1}[0-9]{2}|[6]{1}([0-3]{1}[0-9]{1}|[4]{1}[0-7]{1})))))))))")] public int OrderBy { get; set; } [Display(Name = "Problem_id", ResourceType = typeof(Resource))] public int ProblemId { get; set; } [Display(Name = "Test_runs_count", ResourceType = typeof(Resource))] public int TestRunsCount { get; set; } internal byte[] InputData { get; set; } internal byte[] OutputData { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/TestRun/TestRunViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.TestRun { using System; using System.Linq.Expressions; using OJS.Common.DataAnnotations; using OJS.Common.Models; using TestRunModel = OJS.Data.Models.TestRun; public class TestRunViewModel { [ExcludeFromExcel] public static Expression> FromTestRun { get { return testRun => new TestRunViewModel { Id = testRun.Id, ExecutionResult = testRun.ResultType, MemoryUsed = testRun.MemoryUsed, TimeUsed = testRun.TimeUsed, SubmissionId = testRun.SubmissionId, ProblemName = testRun.Test.Problem.Name, ExecutionComment = testRun.ExecutionComment, CheckerComment = testRun.CheckerComment, }; } } public int Id { get; set; } public int TimeUsed { get; set; } public long MemoryUsed { get; set; } public int SubmissionId { get; set; } public string ProblemName { get; set; } public string ExecutionComment { get; set; } public string CheckerComment { get; set; } public DateTime Date { get; set; } public TestRunResultType ExecutionResult { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/ViewModels/User/UserProfileAdministrationViewModel.cs ================================================ namespace OJS.Web.Areas.Administration.ViewModels.User { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common; using OJS.Common.Attributes; using OJS.Common.DataAnnotations; using OJS.Data.Models; using OJS.Web.Areas.Administration.ViewModels.Common; using Resource = Resources.Areas.Administration.Users.ViewModels.UserProfileAdministration; public class UserProfileAdministrationViewModel : AdministrationViewModel { [ExcludeFromExcel] public static Expression> ViewModel { get { return user => new UserProfileAdministrationViewModel { Id = user.Id, UserName = user.UserName, Email = user.Email, IsGhostUser = user.IsGhostUser, FirstName = user.UserSettings.FirstName, LastName = user.UserSettings.LastName, City = user.UserSettings.City, EducationalInstitution = user.UserSettings.EducationalInstitution, FacultyNumber = user.UserSettings.FacultyNumber, DateOfBirth = user.UserSettings.DateOfBirth, Company = user.UserSettings.Company, JobTitle = user.UserSettings.JobTitle, CreatedOn = user.CreatedOn, ModifiedOn = user.ModifiedOn, }; } } [Display(Name = "№")] [HiddenInput(DisplayValue = false)] public string Id { get; set; } [Display(Name = "UserName", ResourceType = typeof(Resource))] [UIHint("NonEditable")] public string UserName { get; set; } [DataType(DataType.EmailAddress)] [RegularExpression( GlobalConstants.EmailRegEx, ErrorMessageResourceName = "Mail_invalid", ErrorMessageResourceType = typeof(Resource))] [Required( ErrorMessageResourceName = "Mail_required", ErrorMessageResourceType = typeof(Resource))] [StringLength( GlobalConstants.EmailMaxLength, ErrorMessageResourceName = "Mail_length", ErrorMessageResourceType = typeof(Resource))] [UIHint("SingleLineText")] public string Email { get; set; } [Display(Name = "Is_ghoust_user", ResourceType = typeof(Resource))] [HiddenInput(DisplayValue = false)] public bool IsGhostUser { get; set; } [Display(Name = "First_name", ResourceType = typeof(Resource))] [StringLength( GlobalConstants.FirstNameMaxLength, ErrorMessageResourceName = "First_name_length", ErrorMessageResourceType = typeof(Resource))] [LocalizedDisplayFormat( NullDisplayTextResourceName = "Null_display_text", NullDisplayTextResourceType = typeof(Resource), ConvertEmptyStringToNull = true)] [UIHint("SingleLineText")] public string FirstName { get; set; } [Display(Name = "Last_name", ResourceType = typeof(Resource))] [StringLength( GlobalConstants.LastNameMaxLength, ErrorMessageResourceName = "Last_name_length", ErrorMessageResourceType = typeof(Resource))] [LocalizedDisplayFormat( NullDisplayTextResourceName = "Null_display_text", NullDisplayTextResourceType = typeof(Resource), ConvertEmptyStringToNull = true)] [UIHint("SingleLineText")] public string LastName { get; set; } [Display(Name = "City", ResourceType = typeof(Resource))] [StringLength( GlobalConstants.CityNameMaxLength, ErrorMessageResourceName = "City_length", ErrorMessageResourceType = typeof(Resource))] [LocalizedDisplayFormat( NullDisplayTextResourceName = "Null_display_text", NullDisplayTextResourceType = typeof(Resource), ConvertEmptyStringToNull = true)] [UIHint("SingleLineText")] public string City { get; set; } [Display(Name = "Educational_institution", ResourceType = typeof(Resource))] [StringLength( GlobalConstants.EducationalInstitutionMaxLength, ErrorMessageResourceName = "Educational_institution_length", ErrorMessageResourceType = typeof(Resource))] [LocalizedDisplayFormat( NullDisplayTextResourceName = "Null_display_text", NullDisplayTextResourceType = typeof(Resource), ConvertEmptyStringToNull = true)] [UIHint("SingleLineText")] public string EducationalInstitution { get; set; } [Display(Name = "Faculty_number", ResourceType = typeof(Resource))] [StringLength( GlobalConstants.FacultyNumberMaxLength, ErrorMessageResourceName = "Faculty_number_length", ErrorMessageResourceType = typeof(Resource))] [LocalizedDisplayFormat( NullDisplayTextResourceName = "Null_display_text", NullDisplayTextResourceType = typeof(Resource), ConvertEmptyStringToNull = true)] [UIHint("PositiveInteger")] public string FacultyNumber { get; set; } [Display(Name = "Date_of_birth", ResourceType = typeof(Resource))] [LocalizedDisplayFormat( NullDisplayTextResourceName = "Null_display_text", NullDisplayTextResourceType = typeof(Resource), ConvertEmptyStringToNull = true, DataFormatString = "{0:dd-MM-yyyy}")] [DataType(DataType.Date)] [UIHint("Date")] public DateTime? DateOfBirth { get; set; } [Display(Name = "Company", ResourceType = typeof(Resource))] [StringLength( GlobalConstants.CompanyNameMaxLength, ErrorMessageResourceName = "Company_length", ErrorMessageResourceType = typeof(Resource))] [LocalizedDisplayFormat( NullDisplayTextResourceName = "Null_display_text", NullDisplayTextResourceType = typeof(Resource), ConvertEmptyStringToNull = true)] [UIHint("SingleLineText")] public string Company { get; set; } [Display(Name = "Job_title", ResourceType = typeof(Resource))] [StringLength( GlobalConstants.JobTitleMaxLenth, ErrorMessageResourceName = "Job_title_length", ErrorMessageResourceType = typeof(Resource))] [LocalizedDisplayFormat( NullDisplayTextResourceName = "Null_display_text", NullDisplayTextResourceType = typeof(Resource), ConvertEmptyStringToNull = true)] [UIHint("SingleLineText")] public string JobTitle { get; set; } [Display(Name = "Age", ResourceType = typeof(Resource))] [LocalizedDisplayFormat( NullDisplayTextResourceName = "Null_display_text", NullDisplayTextResourceType = typeof(Resource), ConvertEmptyStringToNull = true)] [UIHint("NonEditable")] public byte Age => Calculator.Age(this.DateOfBirth) ?? default(byte); public override UserProfile GetEntityModel(UserProfile model = null) { model = model ?? new UserProfile(); model.Id = this.Id; model.UserName = this.UserName; model.Email = this.Email; model.UserSettings = new UserSettings { FirstName = this.FirstName, LastName = this.LastName, City = this.City, EducationalInstitution = this.EducationalInstitution, FacultyNumber = this.FacultyNumber, DateOfBirth = this.DateOfBirth, Company = this.Company, JobTitle = this.JobTitle, }; model.CreatedOn = this.CreatedOn.GetValueOrDefault(); model.ModifiedOn = this.ModifiedOn; return model; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/AccessLogs/Index.cshtml ================================================ @using Resource = Resources.Areas.Administration.AccessLogs.Views.AccessLogsIndex; @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @{ ViewBag.Title = Resource.Page_title; const string ControllerName = "AccessLogs"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(x => x.Id); columns.Bound(x => x.UserName); columns.Bound(x => x.IpAddress); columns.Bound(x => x.RequestType); columns.Bound(x => x.Url); columns.Bound(x => x.PostParams); columns.Bound(x => x.CreatedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Bound(x => x.ModifiedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); }) .ToolBar(toolbar => { toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(x => x.Id); }) .Sort(sort => sort.Add(x => x.CreatedOn).Descending()) .Read(read => read.Action("Read", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/AntiCheat/ByIP.cshtml ================================================ @using Resource = Resources.Areas.Administration.AntiCheat.Views.AntiCheatViews; @model IEnumerable @{ ViewBag.Title = Resource.By_ip_page_title; }

@ViewBag.Title

@Html.Partial("_ContestsComboBox", Model)

@section scripts{ } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/AntiCheat/BySubmissionSimilarity.cshtml ================================================ @using Resource = Resources.Areas.Administration.AntiCheat.Views.AntiCheatViews @model OJS.Web.Areas.Administration.ViewModels.AntiCheat.SubmissionSimilarityFiltersInputModel @{ ViewBag.Title = Resource.By_submission_page_title; } @section styles { }

@ViewBag.Title

@Html.LabelFor(m => m.ContestId)
@Html.LabelFor(m => m.PlagiarismDetectorType)
@(Html.Kendo().ComboBoxFor(m => m.ContestId) .Filter(FilterType.Contains) .AutoBind(false) .MinLength(3) .Placeholder(Resource.Choose_or_enter_contest) .DataValueField("Id") .DataTextField("Name") .DataSource(dataSource => dataSource.Read(read => read.Action("Contests", "Submissions").Data("onAdditionalData")).ServerFiltering(true)) .HtmlAttributes(new { style = "width: 100%; height: 30px" }))
@(Html.Kendo().DropDownListFor(m => m.PlagiarismDetectorType) .BindTo(Model.PlagiarismDetectorTypes) .DataValueField("Value") .DataTextField("Text") .HtmlAttributes(new { style = "width: 100%" }))

@section scripts { } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/AntiCheat/_ContestsComboBox.cshtml ================================================ @using Resource = Resources.Areas.Administration.AntiCheat.Views.AntiCheatViews; @model IEnumerable @(Html.Kendo() .ComboBox() .Name("contests") .BindTo(Model) .Filter(FilterType.Contains) .AutoBind(false) .MinLength(3) .Placeholder(Resource.Choose_or_enter_contest) .Events(ev => ev.Change("selectContest")) .HtmlAttributes(new { style = "width: 100%; height: 30px" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/AntiCheat/_IPGrid.cshtml ================================================ @using Resource = Resources.Areas.Administration.AntiCheat.Views.AntiCheatViews; @model IEnumerable @foreach (var participant in Model) { }
@Resource.Participant_id @Resource.Username @Resource.Points @Resource.Ip_addresses
@participant.Id @participant.UserName @participant.Points @Html.Raw(string.Join(" | ", participant.DifferentIps.Take(10).Select(ip => string.Format("{0}", ip))))
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/AntiCheat/_SubmissionsGrid.cshtml ================================================ @using Resource = Resources.Areas.Administration.AntiCheat.Views.AntiCheatViews @model IEnumerable> @if (Model.Any()) { foreach (var groupedReport in Model) { var reports = groupedReport.OrderByDescending(p => p.Percentage);

@groupedReport.Key

@foreach (var report in reports) { }
@Resource.First_participant @Resource.Second_participant @Resource.Points @Resource.Differences @Resource.Percentage
@report.FirstParticipantName - @report.FirstSubmissionCreatedOn @report.SecondParticipantName - @report.SecondSubmissionCreatedOn @report.Points @report.Differences @report.Percentage.ToString("F2")%

} } else {
@Resource.No_similarities
} ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Checkers/Index.cshtml ================================================ @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @using Resource = Resources.Areas.Administration.Checkers.Views.CheckersIndex; @{ ViewBag.Title = Resource.Page_title; const string ControllerName = "Checkers"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(col => col.Id); columns.Bound(col => col.Name); columns.Bound(col => col.Description).Hidden(); columns.Bound(col => col.DllFile); columns.Bound(col => col.ClassName); columns.Bound(col => col.Parameter).ClientTemplate("#= substring(Parameter) #"); columns.Bound(col => col.CreatedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Bound(col => col.ModifiedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Command(command => command.Edit().Text(" ").UpdateText(GeneralResource.Change).CancelText(GeneralResource.Cancel)).Width(80); columns.Command(command => command.Destroy().Text(" ")).Width(80); }) .ToolBar(toolbar => { toolbar.Create().Text(GeneralResource.Create); toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); editable.DisplayDeleteConfirmation(GeneralResource.Delete_prompt); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(m => m.Id); model.Field(m => m.DllFile).DefaultValue("OJS.Workers.Checkers.dll"); model.Field(m => m.ClassName).DefaultValue("OJS.Workers.Checkers.CSharpCodeChecker"); }) .Sort(sort => sort.Add(x => x.CreatedOn).Descending()) .Create(create => create.Action("Create", ControllerName)) .Read(read => read.Action("Read", ControllerName)) .Update(update => update.Action("Update", ControllerName)) .Destroy(destroy => destroy.Action("Destroy", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/ContestCategories/Hierarchy.cshtml ================================================ @using Resource = Resources.Areas.Administration.ContestCategories.Views.ContestCategoriesViews; @{ ViewBag.Title = Resource.Heirarchy_page_title; }

@ViewBag.Title

@(Html.Kendo().TreeView() .Name("treeview") .DragAndDrop(true) .DataTextField("Name") .DataSource(dataSource => dataSource .Read(read => read .Action("ReadCategories", "ContestCategories") ) ) .Events(e => e.Drop("onDrop")) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/ContestCategories/Index.cshtml ================================================ @using Resource = Resources.Areas.Administration.ContestCategories.Views.ContestCategoriesViews; @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @{ ViewBag.Title = Resource.Index_page_title; const string ControllerName = "ContestCategories"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(x => x.Id); columns.Bound(x => x.Name); columns.Bound(x => x.IsVisible); columns.Bound(x => x.OrderBy); columns.Bound(x => x.CreatedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Bound(x => x.ModifiedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Command(command => command.Edit().Text(" ").UpdateText(GeneralResource.Change).CancelText(GeneralResource.Cancel)).Width(80).Title(GeneralResource.Change); columns.Command(command => command.Destroy().Text(" ")).Width(80).Title(GeneralResource.Delete); }) .ToolBar(toolbar => { toolbar.Create().Text(GeneralResource.Create); toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); editable.DisplayDeleteConfirmation(Resource.Delete_prompt); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Groupable(x => { x.Enabled(true); x.Messages(m => m.Empty(GeneralResource.Group_by_message)); }) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => model.Id(x => x.Id)) .Sort(sort => sort.Add(x => x.CreatedOn).Descending()) .Create(create => create.Action("Create", ControllerName)) .Read(read => read.Action("Read", ControllerName)) .Update(update => update.Action("Update", ControllerName)) .Destroy(destroy => destroy.Action("Destroy", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Contests/Create.cshtml ================================================ @using Resource = Resources.Areas.Administration.Contests.Views.ContestCreate; @model OJS.Web.Areas.Administration.ViewModels.Contest.ContestAdministrationViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@using (Html.BeginForm("Create", "Contests", FormMethod.Post)) { @Html.AntiForgeryToken() @Html.ValidationMessage(GlobalConstants.DateTimeError) @Html.Partial("_ContestEditor", Model)
}
@(Html.Kendo().Tooltip().For("#create-form").Filter("[data-tooltip='true']").Position(TooltipPosition.Bottom).Width(240)) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Contests/Edit.cshtml ================================================ @using Resource = Resources.Areas.Administration.Contests.Views.ContestEdit @model OJS.Web.Areas.Administration.ViewModels.Contest.ContestAdministrationViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title @Model.Name

@using (Html.BeginForm("Edit", "Contests", FormMethod.Post)) { @Html.AntiForgeryToken() @Html.HiddenFor(m => m.CreatedOn) @Html.ValidationMessage(GlobalConstants.DateTimeError) @Html.Partial("_ContestEditor", Model)
}
@(Html.Kendo().Tooltip().For("#create-form").Filter("[data-tooltip='true']").Position(TooltipPosition.Bottom).Width(240)) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Contests/EditorTemplates/CategoryDropDown.cshtml ================================================ @using Resource = Resources.Areas.Administration.Contests.Views.EditorTemplates.CategoryDropDown; @model int? @(Html.Kendo() .DropDownListFor(m => m) .OptionLabel(Resource.Choose_category) .DataTextField("Text") .DataValueField("Value") .DataSource(data => { data.ServerFiltering(true) .Read(read => { read.Action("GetCategories", "Contests"); }); }) .HtmlAttributes(new { style = "width: 100%;" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Contests/EditorTemplates/ContestQuestionType.cshtml ================================================ @using OJS.Common.Models @model ContestQuestionType @(Html.Kendo() .DropDownListFor(m => m) .BindTo(EnumConverter.GetSelectListItems()) .SelectedIndex((int)Model - 1) .HtmlAttributes(new { @class = "pull-left full-kendo-editor" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Contests/EditorTemplates/SubmissionTypeCheckBoxes.cshtml ================================================ @using Resource = Resources.Areas.Administration.Contests.Views.EditorTemplates.SubmissionTypeCheckBoxes; @model IList @for (int i = 0; i < Model.Count(); i++) {
@Html.HiddenFor(m => Model[i].Id) @Html.HiddenFor(m => Model[i].Name) @Html.LabelFor(m => Model[i].IsChecked, Model[i].Name)
@Html.EditorFor(m => Model[i].IsChecked, new { @class = "form-control pull-left full-editor" })
} ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Contests/Index.cshtml ================================================ @using Resource = Resources.Areas.Administration.Contests.Views.ContestIndex @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @{ ViewBag.Title = Resource.Page_title; const string ContestControllerName = "Contests"; const string ContestQuestionControllerName = "ContestQuestions"; const string ContestQuestionAnswersControllerName = "ContestQuestionAnswers"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(x => x.Id); columns.Bound(x => x.Name); columns.Bound(x => x.StartTime).Format("{0:dd/MM/yyyy HH:mm}"); columns.Bound(x => x.EndTime).Format("{0:dd/MM/yyyy HH:mm}"); columns.Bound(x => x.PracticeStartTime).Format("{0:dd/MM/yyyy HH:mm}"); columns.Bound(x => x.PracticeEndTime).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Bound(x => x.IsVisible).Hidden(); columns.Bound(x => x.CreatedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Bound(x => x.ModifiedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Template(@).ClientTemplate(string.Format("{1}
{2}", Url.Action("Solutions", "ContestsExport"), Resource.For_contest, Resource.For_practice)).Title(Resource.Results).Width(200); columns.Template(@).ClientTemplate(string.Format("{1}
{2}", Url.Action("Results", "ContestsExport"), Resource.For_contest, Resource.For_practice)).Title(Resource.Ranking).Width(200); columns.Template(@).ClientTemplate(string.Format("{1}
{3}", Url.Action("Contest", "Problems"), Resource.Tasks, Url.Action("Contest", "Participants"), Resource.Participants)).Title(Resource.Other); columns.Template(@).ClientTemplate(string.Format("{1}", Url.Action("Edit", "Contests"), Resource.Edit)).Title(GeneralResource.Change); columns.Command(command => command.Destroy().Text(" ")).Width(80).Title(GeneralResource.Delete); }) .ToolBar(toolbar => { toolbar.Custom().Text(GeneralResource.Create).Action("Create", ContestControllerName); toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ContestControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); editable.DisplayDeleteConfirmation(GeneralResource.Delete_prompt); }) .ColumnMenu() .ClientDetailTemplateId("questions-template") .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Groupable(x => { x.Enabled(true); x.Messages(m => m.Empty(GeneralResource.Group_by_message)); }) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => model.Id(x => x.Id)) .Sort(sort => sort.Add(x => x.CreatedOn).Descending()) .Create(create => create.Action("Create", ContestControllerName)) .Read(read => read.Action("Read", ContestControllerName)) .Update(update => update.Action("Update", ContestControllerName)) .Destroy(destroy => destroy.Action("Destroy", ContestControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) @section scripts { } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Contests/_ContestEditor.cshtml ================================================ @using Resource = Resources.Areas.Administration.Contests.Views.Partials.ContestEditor; @model OJS.Web.Areas.Administration.ViewModels.Contest.ContestAdministrationViewModel
@Html.ValidationMessageFor(m => m.SelectedSubmissionTypes)
@Resource.General_info
@Html.LabelFor(m => m.Name)
@Html.EditorFor(m => m.Name, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.Name)

@Html.LabelFor(m => m.CategoryId)
@Html.EditorFor(m => m.CategoryId, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.CategoryId)

@Html.LabelFor(m => m.Description)
@Html.EditorFor(m => m.Description, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.Description)

@Resource.Duration_info
@Html.LabelFor(m => m.StartTime)
@Html.EditorFor(m => m.StartTime, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.StartTime)

@Html.LabelFor(m => m.EndTime)
@Html.EditorFor(m => m.EndTime, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.EndTime)

@Html.LabelFor(m => m.PracticeStartTime)
@Html.EditorFor(m => m.PracticeStartTime, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.PracticeStartTime)

@Html.LabelFor(m => m.PracticeEndTime)
@Html.EditorFor(m => m.PracticeEndTime, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.PracticeEndTime)

@Resource.Passowords_info
@Html.LabelFor(m => m.ContestPassword)
@Html.EditorFor(m => m.ContestPassword, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.ContestPassword)

@Html.LabelFor(m => m.PracticePassword)
@Html.EditorFor(m => m.PracticePassword, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.PracticePassword)

@Resource.Options
@Html.LabelFor(m => m.LimitBetweenSubmissions)
@Html.EditorFor(m => m.LimitBetweenSubmissions, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.LimitBetweenSubmissions)

@Html.LabelFor(m => m.OrderBy)
@Html.EditorFor(m => m.OrderBy, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.OrderBy)

@Html.LabelFor(m => m.IsVisible)
@Html.EditorFor(m => m.IsVisible, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.IsVisible)

@Resource.Submission_types @Html.EditorFor(m => m.SubmisstionTypes)
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Feedback/Index.cshtml ================================================ @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @using Resource = Resources.Areas.Administration.Feedback.Views.FeedbackIndexAdmin; @{ ViewBag.Title = Resource.Page_title; const string ControllerName = "Feedback"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(x => x.Id); columns.Bound(x => x.Name); columns.Bound(x => x.Content); columns.Bound(x => x.IsFixed); columns.Bound(x => x.Username); columns.Bound(x => x.CreatedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Bound(x => x.ModifiedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Command(command => command.Edit().Text(" ").UpdateText(GeneralResource.Change).CancelText(GeneralResource.Cancel)).Width(80); columns.Command(command => command.Destroy().Text(" ")).Width(80); }) .ToolBar(toolbar => { toolbar.Create().Text(GeneralResource.Create); toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); editable.DisplayDeleteConfirmation(GeneralResource.Delete_prompt); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(x => x.Id); }) .Sort(sort => sort.Add(x => x.CreatedOn).Descending()) .Create(create => create.Action("Create", ControllerName)) .Read(read => read.Action("Read", ControllerName)) .Update(update => update.Action("Update", ControllerName)) .Destroy(destroy => destroy.Action("Destroy", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Navigation/Index.cshtml ================================================ @{ ViewBag.Title = "Администрация"; }

@ViewBag.Title

@Html.ActionLink("Новини", GlobalConstants.Index, "News", new { area = "Administration" }, null)
@Html.ActionLink("Задачи", GlobalConstants.Index, "Problems", new { area = "Administration" }, null)
@Html.ActionLink("Състезания", GlobalConstants.Index, "Contests", new { area = "Administration" }, null)
@Html.ActionLink("Категории", GlobalConstants.Index, "ContestCategories", new { area = "Administration" }, null)
@Html.ActionLink("Обратна връзка", GlobalConstants.Index, "Feedback", new { area = "Administration" }, null)
@Html.ActionLink("Йерархия на категориите", "Hierarchy", "ContestCategories", new { area = "Administration" }, null)
@Html.ActionLink("Тестови файлове", GlobalConstants.Index, "Tests", new { area = "Administration" }, null)
@Html.ActionLink("Потребители", GlobalConstants.Index, "Users", new { area = "Administration" }, null)
@Html.ActionLink("Решения", GlobalConstants.Index, "Submissions", new { area = "Administration" }, null)
@Html.ActionLink("Роли", GlobalConstants.Index, "Roles", new { area = "Administration" }, null)
@Html.ActionLink("Настройки", GlobalConstants.Index, "Settings", new { area = "Administration" }, null)
@Html.ActionLink("Логове за достъп", GlobalConstants.Index, "AccessLogs", new { area = "Administration" }, null)
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/News/Index.cshtml ================================================ @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @using Resource = Resources.Areas.Administration.News.Views.NewsIndex; @{ ViewBag.Title = Resource.Page_title; const string ControllerName = "News"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(col => col.Id); columns.Bound(col => col.Title).ClientTemplate("#= Title #"); columns.Bound(col => col.Author); columns.Bound(col => col.IsVisible); columns.Bound(col => col.CreatedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Bound(col => col.ModifiedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Command(command => command.Edit().Text(" ").UpdateText(GeneralResource.Change).CancelText(GeneralResource.Cancel)).Width(80); columns.Command(command => command.Destroy().Text(" ")).Width(80); }) .ToolBar(toolbar => { toolbar.Create().Text(GeneralResource.Create); toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(Resource.Download_news).Action("Fetch", "News", new { Area = "Administration" }); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); editable.DisplayDeleteConfirmation(GeneralResource.Delete_prompt); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(m => m.Id); }) .Sort(sort => sort.Add(x => x.CreatedOn).Descending()) .Create(create => create.Action("Create", ControllerName)) .Read(read => read.Action("Read", ControllerName)) .Update(update => update.Action("Update", ControllerName)) .Destroy(destroy => destroy.Action("Destroy", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Participants/Contest.cshtml ================================================ @using Resource = Resources.Areas.Administration.Participants.Views.ParticipantsContest; @model int @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@Html.Partial("_Participants", Model)
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Participants/EditorTemplates/ContestsComboBox.cshtml ================================================ @using Resource = Resources.Areas.Administration.Participants.Views.EditorTemplates.ParticipantEditorTemplates; @model int @(Html.Kendo() .ComboBoxFor(m => m) .Name("ContestId") .DataTextField("Name") .DataValueField("Id") .Filter(FilterType.Contains) .MinLength(1) .Placeholder(Resource.Choose_contest) .Value(Resource.Choose_contest) .DataSource(data => { data.ServerFiltering(true) .Read(read => { read.Action("Contests", "Participants") .Data(@ function () { return { text: $('\\#ContestId').data("kendoComboBox").input.val() };} ); }); }) .HtmlAttributes(new { style = "width: 100%;" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Participants/EditorTemplates/UsersComboBox.cshtml ================================================ @using Resource = Resources.Areas.Administration.Participants.Views.EditorTemplates.ParticipantEditorTemplates; @model string @(Html.Kendo() .ComboBoxFor(m => m) .Name("UserId") .DataTextField("Name") .DataValueField("Id") .Filter(FilterType.Contains) .MinLength(1) .Placeholder(Resource.Choose_user) .Value(Resource.Choose_user) .DataSource(data => { data.ServerFiltering(true) .Read(read => { read.Action("Users", "Participants") .Data(@ function () { return { text: $('\\#UserId').data("kendoComboBox").input.val() };} ); }); }) .HtmlAttributes(new { style = "width: 100%;" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Participants/Index.cshtml ================================================ @using Resource = Resources.Areas.Administration.Participants.Views.ParticipantsIndex; @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@(Html .Kendo() .ComboBox() .Name("contests") .DataTextField("Name") .DataValueField("Id") .Filter(FilterType.Contains) .AutoBind(false) .MinLength(3) .Placeholder(Resource.Choose_or_enter_contest) .Events(ev => ev.Change("selectContest")) .DataSource(dataSource => { dataSource .Read(read => { read.Action("Contests", "Participants") .Data("additionalComboBoxData"); }) .ServerFiltering(true); }) .HtmlAttributes(new { style = "width: 100%;" }))
@Ajax.ActionLink(Resource.Clear, "RenderGrid", null, new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "participants-grid", OnSuccess = "clearContestComboBox" }, new { @class = "btn btn-primary btn-sm" })

@Html.Partial("_Participants")
@section scripts{ } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Participants/_Participants.cshtml ================================================ @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @using Resource = Resources.Areas.Administration.Participants.Views.Partials.Participants; @model int? @{ const string ControllerName = "Participants"; } @(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(col => col.Id); columns.Bound(col => col.UserName); columns.Bound(col => col.ContestName); columns.Bound(col => col.IsOfficial); columns.Bound(col => col.CreatedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Bound(col => col.ModifiedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Command(command => command.Destroy().Text(" ")).Width(80); }) .ToolBar(toolbar => { toolbar.Create().Text(Resource.Add_participant); toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); editable.DisplayDeleteConfirmation(GeneralResource.Delete_prompt); }) .ColumnMenu() .ClientDetailTemplateId("questions-answers-template") .Events(e => e.DataBound("onDataBound").Edit("onEdit")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(m => m.Id); }) .Sort(sort => sort.Add(x => x.CreatedOn).Descending()) .Create(create => create.Action("Create", ControllerName)) .Read(read => read.Action("ReadParticipants", ControllerName, new { id = Model })) .Destroy(destroy => destroy.Action("Destroy", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) @if (Model.HasValue) { } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Problems/Create.cshtml ================================================ @using Resource = Resources.Areas.Administration.Problems.Views.ProblemsCreate; @model OJS.Web.Areas.Administration.ViewModels.Problem.DetailedProblemViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title @Resource.For @Model.ContestName

@using (Html.BeginForm("Create", "Problems", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.AntiForgeryToken() @Html.ValidationMessage("Resources") @Html.HiddenFor(m => m.ContestName) @Html.HiddenFor(m => m.ContestId)
@Resource.General_info
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.Name)

@Html.LabelFor(m => m.MaximumPoints)
@(Html.Kendo() .NumericTextBoxFor(m => m.MaximumPoints) .Min(1) .Format("#") .Step(1) .Spinners(false) .HtmlAttributes(new { @class = "pull-left full-editor" }))
@Html.ValidationMessageFor(m => m.MaximumPoints)

@Html.LabelFor(m => m.TimeLimit) (в ms)
@(Html.Kendo() .NumericTextBoxFor(m => m.TimeLimit) .Min(1) .Format("#") .Step(1) .Spinners(false) .HtmlAttributes(new { @class = "pull-left full-editor" }))
@Html.ValidationMessageFor(m => m.TimeLimit)

@Html.LabelFor(m => m.MemoryLimit) (в B)
@(Html.Kendo() .NumericTextBoxFor(m => m.MemoryLimit) .Format("#") .Min(1) .Step(1) .Spinners(false) .HtmlAttributes(new { @class = "pull-left full-editor" }))
@Html.ValidationMessageFor(m => m.MemoryLimit)

@Html.LabelFor(m => m.SourceCodeSizeLimit) (в B)
Да @(Html.Kendo() .NumericTextBoxFor(m => m.SourceCodeSizeLimit) .Format("#") .Min(1) .Step(1) .Enable(false) .Spinners(false) .HtmlAttributes(new { @class = "pull-right full-editor", style = "width: 75%" }))
@Html.ValidationMessageFor(m => m.SourceCodeSizeLimit)
@Resource.Settings
@Html.LabelFor(m => m.Checker)
@(Html.Kendo() .DropDownListFor(m => m.Checker) .BindTo(Model.AvailableCheckers) .HtmlAttributes(new { @class = "pull-left full-kendo-editor" }))
@Html.ValidationMessageFor(m => m.Checker)

@Html.LabelFor(m => m.OrderBy)
@(Html.Kendo() .NumericTextBoxFor(m => m.OrderBy) .Format("#") .Min(0) .Step(1) .Spinners(false) .HtmlAttributes(new { @class = "pull-left full-editor" }))
@Html.ValidationMessageFor(m => m.OrderBy)

@Html.LabelFor(m => m.ShowResults)
@Html.EditorFor(m => m.ShowResults)
@Html.ValidationMessageFor(m => m.ShowResults)

@Html.LabelFor(m => m.ShowDetailedFeedback)
@Html.EditorFor(m => m.ShowDetailedFeedback)
@Html.ValidationMessageFor(m => m.ShowDetailedFeedback)

@Resource.Resources

@Resource.Tests
@Resource.Tests_label
@Resource.Choose_file


}
@(Html.Kendo().Tooltip().For("#create-form").Filter("[data-tooltip='true']").Position(TooltipPosition.Bottom).Width(240)) @section scripts{ @Scripts.Render("~/bundles/jqueryval") } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Problems/Delete.cshtml ================================================ @using Resource = Resources.Areas.Administration.Problems.Views.ProblemsDelete @model OJS.Web.Areas.Administration.ViewModels.Problem.DetailedProblemViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title @Model.Name

@Html.LabelFor(m => m.Name)
@Model.Name

@Html.LabelFor(m => m.MaximumPoints)
@Model.MaximumPoints

@Html.LabelFor(m => m.TimeLimit)
@Model.TimeLimit

@Html.LabelFor(m => m.MemoryLimit)
@Model.MemoryLimit

@if (Model.SourceCodeSizeLimit != null) {
@Html.LabelFor(m => m.SourceCodeSizeLimit)
@Model.SourceCodeSizeLimit

} @if (Model.Checker != null) {
@Html.LabelFor(m => m.Checker)
@Model.Checker

}
@Html.LabelFor(m => m.OrderBy)
@Model.OrderBy

@Resource.Delete @Resource.Back
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Problems/DeleteAll.cshtml ================================================ @using Resource = Resources.Areas.Administration.Problems.Views.ProblemsDeleteAll @model OJS.Web.Areas.Administration.ViewModels.Contest.ContestAdministrationViewModel @{ ViewBag.Title = Resource.Page_title; }

@Model.Name

@ViewBag.Title

@Resource.Confirm_message @Model.Name?

@Resource.Confirm @Resource.Back ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Problems/Details.cshtml ================================================ @using Resource = Resources.Areas.Administration.Problems.Views.ProblemsDetails; @model OJS.Web.Areas.Administration.ViewModels.Problem.DetailedProblemViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title @Model.Name

@Html.LabelFor(m => m.Name)
@Model.Name

@Html.LabelFor(m => m.ContestName)
@Model.ContestName

@Html.LabelFor(m => m.TimeLimit)
@Model.TimeLimit

@Html.LabelFor(m => m.MemoryLimit)
@Model.MemoryLimit

@Html.LabelFor(m => m.SourceCodeSizeLimit)
@if (Model.SourceCodeSizeLimit == null) { @Resource.Unlimited } else { @Model.SourceCodeSizeLimit }

@Html.LabelFor(m => m.MaximumPoints)
@Model.MaximumPoints

@Html.LabelFor(m => m.Checker)
@Model.Checker

@Html.LabelFor(m => m.ShowResults)
@(Model.ShowResults ? Resource.Results_visible : Resource.Results_invisible)
@Html.LabelFor(m => m.ShowDetailedFeedback)
@(Model.ShowDetailedFeedback ? Resource.Full_feedback_visible : Resource.Full_feedback_invisible)

@Html.LabelFor(m => m.OrderBy)
@Model.OrderBy

@Ajax.ActionLink(Resource.Show_submissions, "GetSubmissions", new { id = Model.Id }, new AjaxOptions { HttpMethod = "Get", InsertionMode = InsertionMode.Replace, UpdateTargetId = "grid" }, new { @class = "btn btn-primary" }) @Ajax.ActionLink(Resource.Show_resources, "GetResources", new { id = Model.Id }, new AjaxOptions { HttpMethod = "Get", InsertionMode = InsertionMode.Replace, UpdateTargetId = "grid" }, new { @class = "btn btn-primary" })


@Resource.Tests @Resource.Edit @Resource.Back
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Problems/Edit.cshtml ================================================ @using Resource = Resources.Areas.Administration.Problems.Views.ProblemsEdit; @model OJS.Web.Areas.Administration.ViewModels.Problem.DetailedProblemViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title @Resource.For @Model.ContestName

@using (Html.BeginForm("Edit", "Problems", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.AntiForgeryToken() @Html.HiddenFor(m => m.ContestName) @Html.HiddenFor(m => m.ContestId)
@Resource.General_info
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.Name)

@Html.LabelFor(m => m.MaximumPoints)
@(Html.Kendo() .NumericTextBoxFor(m => m.MaximumPoints) .Min(1) .Format("#") .Step(1) .Spinners(false) .HtmlAttributes(new { @class = "pull-left full-editor" })) @Html.ValidationMessageFor(m => m.MaximumPoints)
@Html.ValidationMessageFor(m => m.MaximumPoints)

@Html.LabelFor(m => m.TimeLimit) (в ms)
@(Html.Kendo() .NumericTextBoxFor(m => m.TimeLimit) .Min(1) .Format("#") .Step(1) .Spinners(false) .HtmlAttributes(new { @class = "pull-left full-editor" }))
@Html.ValidationMessageFor(m => m.TimeLimit)

@Html.LabelFor(m => m.MemoryLimit) (в B)
@(Html.Kendo() .NumericTextBoxFor(m => m.MemoryLimit) .Format("#") .Min(1) .Step(1) .Spinners(false) .HtmlAttributes(new { @class = "pull-left full-editor" }))
@Html.ValidationMessageFor(m => m.MemoryLimit)

@Html.LabelFor(m => m.SourceCodeSizeLimit) (в B)
Да @(Html.Kendo() .NumericTextBoxFor(m => m.SourceCodeSizeLimit) .Format("#") .Min(1) .Step(1) .Enable(false) .Spinners(false) .HtmlAttributes(new { @class = "pull-right full-editor", style = "width: 75%" }))
@Html.ValidationMessageFor(m => m.SourceCodeSizeLimit)
@Resource.Settings
@Html.LabelFor(m => m.Checker)
@(Html.Kendo() .DropDownListFor(m => m.Checker) .BindTo(Model.AvailableCheckers) .HtmlAttributes(new { @class = "pull-left full-kendo-editor" }))
@Html.ValidationMessageFor(m => m.Checker)

@Html.LabelFor(m => m.OrderBy)
@(Html.Kendo() .NumericTextBoxFor(m => m.OrderBy) .Format("#") .Min(0) .Step(1) .Spinners(false) .HtmlAttributes(new { @class = "pull-left full-editor" }))
@Html.ValidationMessageFor(m => m.OrderBy)

@Html.LabelFor(m => m.ShowResults)
@Html.EditorFor(m => m.ShowResults)
@Html.ValidationMessageFor(m => m.ShowResults)

@Html.LabelFor(m => m.ShowDetailedFeedback)
@Html.EditorFor(m => m.ShowDetailedFeedback)
@Html.ValidationMessageFor(m => m.ShowDetailedFeedback)

}
@(Html.Kendo().Tooltip().For("#create-form").Filter("[data-tooltip='true']").Position(TooltipPosition.Bottom).Width(240)) @section scripts { @Scripts.Render("~/bundles/jqueryval") } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Problems/Index.cshtml ================================================ @using Resource = Resources.Areas.Administration.Problems.Views.ProblemsIndex; @using OJS.Web.Areas.Administration.ViewModels.Problem @model ProblemViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@if (ViewBag.ContestId != null) { } @if (ViewBag.ProblemId != null) { }
@(@Html.Kendo().AutoComplete() .Name("search") .Placeholder(Resource.Enter_contest) .HtmlAttributes(new { @class = "test-file-dropdown" }) .DataTextField("Name") .Filter("contains") .MinLength(3) .DataSource(source => { source .Read(read => { read.Action("GetSearchedContests", "Problems") .Data("onAdditionalData"); }); } ) .Events(e => { e.Select("onSearchSelect"); }))
@(Html.Kendo().DropDownList() .Name("categories") .OptionLabel(Resource.Choose_category) .HtmlAttributes(new { @class = "test-file-dropdown" }) .DataTextField("Name") .DataValueField("Id") .DataSource(source => { source.Read(read => { read.Action("GetCascadeCategories", "Problems"); }); }))
@(Html.Kendo().DropDownList() .Name("contests") .OptionLabel(Resource.Choose_contest) .HtmlAttributes(new { @class = "test-file-dropdown" }) .DataTextField("Name") .DataValueField("Id") .DataSource(source => { source.Read(read => { read.Action("GetCascadeContests", "Problems") .Data("filterContests"); }) .ServerFiltering(true); }) .Enable(false) .AutoBind(false) .CascadeFrom("categories") .Events(e => e.Change("onContestSelect")) )
@Resource.Qucik_access_contest
@(Html.Kendo() .TabStrip() .Name("latest-courses") .Items(tabstrip => { tabstrip.Add() .Text(Resource.Future) .Selected(true) .LoadContentFrom("GetFutureContests", "Contests"); tabstrip.Add() .Text(Resource.Active) .LoadContentFrom("GetActiveContests", "Contests"); tabstrip.Add() .Text(Resource.Latest) .LoadContentFrom("GetLatestContests", "Contests"); }) .Events(ev => ev.ContentLoad("hideTheadFromGrid")) .HtmlAttributes(new { @class = "col-md-12" }))

@Resource.Problems_loading
@section scripts{ } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Problems/_ResourcesGrid.cshtml ================================================ @using Resource = Resources.Areas.Administration.Problems.Views.Partials.ProblemsPartials; @model int @(Html.Kendo().Grid() .Name("submissions-grid") .Columns(columns => { columns.Bound(model => model.Id); columns.Bound(model => model.Name); columns.Bound(model => model.Type).ClientTemplate("#= TypeName #"); columns.Bound(model => model.OrderBy); columns.Bound(model => model.Link).ClientTemplate(string.Format("# if(Type == 3) {{ # {0} # }} else {{ # {1} # }} #", Resource.Video, Resource.Download)); }) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Sort(sort => sort.Add(x => x.Id)) .Read(read => read.Action("ReadResources", "Problems", new { id = Model })) )) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Problems/_SubmissionsGrid.cshtml ================================================ @using Resource = Resources.Areas.Administration.Problems.Views.Partials.ProblemsPartials; @model int @{ const string ControllerName = "Submissions"; } @(Html.Kendo().Grid() .Name("submissions-grid") .Columns(columns => { columns.Bound(model => model.ParticipantName); columns.Bound(model => model.ProblemName); columns.Bound(model => model.SubmissionTypeName); columns.Bound(model => model.Status); columns.Bound(model => model.Points); columns.Bound(model => model.CreatedOn).Hidden(); columns.Bound(model => model.ModifiedOn).Hidden(); columns.Template(@).ClientTemplate(string.Format("{1}", Url.Action("Update", ControllerName), Resource.Edit)); columns.Template(@).ClientTemplate(string.Format("{1}", Url.Action("Delete", ControllerName), Resource.Delete)); columns.Template(@).ClientTemplate(string.Format("{1}", Url.Action("Retest", ControllerName), Resource.Retest)); }) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Sort(sort => sort.Add(x => x.CreatedOn).Descending()) .Read(read => read.Action("ReadSubmissions", "Problems", new { id = Model })) )) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Resources/Create.cshtml ================================================ @using Resource = Resources.Areas.Administration.Resources.Views.ResourcesCreate; @model OJS.Web.Areas.Administration.ViewModels.ProblemResource.ProblemResourceViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title @Resource.For @Model.ProblemName

@using (Html.BeginForm("Create", "Resources", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.AntiForgeryToken() @Html.HiddenFor(m => m.ProblemId) @Html.HiddenFor(m => m.ProblemName)
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.Name)

@Html.LabelFor(m => m.Type)
@(Html.Kendo() .DropDownListFor(m => m.Type) .BindTo(Model.AllTypes) .Events(ev => ev.Change("onEditResourceTypeSelect")) .HtmlAttributes(new { @class = "pull-left full-kendo-editor" }))
@Html.ValidationMessageFor(m => m.Type)

@Html.LabelFor(m => m.OrderBy)
@(Html.Kendo() .NumericTextBoxFor(m => m.OrderBy) .Format("#") .Min(0) .Step(1) .Spinners(false) .HtmlAttributes(new { @class = "pull-left full-editor" }))
@Html.ValidationMessageFor(m => m.OrderBy)

@Resource.File
@Resource.Choose_file
@Html.ValidationMessage("File")

@Resource.Back
}
@(Html.Kendo().Tooltip().For("#create-form").Filter("[data-tooltip='true']").Position(TooltipPosition.Bottom).Width(240)) @section scripts { } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Resources/Edit.cshtml ================================================ @using Resource = Resources.Areas.Administration.Resources.Views.ResourcesEdit; @model OJS.Web.Areas.Administration.ViewModels.ProblemResource.ProblemResourceViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title @Resource.For @Model.Name

@using (Html.BeginForm("Edit", "Resources", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.AntiForgeryToken() @Html.HiddenFor(m => m.ProblemId) @Html.HiddenFor(m => m.ProblemName)
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name, new { @class = "form-control pull-left full-editor" })
@Html.ValidationMessageFor(m => m.Name)

@Html.LabelFor(m => m.Type)
@(Html.Kendo() .DropDownListFor(m => m.Type) .BindTo(Model.AllTypes) .SelectedIndex(Model.DropDownTypeIndex) .Events(ev => ev.Change("onEditResourceTypeSelect")) .HtmlAttributes(new { @class = "pull-left full-kendo-editor" }))
@Html.ValidationMessageFor(m => m.Type)

@Html.LabelFor(m => m.OrderBy)
@(Html.Kendo() .NumericTextBoxFor(m => m.OrderBy) .Format("#") .Min(0) .Step(1) .Spinners(false) .HtmlAttributes(new { @class = "pull-left full-editor" }))
@Html.ValidationMessageFor(m => m.OrderBy)

@Resource.File
@Resource.Choose_file
@Html.ValidationMessage("File")

@Resource.Back
}
@(Html.Kendo().Tooltip().For("#create-form").Filter("[data-tooltip='true']").Position(TooltipPosition.Bottom).Width(240)) @section scripts { } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Roles/EditorTemplates/AddUserToRole.cshtml ================================================ @model OJS.Web.Areas.Administration.ViewModels.Roles.UserInRoleAdministrationViewModel @using Resource = Resources.Areas.Administration.Roles.Views.RolesIndex; @(Html.Kendo() .ComboBoxFor(m => m.UserName) .Name("UserId") .DataTextField("Text") .DataValueField("Value") .Filter(FilterType.Contains) .MinLength(1) .Placeholder(Resource.Choose_user) .DataSource(data => { data.ServerFiltering(true) .Read(read => { read.Action("AvailableUsersForRole", "Roles") .Data(@ function () { return { text: $('\\#UserId').data("kendoComboBox").input.val() };} ); }); }) .HtmlAttributes(new { style = "width: 100%;" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Roles/Index.cshtml ================================================ @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @using Resource = Resources.Areas.Administration.Roles.Views.RolesIndex; @{ ViewBag.Title = Resource.Page_title; const string ControllerName = "Roles"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(col => col.Name); columns.Command(command => command.Edit().Text(" ").UpdateText(GeneralResource.Change).CancelText(GeneralResource.Cancel)).Width(80); columns.Command(command => command.Destroy().Text(" ")).Width(80); }) .ToolBar(toolbar => { toolbar.Create().Text(GeneralResource.Create); toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); editable.DisplayDeleteConfirmation(GeneralResource.Delete_prompt); }) .ClientDetailTemplateId("users-in-role") .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(m => m.RoleId); }) .Sort(sort => sort.Add(x => x.Name).Descending()) .Create(create => create.Action("Create", ControllerName)) .Read(read => read.Action("Read", ControllerName)) .Update(update => update.Action("Update", ControllerName)) .Destroy(destroy => destroy.Action("Destroy", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Settings/Index.cshtml ================================================ @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @using Resource = Resources.Areas.Administration.Settings.Views.SettingsAdministrationIndex; @{ ViewBag.Title = Resource.Page_title; const string ControllerName = "Settings"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(col => col.Name); columns.Bound(col => col.Value); columns.Command(command => command.Edit().Text(" ").UpdateText(GeneralResource.Change).CancelText(GeneralResource.Cancel)).Width(80); columns.Command(command => command.Destroy().Text(" ")).Width(80); }) .ToolBar(toolbar => { toolbar.Create().Text(GeneralResource.Create); toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); editable.DisplayDeleteConfirmation(GeneralResource.Delete_prompt); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound").Edit("onEdit")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(m => m.Name); }) .Sort(sort => sort.Add(x => x.Name).Descending()) .Create(create => create.Action("Create", ControllerName)) .Read(read => read.Action("Read", ControllerName)) .Update(update => update.Action("Update", ControllerName)) .Destroy(destroy => destroy.Action("Destroy", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/Date.cshtml ================================================ @model DateTime? @Html.Kendo().DatePickerFor(m => m).HtmlAttributes(new { style = "width: 100%; height: 30px;" }) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/DateAndTime.cshtml ================================================ @model DateTime? @Html.Kendo().DateTimePickerFor(m => m).HtmlAttributes(new { style = "width: 100%; height: 30px;" }) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/DisabledCheckbox.cshtml ================================================ @model bool @Html.CheckBoxFor(m => m, new { disabled = "disabled" }) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/DropDownList.cshtml ================================================ @model int @(Html.Kendo() .DropDownListFor(m => m) .BindTo((IEnumerable)ViewData[ViewData.TemplateInfo.GetFullHtmlFieldName("") + "Data"]) .OptionLabel("Изберете категория") .HtmlAttributes(new { style = "width: 100%;" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/Enum.cshtml ================================================ @model Enum @Html.EnumDropDownListFor(m => m, new { @class = "form-control" }) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/HtmlContent.cshtml ================================================ @model string @Html.Kendo().EditorFor(m => m) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/Integer.cshtml ================================================ @model int? @(Html.Kendo() .NumericTextBoxFor(m => m) .Spinners(true) .Min(int.MinValue) .Max(int.MaxValue) .Step(1) .Format("#") .HtmlAttributes(new { style = "width: 100%; height: 30px;" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/MultiLineText.cshtml ================================================ @model string @Html.TextAreaFor(m => m, new { @class = "form-control", rows = 10 }) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/NonEditable.cshtml ================================================ @model object @Html.TextBoxFor(m => m, new { disabled = "disabled", @class = "form-control" }) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/PositiveInteger.cshtml ================================================ @model int? @(Html.Kendo() .NumericTextBoxFor(m => m) .Spinners(true) .Min(0) .Max(int.MaxValue) .Step(1) .Format("#") .HtmlAttributes(new { style = "width: 100%; height: 30px;" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/EditorTemplates/SingleLineText.cshtml ================================================ @model string @Html.TextBoxFor(m => m, new { @class = "form-control" }) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/_AdministrationLayout.cshtml ================================================ @{ Layout = "~/Views/Shared/_Layout.cshtml"; } @section styles { @RenderSection("styles", required: false) } @RenderBody() @section scripts { @RenderSection("scripts", required: false) } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/_CopyQuestionsFromContest.cshtml ================================================ @using Resource = Resources.Areas.Administration.Shared.Views.Partials.Partials; @model IEnumerable
@(Html.Kendo().ComboBox() .Name("ContestFrom") .DataTextField("Text") .DataValueField("Value") .Placeholder(Resource.Choose_contest) .HtmlAttributes(new { style = "width: 100%;", id = "CopyContests_" + ViewBag.ContestId }) .BindTo(Model))

================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/_ProblemResourceForm.cshtml ================================================ @using Resource = Resources.Areas.Administration.Shared.Views.Partials.Partials; @model OJS.Web.Areas.Administration.ViewModels.ProblemResource.ProblemResourceViewModel

@Html.TextBox("Resources[" + Model.Id + "].Name", null, new { id = "Resources_" + Model.Id + "__Name", @class = "form-control full-editor required-resource-field" }) @Html.ValidationMessage("Resources[" + Model.Id + "].Name")
@(Html.Kendo() .DropDownList() .Name("Resources[" + Model.Id + "].Type") .BindTo(Model.AllTypes) .Events(ev => ev.Change("onResourceTypeSelect")) .HtmlAttributes(new { id = "Resources_" + Model.Id + "__Type", @class = "full-kendo-editor", modelid = Model.Id }))
@Resource.File
@Resource.Choose_resource
@Html.ValidationMessage("Resources[" + Model.Id + "].File", new { @class = "pull-right" })
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Shared/_QuickContestsGrid.cshtml ================================================ @using OJS.Web.Areas.Administration.ViewModels.Contest @using Resource = Resources.Areas.Administration.Shared.Views.Partials.Partials; @model IEnumerable @(Html.Kendo() .Grid(Model) .Name("future-grid") .Columns(col => { col.Bound(m => m.Name); col.Bound(m => m.CategoryName); col.Template(@
@Resource.Details
); } )) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/SubmissionTypes/Index.cshtml ================================================ @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @using Resource = Resources.Areas.Administration.SubmissionTypes.Views.SubmissionTypesIndex; @{ ViewBag.Title = Resource.Page_title; const string ControllerName = "SubmissionTypes"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(col => col.Id); columns.Bound(col => col.Name); columns.Bound(col => col.IsSelectedByDefault).Hidden(); columns.Bound(col => col.ExecutionStrategyType); columns.Bound(col => col.CompilerType); columns.Bound(col => col.AdditionalCompilerArguments).Hidden(); columns.Bound(col => col.Description).Hidden(); columns.Bound(col => col.AllowBinaryFilesUpload).Hidden(); columns.Bound(col => col.AllowedFileExtensions).Hidden(); columns.Command(command => command.Edit().Text(" ").UpdateText(GeneralResource.Change).CancelText(GeneralResource.Cancel)).Width(80); columns.Command(command => command.Destroy().Text(" ")).Width(80); }) .ToolBar(toolbar => { toolbar.Create().Text(GeneralResource.Create); toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); editable.DisplayDeleteConfirmation(GeneralResource.Delete_prompt); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(m => m.Id); }) .Sort(sort => sort.Add(x => x.Id).Descending()) .Create(create => create.Action("Create", ControllerName)) .Read(read => read.Action("Read", ControllerName)) .Update(update => update.Action("Update", ControllerName)) .Destroy(destroy => destroy.Action("Destroy", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Submissions/Create.cshtml ================================================ @using Resources = Resources.Areas.Administration.Submissions.Views.SubmissionsCreate; @model OJS.Web.Areas.Administration.ViewModels.Submission.SubmissionAdministrationViewModel @{ ViewBag.Title = Resources.Page_title; }

@ViewBag.Title

@Html.Partial("_SubmissionForm", Model) @section scripts{ @Scripts.Render("~/bundles/jqueryval") } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Submissions/Delete.cshtml ================================================ @using Resource = Resources.Areas.Administration.Submissions.Views.SubmissionsDelete; @model OJS.Web.Areas.Administration.ViewModels.Submission.SubmissionAdministrationGridViewModel @{ ViewBag.Title = string.Format("{0} {1}", Resource.Page_title, Model.ParticipantName); }

@ViewBag.Title

@Html.LabelFor(m => m.ProblemName)
@Model.ProblemName

@Html.LabelFor(m => m.ParticipantName)
@Model.ParticipantName

@Html.LabelFor(m => m.SubmissionTypeName)
@Model.SubmissionTypeName

@Html.LabelFor(m => m.Points)
@Model.Points

@Html.LabelFor(m => m.Status)
@Model.Status

@Html.ActionLink(Resource.Delete, "ConfirmDelete", new { id = Model.Id }, new { @class = "btn btn-primary" })
@Html.ActionLink(Resource.Back, GlobalConstants.Index, null, new { @class = "btn btn-primary" })
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Submissions/EditorTemplates/ParticipantDropDownList.cshtml ================================================ @using Resource = Resources.Areas.Administration.Submissions.Views.EditorTemplates.SubmissionsEditorTemplates; @model int? @(Html.Kendo() .ComboBoxFor(m => m) .Name("ParticipantId") .DataTextField("Text") .DataValueField("Value") .Filter(FilterType.Contains) .MinLength(1) .Placeholder(Resource.Choose_participant) .CascadeFrom("ProblemId") .Enable(false) .Events(ev=> ev.Cascade(@ function () { var element = $('#ParticipantId'); var comboBox = element.data('kendoComboBox'); var value = element.attr('value'); if (value != null) { comboBox.dataSource.fetch(function () { comboBox.dataSource.read(); comboBox.select(function (dataItem) { return dataItem.Value === value; }); }); } })) .DataSource(data => { data.ServerFiltering(true) .Read(read => { read.Action("GetParticipants", "Submissions") .Data(@ function () { return { text: $('#ParticipantId').data("kendoComboBox").input.val(), problem: $('#ProblemId').val() };} ); }); }) .HtmlAttributes(new { style = "width: 100%;" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Submissions/EditorTemplates/ProblemComboBox.cshtml ================================================ @using Resource = Resources.Areas.Administration.Submissions.Views.EditorTemplates.SubmissionsEditorTemplates; @model int? @(Html.Kendo() .ComboBoxFor(m => m) .Name("ProblemId") .DataTextField("Text") .DataValueField("Value") .Filter(FilterType.Contains) .MinLength(1) .Placeholder(Resource.Choose_problem) .DataSource(data => { data.ServerFiltering(true) .Read(read => { read.Action("GetProblems", "Submissions"); }); }) .HtmlAttributes(new { style = "width: 100%;" })) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Submissions/EditorTemplates/SubmissionAdministrationViewModel.cshtml ================================================ @using Resource = Resources.Areas.Administration.Submissions.Views.EditorTemplates.SubmissionsEditorTemplates; @model OJS.Web.Areas.Administration.ViewModels.Submission.SubmissionAdministrationViewModel @Html.HiddenFor(model => model.Id) @Html.HiddenFor(model => model.Id) @Html.HiddenFor(model => model.AllowBinaryFilesUpload)
@Html.LabelFor(model => model.ProblemId, new { @class = "control-label col-md-12" })
@Html.EditorFor(model => model.ProblemId) @Html.ValidationMessageFor(model => model.ProblemId)
@Html.LabelFor(model => model.ParticipantId, new { @class = "control-label col-md-12" })
@Html.EditorFor(model => model.ParticipantId) @Html.ValidationMessageFor(model => model.ParticipantId)
@Html.LabelFor(model => model.SubmissionTypeId, new { @class = "control-label col-md-12" })
@Html.EditorFor(model => model.SubmissionTypeId, new { Model.AllowBinaryFilesUpload }) @Html.ValidationMessageFor(model => model.SubmissionTypeId)
@if (Model.Content != null) { @Html.LabelFor(model => model.FileSubmission, new { @class = "control-label col-md-12" })
@Html.ActionLink("Свали решението", "GetSubmissionFile", "Submissions", new { area = "Administration", submissionId = Model.Id }, null)
} @Html.Label("Качи ново решение", new { @class = "control-label col-md-12" })
@(Html.Kendo().Upload() .Name("FileSubmission") .Multiple(false) .ShowFileList(true) .Messages(message => message.Select(Resource.Choose_file)) .HtmlAttributes(new { id = "FileSubmission" })) @Html.ValidationMessageFor(model => model.Content)
@Html.Label("Разрешени файлови формати: ", new { @class = "control-label col-md-12" })
@Html.LabelFor(model => model.ContentAsString, new { @class = "control-label col-md-12" })
@Html.EditorFor(model => model.ContentAsString) @Html.ValidationMessageFor(model => model.Content)
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Submissions/EditorTemplates/SubmissionTypesDropDownList.cshtml ================================================ @using Resource = Resources.Areas.Administration.Submissions.Views.EditorTemplates.SubmissionsEditorTemplates; @model int? @{ bool? allowBinaryFilesUpload = null; if (ViewData["AllowBinaryFilesUpload"] != null) { allowBinaryFilesUpload = Convert.ToBoolean(ViewData["AllowBinaryFilesUpload"]); } } @(Html.Kendo() .DropDownListFor(m => m) .OptionLabel(Resource.Choose_submission_type) .DataTextField("Text") .DataValueField("Value") .CascadeFrom("ProblemId") .Events(ev=> ev.DataBound("onSubmissionDataBound").Change("onSubmissionTypeChange")) .DataSource(data => { data.ServerFiltering(true) .Read(read => { read.Action("GetSubmissionTypes", "Submissions", new { allowBinaryFilesUpload }) .Data(@ function () { return { problemId: $('#ProblemId').val() };} ); }); }) .HtmlAttributes(new { style = "width: 100%;" }) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Submissions/Index.cshtml ================================================ @using Resource = Resources.Areas.Administration.Submissions.Views.SubmissionsIndex; @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@(Html .Kendo() .ComboBox() .Name("contests") .DataTextField("Name") .DataValueField("Id") .Filter(FilterType.Contains) .AutoBind(false) .MinLength(3) .Placeholder(Resource.Choose_or_enter_contest) .Events(ev => ev.Change("selectContest")) .DataSource(dataSource => { dataSource .Read(read => { read.Action("Contests", "Submissions") .Data("additionalComboBoxData"); }) .ServerFiltering(true); }) .HtmlAttributes(new { style = "width: 100%;" }))
@Ajax.ActionLink(Resource.Clear, "RenderGrid", null, new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "submissions-grid" }, new { @class = "btn btn-primary btn-sm" })

@Html.Partial("_SubmissionsGrid")
@section scripts{ } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Submissions/Update.cshtml ================================================ @using Resource = Resources.Areas.Administration.Submissions.Views.SubmissionsUpdate; @model OJS.Web.Areas.Administration.ViewModels.Submission.SubmissionAdministrationViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@Html.Partial("_SubmissionForm", Model) @section scripts{ @Scripts.Render("~/bundles/jqueryval") } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Submissions/_SubmissionForm.cshtml ================================================ @using Resource = Resources.Areas.Administration.Submissions.Views.Partials.SubmissionForm; @model OJS.Web.Areas.Administration.ViewModels.Submission.SubmissionAdministrationViewModel @using (Html.BeginForm((string)ViewBag.SubmissionAction, "Submissions", FormMethod.Post, new { id = "SubmissionForm" })) { @Html.AntiForgeryToken()
@Html.EditorForModel()
} ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Submissions/_SubmissionsGrid.cshtml ================================================ @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @using Resource = Resources.Areas.Administration.Submissions.Views.Partials.SubmissionsGrid; @model int? @{ const string ControllerName = "Submissions"; } @(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(model => model.Id); columns.Bound(model => model.ParticipantName); columns.Bound(model => model.ProblemName).ClientTemplate("#= ProblemName #"); columns.Bound(model => model.SubmissionTypeName); columns.Bound(model => model.Status); columns.Bound(model => model.Points); columns.Bound(model => model.CreatedOn).Hidden(); columns.Bound(model => model.ModifiedOn).Hidden(); columns.Template(@).ClientTemplate(string.Format("{1}", Url.Action("Update", ControllerName), GeneralResource.Change)).Title(GeneralResource.Change); columns.Template(@).ClientTemplate(string.Format("{1}", Url.Action("Delete", ControllerName), GeneralResource.Delete)).Title(GeneralResource.Delete); columns.Template(@).ClientTemplate(string.Format("{1}", Url.Action("View", "Submissions", new { Area = "Contests" }), Resource.Details)).Title(Resource.Details); columns.Template(@).ClientTemplate(string.Format("{1}", Url.Action("Retest", ControllerName), Resource.Retest)).Title(Resource.Retest); }) .ToolBar(toolbar => { toolbar.Custom().Text(GeneralResource.Create).Action("Create", ControllerName); toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.DisplayDeleteConfirmation(GeneralResource.Delete_prompt); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(m => m.Id); }) .Sort(sort => sort.Add(x => x.CreatedOn).Descending()) .Read(read => read.Action("ReadSubmissions", ControllerName, new { id = Model })) .Destroy(destroy => destroy.Action("Destroy", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Tests/Create.cshtml ================================================ @using Resource = Resources.Areas.Administration.Tests.Views.TestsCreate; @model OJS.Web.Areas.Administration.ViewModels.Test.TestViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@Model.ProblemName

@using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.HiddenFor(m => m.ProblemId) @Html.HiddenFor(m => m.ProblemName)
@Html.LabelFor(m => m.InputFull)
@Html.TextAreaFor(m => m.InputFull, new { rows = 10, @class = "col-md-12 form-control" }) @Html.ValidationMessageFor(m => m.InputFull)

@Html.LabelFor(m => m.OutputFull)
@Html.TextAreaFor(m => m.OutputFull, new { rows = 10, @class = "col-md-12 form-control" }) @Html.ValidationMessageFor(m => m.OutputFull)

@Html.CheckBoxFor(m => m.IsTrialTest) @Html.LabelFor(m => m.IsTrialTest)
@Html.LabelFor(m => m.OrderBy)
@(Html.Kendo() .NumericTextBoxFor(m => m.OrderBy) .Format("#") .Step(1) .Spinners(false)) @Html.ValidationMessageFor(m => m.OrderBy)

@Resource.Back
}
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Tests/Delete.cshtml ================================================ @using Resource = Resources.Areas.Administration.Tests.Views.TestsDelete; @model OJS.Web.Areas.Administration.ViewModels.Test.TestViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@Html.LabelFor(m => m.Input)
@(Model.InputFull.Length > 200 ? Model.InputFull.Substring(0,200) + "..." : Model.InputFull)

@Html.LabelFor(m => m.Output)
@(Model.OutputFull.Length > 200 ? Model.OutputFull.Substring(0, 200) + "..." : Model.OutputFull)

@Model.TrialTestName @Resource.Test

@Resource.Delete @Resource.Back
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Tests/DeleteAll.cshtml ================================================ @using Resource = Resources.Areas.Administration.Tests.Views.TestsDeleteAll; @model OJS.Web.Areas.Administration.ViewModels.Problem.ProblemViewModel @{ ViewBag.Title = Resource.Page_title; }

@Model.Name

@ViewBag.Title

@Resource.Delete_confirmation @Model.Name?

@Resource.Confirm @Resource.Back ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Tests/Details.cshtml ================================================ @using Resource = Resources.Areas.Administration.Tests.Views.TestsDetails; @model OJS.Web.Areas.Administration.ViewModels.Test.TestViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@Html.LabelFor(m => m.ProblemName)
@Model.ProblemName

@Html.LabelFor(m => m.Input)
@(Model.InputFull.Length > 200 ? Model.InputFull.Substring(0, 200) + "..." : Model.InputFull)
@if (Model.InputFull.Length > 200) { @Ajax.ActionLink(Resource.See_more, "FullInput", new { id = @Model.Id }, new AjaxOptions { HttpMethod = "Get", UpdateTargetId = "test-input", InsertionMode = InsertionMode.Replace, OnComplete = "removeInputAjaxLink" }, new { id = "ajax-input-link" }) }

@Html.LabelFor(m => m.Output)
@(Model.OutputFull.Length > 200 ? Model.OutputFull.Substring(0, 200) + "..." : Model.OutputFull)
@if (Model.OutputFull.Length > 200) { @Ajax.ActionLink(Resource.See_more, "FullOutput", new { id = @Model.Id }, new AjaxOptions { HttpMethod = "Get", UpdateTargetId = "test-output", InsertionMode = InsertionMode.Replace, OnComplete = "removeOutputAjaxLink" }, new { id = "ajax-output-link" }) }

@Html.LabelFor(m => m.IsTrialTest)
@Model.IsTrialTest

@Html.LabelFor(m => m.OrderBy)
@Model.OrderBy

@Ajax.ActionLink(Resource.Show_executions, "GetTestRuns", new { id = Model.Id }, new AjaxOptions { HttpMethod = "Get", OnComplete = "initilizeTestRuns" }, new { id = "test-runs-button", @class = "btn btn-primary" })

@Resource.Edit @Resource.Back
@section scripts { } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Tests/Edit.cshtml ================================================ @using Resource = Resources.Areas.Administration.Tests.Views.TestsEdit; @model OJS.Web.Areas.Administration.ViewModels.Test.TestViewModel @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@Model.ProblemName

@using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.HiddenFor(m => m.ProblemId) @Html.HiddenFor(m => m.ProblemName)
@Html.LabelFor(m => m.InputFull)
@Html.TextAreaFor(m => m.InputFull, new { rows = 10, @class = "col-md-12 form-control" }) @Html.ValidationMessageFor(m => m.InputFull)

@Html.LabelFor(m => m.OutputFull)
@Html.TextAreaFor(m => m.OutputFull, new { rows = 10, @class = "col-md-12 form-control" }) @Html.ValidationMessageFor(m => m.OutputFull)

@Html.CheckBoxFor(m => m.IsTrialTest) @Html.LabelFor(m => m.IsTrialTest)
@Html.LabelFor(m => m.OrderBy)
@(Html.Kendo() .NumericTextBoxFor(m => m.OrderBy) .Format("#") .Step(1) .Spinners(false)) @Html.ValidationMessageFor(m => m.OrderBy)

@Resource.Back
}
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Tests/Index.cshtml ================================================ @using Resource = Resources.Areas.Administration.Tests.Views.TestsIndex; @{ ViewBag.Title = Resource.Page_title; }

@ViewBag.Title

@(@Html.Kendo().AutoComplete() .Name("search") .Placeholder(Resource.Enter_problem) .HtmlAttributes(new { @class = "test-file-dropdown" }) .DataTextField("Name") .MinLength(3) .DataSource(source => { source .Read(read => { read.Action("GetSearchedProblems", "Tests") .Data("onAdditionalData"); }) .ServerFiltering(true); } ) .Events(e => { e.Select("onSearchSelect"); }))
@(Html.Kendo().DropDownList() .Name("categories") .OptionLabel(Resource.Choose_category) .HtmlAttributes(new { @class = "test-file-dropdown" }) .DataTextField("Name") .DataValueField("Id") .DataSource(source => { source.Read(read => { read.Action("GetCascadeCategories", "Tests"); }); }))
@(Html.Kendo().DropDownList() .Name("contests") .OptionLabel(Resource.Choose_contest) .HtmlAttributes(new { @class = "test-file-dropdown" }) .DataTextField("Name") .DataValueField("Id") .DataSource(source => { source.Read(read => { read.Action("GetCascadeContests", "Tests") .Data("filterContests"); }) .ServerFiltering(true); }) .Enable(false) .AutoBind(false) .CascadeFrom("categories") )
@(Html.Kendo().DropDownList() .Name("problems") .OptionLabel(Resource.Choose_problem) .HtmlAttributes(new { @class = "test-file-dropdown" }) .DataTextField("Name") .DataValueField("Id") .DataSource(source => { source.Read(read => { read.Action("GetCascadeProblems", "Tests") .Data("filterProblems"); }) .ServerFiltering(true); }) .Enable(false) .AutoBind(false) .CascadeFrom("contests") .Events(e => e.Change("onProblemSelect")) )
@using (Html.BeginForm("Import", "Tests", null, FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.AntiForgeryToken()
@if (ViewBag.ProblemId != null) { } else { }
@Html.CheckBox("retestTask", false) @Html.Label(Resource.Retest_problem, new { @for = "retestTask", style = "display: inline-block; " })
@Html.CheckBox("deleteOldFiles", true) @Html.Label(Resource.Delete_old_tests, new { @for = "deleteOldFiles", style = "display: inline-block; " })

@Html.Kendo().Upload().Name("file").Multiple(false).HtmlAttributes(new { @class = "kendo-upload" })

}

@Resource.Tests_loading
@section scripts{ } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Users/Index.cshtml ================================================ @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @using Resource = Resources.Areas.Administration.Users.Views.UsersIndex; @{ ViewBag.Title = Resource.Page_title; const string ControllerName = "Users"; }

@ViewBag.Title

@(Html.Kendo().Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(model => model.UserName); columns.Bound(model => model.Email); columns.Bound(model => model.IsGhostUser).Hidden(); columns.Bound(model => model.FirstName); columns.Bound(model => model.LastName); columns.Bound(model => model.City); columns.Bound(model => model.EducationalInstitution).Hidden(); columns.Bound(model => model.FacultyNumber).Hidden(); columns.Bound(model => model.DateOfBirth); columns.Bound(model => model.Company).Hidden(); columns.Bound(model => model.JobTitle).Hidden(); columns.Bound(model => model.Age).Filterable(false); columns.Bound(model => model.CreatedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Bound(model => model.ModifiedOn).Format("{0:dd/MM/yyyy HH:mm}").Hidden(); columns.Command(command => command.Edit().Text(" ").UpdateText(GeneralResource.Change).CancelText(GeneralResource.Cancel)).Width(80); }) .ToolBar(toolbar => { toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(m => m.Id); }) .Sort(sort => sort.Add(x => x.UserName)) .Read(read => read.Action("Read", ControllerName)) .Update(update => update.Action("Update", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/Web.config ================================================ 
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Administration/Views/_ViewStart.cshtml ================================================ @{ Layout = "~/Areas/Administration/Views/Shared/_AdministrationLayout.cshtml"; } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Api/ApiAreaRegistration.cs ================================================ namespace OJS.Web.Areas.Api { using System.Web.Mvc; using OJS.Common; public class ApiAreaRegistration : AreaRegistration { public override string AreaName => "Api"; public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Api_default", "Api/{controller}/{action}/{id}", new { action = GlobalConstants.Index, id = UrlParameter.Optional }); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Api/Controllers/ApiController.cs ================================================ namespace OJS.Web.Areas.Api.Controllers { using System.Web.Mvc; public class ApiController : Controller { } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Api/Controllers/ResultsController.cs ================================================ namespace OJS.Web.Areas.Api.Controllers { using System.Globalization; using System.Linq; using System.Web.Mvc; using OJS.Common; using OJS.Data; using OJS.Web.Areas.Api.Models; public class ResultsController : ApiController { private readonly IOjsData data; public ResultsController(IOjsData data) { this.data = data; } // TODO: Extract method from these two methods since 90% of their code is the same public ContentResult GetPointsByAnswer(string apiKey, int? contestId, string answer) { if (string.IsNullOrWhiteSpace(apiKey) || string.IsNullOrWhiteSpace(answer) || !contestId.HasValue) { return this.Content("ERROR: Invalid arguments"); } var user = this.data.Users.GetById(apiKey); if (user == null || user.Roles.All(x => x.Role.Name != GlobalConstants.AdministratorRoleName)) { return this.Content("ERROR: Invalid API key"); } var participants = this.data.Participants.All() .Where( x => x.IsOfficial && x.ContestId == contestId.Value && (x.Answers.Any(a => a.Answer == answer) || this.data.Context.ParticipantAnswers.Any( a => a.Participant.UserId == x.UserId && a.Participant.IsOfficial && a.Answer == answer))); var participant = participants.FirstOrDefault(); if (participant == null) { return this.Content("ERROR: No participants found"); } if (participants.Count() > 1) { return this.Content("ERROR: More than one participants found"); } var points = participant.Contest.Problems.Select( problem => problem.Submissions.Where(z => z.ParticipantId == participant.Id) .OrderByDescending(z => z.Points) .Select(z => z.Points) .FirstOrDefault()).Sum(); return this.Content(points.ToString(CultureInfo.InvariantCulture)); } public ContentResult GetPointsByEmail(string apiKey, int? contestId, string email) { if (string.IsNullOrWhiteSpace(apiKey) || string.IsNullOrWhiteSpace(email) || !contestId.HasValue) { return this.Content("ERROR: Invalid arguments"); } var user = this.data.Users.GetById(apiKey); if (user == null || user.Roles.All(x => x.Role.Name != GlobalConstants.AdministratorRoleName)) { return this.Content("ERROR: Invalid API key"); } var participants = this.data.Participants.All().Where( x => x.IsOfficial && x.ContestId == contestId.Value && x.User.Email == email); var participant = participants.FirstOrDefault(); if (participant == null) { return this.Content("ERROR: No participants found"); } if (participants.Count() > 1) { return this.Content("ERROR: More than one participants found"); } var points = participant.Contest.Problems.Select( problem => problem.Submissions.Where(z => z.ParticipantId == participant.Id) .OrderByDescending(z => z.Points) .Select(z => z.Points) .FirstOrDefault()).Sum(); return this.Content(points.ToString(CultureInfo.InvariantCulture)); } public JsonResult GetAllResultsForContest(string apiKey, int? contestId) { if (string.IsNullOrWhiteSpace(apiKey) || !contestId.HasValue) { return this.Json(new ErrorMessageViewModel("Invalid arguments"), JsonRequestBehavior.AllowGet); } var user = this.data.Users.GetById(apiKey); if (user == null || user.Roles.All(x => x.Role.Name != GlobalConstants.AdministratorRoleName)) { return this.Json(new ErrorMessageViewModel("Invalid API key"), JsonRequestBehavior.AllowGet); } var participants = this.data.Participants.All() .Where(x => x.IsOfficial && x.ContestId == contestId.Value) .Select( participant => new { participant.User.UserName, participant.User.Email, Answer = participant.Answers.Select(answer => answer.Answer).FirstOrDefault(), Points = participant.Contest.Problems.Select( problem => problem.Submissions.Where(z => z.ParticipantId == participant.Id) .OrderByDescending(z => z.Points) .Select(z => z.Points) .FirstOrDefault()).Sum() }) .OrderByDescending(x => x.Points) .ToList(); return this.Json(participants, JsonRequestBehavior.AllowGet); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Api/Models/ErrorMessageViewModel.cs ================================================ namespace OJS.Web.Areas.Api.Models { public class ErrorMessageViewModel { public ErrorMessageViewModel(string errorMessage) { this.ErrorMessage = errorMessage; } public string ErrorMessage { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ContestsAreaRegistration.cs ================================================ namespace OJS.Web.Areas.Contests { using System.Web.Mvc; using OJS.Common; using OJS.Web.Areas.Contests.Controllers; public class ContestsAreaRegistration : AreaRegistration { public override string AreaName => "Contests"; public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Contests_list", "Contests", new { controller = "List", action = GlobalConstants.Index }, new[] { "OJS.Web.Areas.Contests.Controllers" }); context.MapRoute( "Contests_by_submission_type", "Contests/BySubmissionType/{id}/{submissionTypeName}", new { controller = "List", action = "BySubmissionType", id = UrlParameter.Optional, submissionTypeName = UrlParameter.Optional }); context.MapRoute( "Contests_by_category", "Contests/List/ByCategory/{id}/{category}", new { controller = "List", action = "ByCategory", id = UrlParameter.Optional, category = UrlParameter.Optional }); context.MapRoute( "Contests_details", "Contests/{id}/{name}", new { controller = "Contests", action = "Details", id = UrlParameter.Optional, name = UrlParameter.Optional }, new { id = "[0-9]+" }, new[] { "OJS.Web.Areas.Contests.Controllers" }); context.MapRoute( "Contests_results_compete", string.Format("Contests/{0}/Results/{{action}}/{{id}}", CompeteController.CompeteUrl), new { controller = "Results", action = "Simple", official = true, id = UrlParameter.Optional }); context.MapRoute( "Contests_results_practice", string.Format("Contests/{0}/Results/{{action}}/{{id}}", CompeteController.PracticeUrl), new { controller = "Results", action = "Simple", official = false, id = UrlParameter.Optional }); context.MapRoute( "Contests_compete", string.Format("Contests/{0}/{{action}}/{{id}}", CompeteController.CompeteUrl), new { controller = "Compete", action = GlobalConstants.Index, official = true, id = UrlParameter.Optional }); context.MapRoute( "Contests_practice", string.Format("Contests/{0}/{{action}}/{{id}}", CompeteController.PracticeUrl), new { controller = "Compete", action = GlobalConstants.Index, official = false, id = UrlParameter.Optional }); context.MapRoute( "Contests_default", "Contests/{controller}/{action}/{id}", new { id = UrlParameter.Optional }); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Controllers/CompeteController.cs ================================================ namespace OJS.Web.Areas.Contests.Controllers { using System.Data.Entity; using System.Globalization; using System.Linq; using System.Net; using System.Text.RegularExpressions; using System.Web; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using OJS.Common; using OJS.Common.Extensions; using OJS.Common.Models; using OJS.Data; using OJS.Data.Models; using OJS.Web.Areas.Contests.Helpers; using OJS.Web.Areas.Contests.Models; using OJS.Web.Areas.Contests.ViewModels.Contests; using OJS.Web.Areas.Contests.ViewModels.Participants; using OJS.Web.Areas.Contests.ViewModels.Results; using OJS.Web.Areas.Contests.ViewModels.Submissions; using OJS.Web.Common.Extensions; using OJS.Web.Controllers; using Resource = Resources.Areas.Contests; public class CompeteController : BaseController { public const string CompeteUrl = "Compete"; public const string PracticeUrl = "Practice"; public CompeteController(IOjsData data) : base(data) { } public CompeteController(IOjsData data, UserProfile userProfile) : base(data, userProfile) { } /// /// Validates if a contest is correctly found. If the user wants to practice or compete in the contest /// checks if the contest can be practiced or competed. /// /// Contest to validate. /// A flag checking if the contest will be practiced or competed [NonAction] public static void ValidateContest(Contest contest, bool official) { if (contest == null || contest.IsDeleted || !contest.IsVisible) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.ContestsGeneral.Contest_not_found); } if (official && !contest.CanBeCompeted) { throw new HttpException((int)HttpStatusCode.Forbidden, Resource.ContestsGeneral.Contest_cannot_be_competed); } if (!official && !contest.CanBePracticed) { throw new HttpException((int)HttpStatusCode.Forbidden, Resource.ContestsGeneral.Contest_cannot_be_practiced); } } /// /// Validates if the selected submission type from the participant is allowed in the current contest /// /// The id of the submission type selected by the participant /// The contest in which the user participate [NonAction] public static void ValidateSubmissionType(int submissionTypeId, Contest contest) { if (contest.SubmissionTypes.All(submissionType => submissionType.Id != submissionTypeId)) { throw new HttpException((int)HttpStatusCode.BadRequest, Resource.ContestsGeneral.Submission_type_not_found); } } /// /// Displays user compete information: tasks, send source form, ranking, submissions, ranking, etc. /// Users only. /// [Authorize] public ActionResult Index(int id, bool official) { var contest = this.Data.Contests.GetById(id); ValidateContest(contest, official); var participantFound = this.Data.Participants.Any(id, this.UserProfile.Id, official); if (!participantFound) { if (!contest.ShouldShowRegistrationForm(official)) { this.Data.Participants.Add(new Participant(id, this.UserProfile.Id, official)); this.Data.SaveChanges(); } else { // Participant not found, the contest requires password or the contest has questions // to be answered before registration. Redirect to the registration page. // The registration page will take care of all security checks. return this.RedirectToAction("Register", new { id, official }); } } var participant = this.Data.Participants.GetWithContest(id, this.UserProfile.Id, official); var participantViewModel = new ParticipantViewModel(participant, official); this.ViewBag.CompeteType = official ? CompeteUrl : PracticeUrl; return this.View(participantViewModel); } /// /// Displays form for contest registration. /// Users only. /// [HttpGet] [Authorize] public ActionResult Register(int id, bool official) { var participantFound = this.Data.Participants.Any(id, this.UserProfile.Id, official); if (participantFound) { // Participant exists. Redirect to index page. return this.RedirectToAction(GlobalConstants.Index, new { id, official }); } var contest = this.Data.Contests.All().Include(x => x.Questions).FirstOrDefault(x => x.Id == id); ValidateContest(contest, official); if (contest.ShouldShowRegistrationForm(official)) { var contestRegistrationModel = new ContestRegistrationViewModel(contest, official); return this.View(contestRegistrationModel); } var participant = new Participant(id, this.UserProfile.Id, official); this.Data.Participants.Add(participant); this.Data.SaveChanges(); return this.RedirectToAction(GlobalConstants.Index, new { id, official }); } /// /// Accepts form input for contest registration. /// Users only. /// //// TODO: Refactor [HttpPost] [Authorize] public ActionResult Register(bool official, ContestRegistrationModel registrationData) { // check if the user has already registered for participation and redirect him to the correct action var participantFound = this.Data.Participants.Any(registrationData.ContestId, this.UserProfile.Id, official); if (participantFound) { return this.RedirectToAction(GlobalConstants.Index, new { id = registrationData.ContestId, official }); } var contest = this.Data.Contests.GetById(registrationData.ContestId); ValidateContest(contest, official); if (official && contest.HasContestPassword) { if (string.IsNullOrEmpty(registrationData.Password)) { this.ModelState.AddModelError("Password", Resource.Views.CompeteRegister.Empty_Password); } else if (contest.ContestPassword != registrationData.Password) { this.ModelState.AddModelError("Password", Resource.Views.CompeteRegister.Incorrect_password); } } if (!official && contest.HasPracticePassword) { if (string.IsNullOrEmpty(registrationData.Password)) { this.ModelState.AddModelError("Password", Resource.Views.CompeteRegister.Empty_Password); } else if (contest.PracticePassword != registrationData.Password) { this.ModelState.AddModelError("Password", Resource.Views.CompeteRegister.Incorrect_password); } } var questionsToAnswerCount = official ? contest.Questions.Count(x => !x.IsDeleted && x.AskOfficialParticipants) : contest.Questions.Count(x => !x.IsDeleted && x.AskPracticeParticipants); if (questionsToAnswerCount != registrationData.Questions.Count()) { this.ModelState.AddModelError("Questions", Resource.Views.CompeteRegister.Not_all_questions_answered); } var contestQuestions = contest.Questions.Where(x => !x.IsDeleted).ToList(); var participant = new Participant(registrationData.ContestId, this.UserProfile.Id, official); this.Data.Participants.Add(participant); var counter = 0; foreach (var question in registrationData.Questions) { var contestQuestion = contestQuestions.FirstOrDefault(x => x.Id == question.QuestionId); var regularExpression = contestQuestion.RegularExpressionValidation; bool correctlyAnswered = false; if (!string.IsNullOrEmpty(regularExpression)) { correctlyAnswered = Regex.IsMatch(question.Answer, regularExpression); } if (contestQuestion.Type == ContestQuestionType.DropDown) { int contestAnswerId; if (int.TryParse(question.Answer, out contestAnswerId) && contestQuestion.Answers.Where(x => !x.IsDeleted).Any(x => x.Id == contestAnswerId)) { correctlyAnswered = true; } if (!correctlyAnswered) { this.ModelState.AddModelError(string.Format("Questions[{0}].Answer", counter), Resource.ContestsGeneral.Invalid_selection); } } participant.Answers.Add(new ParticipantAnswer { ContestQuestionId = question.QuestionId, Answer = question.Answer }); counter++; } if (!this.ModelState.IsValid) { return this.View(new ContestRegistrationViewModel(contest, registrationData, official)); } this.Data.SaveChanges(); return this.RedirectToAction(GlobalConstants.Index, new { id = registrationData.ContestId, official }); } /// /// Processes a participant's submission for a problem. /// /// Participant submission. /// A check whether the contest is official or practice. /// Returns confirmation if the submission was correctly processed. [HttpPost] [Authorize] public ActionResult Submit(SubmissionModel participantSubmission, bool official) { var problem = this.Data.Problems.All().FirstOrDefault(x => x.Id == participantSubmission.ProblemId); if (problem == null) { throw new HttpException((int)HttpStatusCode.Unauthorized, Resource.ContestsGeneral.Problem_not_found); } var participant = this.Data.Participants.GetWithContest(problem.ContestId, this.UserProfile.Id, official); if (participant == null) { throw new HttpException((int)HttpStatusCode.Unauthorized, Resource.ContestsGeneral.User_is_not_registered_for_exam); } ValidateContest(participant.Contest, official); ValidateSubmissionType(participantSubmission.SubmissionTypeId, participant.Contest); if (this.Data.Submissions.HasSubmissionTimeLimitPassedForParticipant(participant.Id, participant.Contest.LimitBetweenSubmissions)) { throw new HttpException((int)HttpStatusCode.ServiceUnavailable, Resource.ContestsGeneral.Submission_was_sent_too_soon); } if (problem.SourceCodeSizeLimit < participantSubmission.Content.Length) { throw new HttpException((int)HttpStatusCode.BadRequest, Resource.ContestsGeneral.Submission_too_long); } if (!this.ModelState.IsValid) { throw new HttpException((int)HttpStatusCode.BadRequest, Resource.ContestsGeneral.Invalid_request); } this.Data.Submissions.Add(new Submission { ContentAsString = participantSubmission.Content, ProblemId = participantSubmission.ProblemId, SubmissionTypeId = participantSubmission.SubmissionTypeId, ParticipantId = participant.Id, IpAddress = this.Request.UserHostAddress, }); this.Data.SaveChanges(); return this.Json(participantSubmission.ProblemId); } // TODO: Extract common logic between SubmitBinaryFile() and Submit() public ActionResult SubmitBinaryFile(BinarySubmissionModel participantSubmission, bool official, int? returnProblem) { if (participantSubmission?.File == null) { throw new HttpException((int)HttpStatusCode.BadRequest, Resource.ContestsGeneral.Upload_file); } var problem = this.Data.Problems.All().FirstOrDefault(x => x.Id == participantSubmission.ProblemId); if (problem == null) { throw new HttpException((int)HttpStatusCode.Unauthorized, Resource.ContestsGeneral.Problem_not_found); } var participant = this.Data.Participants.GetWithContest(problem.ContestId, this.UserProfile.Id, official); if (participant == null) { throw new HttpException((int)HttpStatusCode.Unauthorized, Resource.ContestsGeneral.User_is_not_registered_for_exam); } ValidateContest(participant.Contest, official); ValidateSubmissionType(participantSubmission.SubmissionTypeId, participant.Contest); if (this.Data.Submissions.HasSubmissionTimeLimitPassedForParticipant(participant.Id, participant.Contest.LimitBetweenSubmissions)) { throw new HttpException((int)HttpStatusCode.ServiceUnavailable, Resource.ContestsGeneral.Submission_was_sent_too_soon); } if (problem.SourceCodeSizeLimit < participantSubmission.File.ContentLength) { throw new HttpException((int)HttpStatusCode.BadRequest, Resource.ContestsGeneral.Submission_too_long); } // Validate submission type existence var submissionType = this.Data.SubmissionTypes.GetById(participantSubmission.SubmissionTypeId); if (submissionType == null) { throw new HttpException((int)HttpStatusCode.BadRequest, Resource.ContestsGeneral.Invalid_request); } // Validate if binary files are allowed if (!submissionType.AllowBinaryFilesUpload) { throw new HttpException((int)HttpStatusCode.BadRequest, Resource.ContestsGeneral.Binary_files_not_allowed); } // Validate file extension if (!submissionType.AllowedFileExtensionsList.Contains( participantSubmission.File.FileName.GetFileExtension())) { throw new HttpException((int)HttpStatusCode.BadRequest, Resource.ContestsGeneral.Invalid_extention); } if (!this.ModelState.IsValid) { throw new HttpException((int)HttpStatusCode.BadRequest, Resource.ContestsGeneral.Invalid_request); } this.Data.Submissions.Add(new Submission { Content = participantSubmission.File.InputStream.ToByteArray(), FileExtension = participantSubmission.File.FileName.GetFileExtension(), ProblemId = participantSubmission.ProblemId, SubmissionTypeId = participantSubmission.SubmissionTypeId, ParticipantId = participant.Id }); this.Data.SaveChanges(); this.TempData.Add(GlobalConstants.InfoMessage, Resource.ContestsGeneral.Solution_uploaded); return this.Redirect(string.Format("/Contests/{2}/Index/{0}#{1}", problem.ContestId, returnProblem ?? 0, official ? CompeteUrl : PracticeUrl)); } /// /// Obtains the partial view for a particular problem. /// /// The problem Id /// A check whether the problem is practiced or competed. /// Returns a partial view with the problem information. [Authorize] public ActionResult Problem(int id, bool official) { this.ViewBag.IsOfficial = official; this.ViewBag.CompeteType = official ? CompeteUrl : PracticeUrl; var problem = this.Data.Problems.GetById(id); if (problem == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.ContestsGeneral.Problem_not_found); } ValidateContest(problem.Contest, official); if (!this.Data.Participants.Any(problem.ContestId, this.UserProfile.Id, official)) { return this.RedirectToAction("Register", new { id = problem.ContestId, official }); } var problemViewModel = new ContestProblemViewModel(problem); return this.PartialView("_ProblemPartial", problemViewModel); } /// /// Gets a participant's submission results for a problem. /// /// The Kendo data source request. /// The problem id. /// A check whether the problem is practiced or competed. /// Returns the submissions results for a participant's problem. [Authorize] public ActionResult ReadSubmissionResults([DataSourceRequest]DataSourceRequest request, int id, bool official) { var problem = this.Data.Problems.GetById(id); var participant = this.Data.Participants.GetWithContest(problem.ContestId, this.UserProfile.Id, official); if (participant == null) { throw new HttpException((int)HttpStatusCode.Unauthorized, Resource.ContestsGeneral.User_is_not_registered_for_exam); } if (!problem.ShowResults) { throw new HttpException((int)HttpStatusCode.Forbidden, Resource.ContestsGeneral.Problem_results_not_available); } var userSubmissions = this.Data.Submissions.All() .Where(x => x.ProblemId == id && x.ParticipantId == participant.Id) .Select(SubmissionResultViewModel.FromSubmission); return this.Json(userSubmissions.ToDataSourceResult(request)); } [Authorize] public ActionResult ReadSubmissionResultsAreCompiled([DataSourceRequest]DataSourceRequest request, int id, bool official) { var problem = this.Data.Problems.GetById(id); var participant = this.Data.Participants.GetWithContest(problem.ContestId, this.UserProfile.Id, official); if (participant == null) { throw new HttpException((int)HttpStatusCode.Unauthorized, Resource.ContestsGeneral.User_is_not_registered_for_exam); } var userSubmissions = this.Data.Submissions.All() .Where(x => x.ProblemId == id && x.ParticipantId == participant.Id) .Select(SubmissionResultIsCompiledViewModel.FromSubmission); return this.Json(userSubmissions.ToDataSourceResult(request)); } /// /// Gets the allowed submission types for a contest. /// /// The contest id. /// Returns the allowed submission types as JSON. public ActionResult GetAllowedSubmissionTypes(int id) { // TODO: Implement this method with only one database query (this.Data.SubmissionTypes.All().Where(x => x.ContestId == id) var contest = this.Data.Contests.GetById(id); if (contest == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.ContestsGeneral.Contest_not_found); } var submissionTypesSelectListItems = contest .SubmissionTypes .ToList() .Select(x => new { Text = x.Name, Value = x.Id.ToString(CultureInfo.InvariantCulture), Selected = x.IsSelectedByDefault, x.AllowBinaryFilesUpload, x.AllowedFileExtensions, }); return this.Json(submissionTypesSelectListItems, JsonRequestBehavior.AllowGet); } /// /// Gets a problem resource and sends it to the user. If the user is not logged in redirects him to the /// login page. If the user is not registered for the exam - redirects him to the appropriate page. /// /// The resource id. /// A check whether the problem is practiced or competed. /// Returns a file with the resource contents or redirects the user to the appropriate /// registration page. public ActionResult DownloadResource(int id, bool official) { var problemWithResource = this.Data.Problems .All() .FirstOrDefault(problem => problem.Resources.Any(res => res.Id == id && !res.IsDeleted)); if (problemWithResource == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.ContestsGeneral.Problem_not_found); } var contest = problemWithResource.Contest; bool userCanDownloadResource = false; if (this.UserProfile == null) { ValidateContest(contest, official); } else if (this.User != null && this.User.IsAdmin()) { // TODO: add unit tests // If the user is an administrator he can download the resource at any time. userCanDownloadResource = true; } else { ValidateContest(contest, official); userCanDownloadResource = this.Data.Participants.Any(contest.Id, this.UserProfile.Id, official); } if (userCanDownloadResource || (contest.CanBeCompeted && !contest.HasContestPassword) || (contest.CanBePracticed && !contest.HasPracticePassword)) { var resource = problemWithResource.Resources.FirstOrDefault(res => res.Id == id); if (string.IsNullOrWhiteSpace(resource.FileExtension) || resource.File == null || resource.File.Length == 0) { throw new HttpException((int)HttpStatusCode.Forbidden, Resource.ContestsGeneral.Resource_cannot_be_downloaded); } return this.File(resource.File, GlobalConstants.BinaryFileMimeType, string.Format("{0}_{1}.{2}", resource.Problem.Name, resource.Name, resource.FileExtension)); } if ((contest.CanBePracticed && !official) || (contest.CanBeCompeted && official)) { return this.RedirectToAction("Register", new { official, id = contest.Id }); } throw new HttpException((int)HttpStatusCode.Forbidden, Resource.ContestsGeneral.Resource_cannot_be_downloaded); } /// /// Gets the content of a participant submission for a particular problem. /// /// The submission id. /// Returns a JSON with the submission content. //// TODO: Remove if not used [Authorize] public ActionResult GetSubmissionContent(int id) { var submission = this.Data.Submissions.All().FirstOrDefault(x => x.Id == id); if (submission == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.ContestsGeneral.Submission_not_found); } if (submission.Participant.UserId != this.UserProfile.Id) { throw new HttpException((int)HttpStatusCode.Forbidden, Resource.ContestsGeneral.Submission_not_made_by_user); } var contentString = submission.ContentAsString; return this.Json(contentString, JsonRequestBehavior.AllowGet); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Controllers/ContestsController.cs ================================================ namespace OJS.Web.Areas.Contests.Controllers { using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using OJS.Data; using OJS.Web.Areas.Contests.ViewModels.Contests; using OJS.Web.Areas.Contests.ViewModels.Problems; using OJS.Web.Areas.Contests.ViewModels.Submissions; using OJS.Web.Controllers; using Resource = Resources.Areas.Contests.ContestsGeneral; public class ContestsController : BaseController { public ContestsController(IOjsData data) : base(data) { } public ActionResult Details(int id) { var contestViewModel = this.Data.Contests.All() .Where(x => x.Id == id && !x.IsDeleted && x.IsVisible) .Select(ContestViewModel.FromContest) .FirstOrDefault(); if (contestViewModel == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.Contest_not_found); } this.ViewBag.ContestProblems = this.Data.Problems.All().Where(x => x.ContestId == id) .Select(ProblemListItemViewModel.FromProblem); return this.View(contestViewModel); } public ActionResult BySubmissionType(int id) { var contests = this.Data.Contests .All() .Where(x => x.SubmissionTypes.Any(s => s.Id == id) && !x.IsDeleted && x.IsVisible) .Select(ContestViewModel.FromContest); return this.View(contests); } [Authorize] [HttpPost] public ActionResult UserSubmissions([DataSourceRequest]DataSourceRequest request, int contestId) { var userSubmissions = this.Data.Submissions.All() .Where(x => x.Participant.UserId == this.UserProfile.Id && x.Problem.ContestId == contestId && x.Problem.ShowResults) .Select(SubmissionResultViewModel.FromSubmission); return this.Json(userSubmissions.ToDataSourceResult(request)); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Controllers/ListController.cs ================================================ namespace OJS.Web.Areas.Contests.Controllers { using System.Collections.Generic; using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using OJS.Data; using OJS.Web.Areas.Contests.ViewModels.Contests; using OJS.Web.Areas.Contests.ViewModels.Submissions; using OJS.Web.Controllers; using Resource = Resources.Areas.Contests.ContestsGeneral; public class ListController : BaseController { public ListController(IOjsData data) : base(data) { } public ActionResult Index() { var contests = this.Data.Contests.All().Select(ContestViewModel.FromContest).ToList(); return this.View(contests); } public ActionResult ReadCategories(int? id) { var categories = this.Data.ContestCategories.All() .Where(x => x.IsVisible) .Where(x => id.HasValue ? x.ParentId == id : x.ParentId == null) .OrderBy(x => x.OrderBy) .Select(ContestCategoryListViewModel.FromCategory); return this.Json(categories, JsonRequestBehavior.AllowGet); } public ActionResult GetParents(int id) { var categoryIds = new List(); var category = this.Data.ContestCategories.GetById(id); categoryIds.Add(category.Id); var parent = category.Parent; while (parent != null) { categoryIds.Add(parent.Id); parent = parent.Parent; } categoryIds.Reverse(); return this.Json(categoryIds, JsonRequestBehavior.AllowGet); } public ActionResult ByCategory(int? id) { ContestCategoryViewModel contestCategory; if (id.HasValue) { contestCategory = this.Data.ContestCategories.All() .Where(x => x.Id == id && !x.IsDeleted && x.IsVisible) .OrderBy(x => x.OrderBy) .Select(ContestCategoryViewModel.FromContestCategory) .FirstOrDefault(); } else { contestCategory = new ContestCategoryViewModel { CategoryName = Resource.Main_categories, Contests = new HashSet(), SubCategories = this.Data.ContestCategories.All() .Where(x => x.IsVisible && !x.IsDeleted && x.Parent == null) .Select(ContestCategoryListViewModel.FromCategory) }; } if (contestCategory == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.Category_not_found); } if (this.Request.IsAjaxRequest()) { this.ViewBag.IsAjax = true; return this.PartialView(contestCategory); } this.ViewBag.IsAjax = false; return this.View(contestCategory); } public ActionResult BySubmissionType(int? id, string submissionTypeName) { SubmissionTypeViewModel submissionType; if (id.HasValue) { submissionType = this.Data.SubmissionTypes.All() .Where(x => x.Id == id.Value) .Select(SubmissionTypeViewModel.FromSubmissionType) .FirstOrDefault(); } else { throw new HttpException((int)HttpStatusCode.BadRequest, Resource.Invalid_request); } if (submissionType == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.Submission_type_not_found); } var contests = this.Data.Contests .All() .Where(c => !c.IsDeleted && c.IsVisible && c.SubmissionTypes.Any(s => s.Id == submissionType.Id)) .OrderBy(x => x.OrderBy) .Select(ContestViewModel.FromContest); this.ViewBag.SubmissionType = submissionType.Name; return this.View(contests); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Controllers/ParticipantsAnswersController.cs ================================================ namespace OJS.Web.Areas.Contests.Controllers { using System.Collections; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.UI; using OJS.Data; using OJS.Web.Areas.Contests.ViewModels.ParticipantsAnswers; using OJS.Web.Common.Attributes; using OJS.Web.Controllers; public class ParticipantsAnswersController : KendoGridAdministrationController { private int contestId; public ParticipantsAnswersController(IOjsData data) : base(data) { } [OverrideAuthorize(Roles = "KidsTeacher, Administrator")] public ActionResult Details(int id) { this.contestId = id; return this.View(id); } [OverrideAuthorize(Roles = "KidsTeacher, Administrator")] public override object GetById(object id) { return this.Data.Contests.All().FirstOrDefault(x => x.Id == (int)id); } [HttpPost] [OverrideAuthorize(Roles = "KidsTeacher, Administrator")] public ActionResult ReadData([DataSourceRequest] DataSourceRequest request, int contestId) { this.contestId = contestId; return this.Read(request); } [HttpGet] [OverrideAuthorize(Roles = "KidsTeacher, Administrator")] public FileResult ExcelExport([DataSourceRequest] DataSourceRequest request, int contestId) { this.contestId = contestId; return this.ExportToExcel(request, this.GetData()); } [OverrideAuthorize(Roles = "KidsTeacher, Administrator")] public override IEnumerable GetData() { var result = this.Data .Contests .All() .Where(x => x.Id == this.contestId) .SelectMany( x => x.Participants .Select(z => new ParticipantsAnswersViewModel { Id = z.Id, Points = z.Submissions.Any() ? z.Submissions .Where(s => !s.Problem.IsDeleted) .GroupBy(s => s.Problem) .Select(gr => gr.Any() ? gr.OrderByDescending(s => s.Points).Select(q => q.Points).Take(1).FirstOrDefault() : 0) .Sum(q => q) : 0, ParticipantUsername = z.User.UserName, ParticipantFullName = z.User.UserSettings.FirstName + " " + z.User.UserSettings.LastName, Answer = z.Answers.Any() ? z.Answers.FirstOrDefault().Answer : string.Empty })) .ToList(); foreach (var item in result) { int id = 0; if (int.TryParse(item.Answer, out id)) { item.Answer = this.Data.ContestQuestionAnswers.All().FirstOrDefault(x => x.Id == id)?.Text; } } return result .OrderByDescending(s => s.Answer) .ThenByDescending(s => s.Points); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Controllers/ResultsController.cs ================================================ namespace OJS.Web.Areas.Contests.Controllers { using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using OJS.Common; using OJS.Data; using OJS.Web.Areas.Contests.ViewModels.Contests; using OJS.Web.Areas.Contests.ViewModels.Results; using OJS.Web.Common.Extensions; using OJS.Web.Controllers; using Resource = Resources.Areas.Contests.ContestsGeneral; public class ResultsController : BaseController { public const int ResultsPageSize = 300; public ResultsController(IOjsData data) : base(data) { } /// /// Gets the results for a particular problem for users with at least one submission. /// /// The datasource request. /// The id of the problem. /// A flag checking if the requested results are for practice or for a competition. /// Returns the best result for each user who has at least one submission for the problem. [Authorize] public ActionResult ByProblem([DataSourceRequest]DataSourceRequest request, int id, bool official) { var problem = this.Data.Problems.GetById(id); var participant = this.Data.Participants.GetWithContest(problem.ContestId, this.UserProfile.Id, official); if (participant == null) { throw new HttpException((int)HttpStatusCode.Unauthorized, Resource.User_is_not_registered_for_exam); } if (!problem.ShowResults) { throw new HttpException((int)HttpStatusCode.Forbidden, Resource.Problem_results_not_available); } var results = this.Data.Submissions.All() .Where(x => x.ProblemId == problem.Id && x.Participant.IsOfficial == official) .GroupBy(x => x.Participant) .Select( submissionGrouping => new ProblemResultViewModel { ProblemId = problem.Id, ParticipantName = submissionGrouping.Key.User.UserName, MaximumPoints = problem.MaximumPoints, Result = submissionGrouping.Where(x => x.ProblemId == problem.Id) .Max(x => x.Points) }); return this.Json(results.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); } /// /// Gets the results for a contest. /// /// The contest id. /// A flag, showing if the results are for practice /// or for competition /// Returns a view with the results of the contest. [Authorize] public ActionResult Simple(int id, bool official, int? page) { var contest = this.Data.Contests.GetById(id); if (contest == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.Contest_not_found); } // if the results are not visible and the participant is not registered for the contest // then he is not authorized to view the results if (!contest.ResultsArePubliclyVisible && !this.Data.Participants.Any(id, this.UserProfile.Id, official) && !this.User.IsAdmin()) { throw new HttpException((int)HttpStatusCode.Forbidden, Resource.Contest_results_not_available); } // TODO: Extract choosing the best submission logic to separate repository method? var contestModel = new ContestResultsViewModel { Id = contest.Id, Name = contest.Name, ContestCanBeCompeted = contest.CanBeCompeted, ContestCanBePracticed = contest.CanBePracticed, Problems = contest.Problems.AsQueryable().Where(x => !x.IsDeleted) .Select(ContestProblemViewModel.FromProblem).OrderBy(x => x.OrderBy).ThenBy(x => x.Name), Results = this.Data.Participants.All() .Where(participant => participant.ContestId == contest.Id && participant.IsOfficial == official) .Select(participant => new ParticipantResultViewModel { ParticipantUsername = participant.User.UserName, ParticipantFirstName = participant.User.UserSettings.FirstName, ParticipantLastName = participant.User.UserSettings.LastName, ProblemResults = participant.Contest.Problems .Where(x => !x.IsDeleted) .Select(problem => new ProblemResultPairViewModel { Id = problem.Id, ProblemName = problem.Name, ProblemOrderBy = problem.OrderBy, ShowResult = problem.ShowResults, BestSubmission = problem.Submissions .Where(z => z.ParticipantId == participant.Id && !z.IsDeleted) .OrderByDescending(z => z.Points).ThenByDescending(z => z.Id) .Select(z => new BestSubmissionViewModel { Id = z.Id, Points = z.Points }) .FirstOrDefault() }) .OrderBy(res => res.ProblemOrderBy).ThenBy(res => res.ProblemName) }) .ToList() .OrderByDescending(x => x.Total) }; // calculate page information contestModel.TotalResults = contestModel.Results.Count(); int totalResults = contestModel.TotalResults; int totalPages = totalResults % ResultsPageSize == 0 ? totalResults / ResultsPageSize : (totalResults / ResultsPageSize) + 1; if (page == null || page < 1) { page = 1; } else if (page > totalPages) { page = totalPages; } // TODO: optimize if possible // query the paged result contestModel.Results = contestModel.Results .Skip((page.Value - 1) * ResultsPageSize) .Take(ResultsPageSize); // add page info to View Model contestModel.CurrentPage = page.Value; contestModel.AllPages = totalPages; if (this.User.IsAdmin()) { contestModel.Results = contestModel.Results.OrderByDescending(x => x.AdminTotal); } this.ViewBag.IsOfficial = official; return this.View(contestModel); } // TODO: Unit test [Authorize(Roles = GlobalConstants.AdministratorRoleName)] public ActionResult Full(int id, bool official) { var contest = this.Data.Contests.GetById(id); if (contest == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.Contest_not_found); } var model = new ContestFullResultsViewModel { Id = contest.Id, Name = contest.Name, Problems = contest.Problems.AsQueryable().Where(pr => !pr.IsDeleted).Select(ContestProblemViewModel.FromProblem).OrderBy(x => x.OrderBy).ThenBy(x => x.Name), Results = this.Data.Participants.All() .Where(participant => participant.ContestId == contest.Id && participant.IsOfficial == official) .Select(participant => new ParticipantFullResultViewModel { ParticipantUsername = participant.User.UserName, ParticipantFirstName = participant.User.UserSettings.FirstName, ParticipantLastName = participant.User.UserSettings.LastName, ProblemResults = participant.Contest.Problems .Where(x => !x.IsDeleted) .Select(problem => new ProblemFullResultViewModel { Id = problem.Id, ProblemName = problem.Name, ProblemOrderBy = problem.OrderBy, MaximumPoints = problem.MaximumPoints, BestSubmission = problem.Submissions.AsQueryable() .Where(submission => submission.ParticipantId == participant.Id && !submission.IsDeleted && submission.CreatedOn >= contest.StartTime) .OrderByDescending(z => z.Points).ThenByDescending(z => z.Id) .Select(SubmissionFullResultsViewModel.FromSubmission) .FirstOrDefault(), }) .OrderBy(res => res.ProblemOrderBy).ThenBy(res => res.ProblemName) }) .ToList() .OrderByDescending(x => x.Total).ThenBy(x => x.ParticipantUsername) }; this.ViewBag.IsOfficial = official; return this.View(model); } [Authorize(Roles = GlobalConstants.AdministratorRoleName)] public ActionResult GetParticipantsAveragePoints(int id) { var contestInfo = this.Data.Contests.All() .Where(c => c.Id == id) .Select( c => new { c.Id, ParticipantsCount = (double)c.Participants.Count(p => p.IsOfficial), c.StartTime, c.EndTime }) .FirstOrDefault(); var submissions = this.Data.Participants.All() .Where(participant => participant.ContestId == contestInfo.Id && participant.IsOfficial) .SelectMany(participant => participant.Contest.Problems .Where(pr => !pr.IsDeleted) .SelectMany(pr => pr.Submissions .Where(subm => !subm.IsDeleted && subm.ParticipantId == participant.Id) .Select(subm => new { subm.Points, subm.CreatedOn, ParticipantId = participant.Id, ProblemId = pr.Id }))) .OrderBy(subm => subm.CreatedOn) .ToList(); var viewModel = new List(); for (DateTime time = contestInfo.StartTime.Value.AddMinutes(5); time <= contestInfo.EndTime.Value && time < DateTime.Now; time = time.AddMinutes(5)) { if (!submissions.Any(pr => pr.CreatedOn >= contestInfo.StartTime && pr.CreatedOn <= time)) { continue; } var averagePointsLocal = submissions .Where(pr => pr.CreatedOn >= contestInfo.StartTime && pr.CreatedOn <= time) .GroupBy(pr => new { pr.ProblemId, pr.ParticipantId }) .Select(gr => new { MaxPoints = gr.Max(pr => pr.Points), gr.Key.ParticipantId }) .GroupBy(pr => pr.ParticipantId) .Select(gr => gr.Sum(pr => pr.MaxPoints)) .Aggregate((sum, el) => sum + el) / contestInfo.ParticipantsCount; viewModel.Add(new ContestStatsChartViewModel { AverageResult = averagePointsLocal, Minute = time.Minute, Hour = time.Hour }); } return this.Json(viewModel); } [Authorize(Roles = GlobalConstants.AdministratorRoleName)] public ActionResult Stats(ContestFullResultsViewModel viewModel) { var maxResult = this.Data.Contests.All().FirstOrDefault(c => c.Id == viewModel.Id).Problems.Sum(p => p.MaximumPoints); var participantsCount = viewModel.Results.Count(); var statsModel = new ContestStatsViewModel(); statsModel.MinResultsCount = viewModel.Results.Count(r => r.Total == 0); statsModel.MinResultsPercent = (double)statsModel.MinResultsCount / participantsCount; statsModel.MaxResultsCount = viewModel.Results.Count(r => r.Total == maxResult); statsModel.MaxResultsPercent = (double)statsModel.MaxResultsCount / participantsCount; statsModel.AverageResult = (double)viewModel.Results.Sum(r => r.Total) / participantsCount; int fromPoints = 0; int toPoints = 0; foreach (var problem in viewModel.Problems) { var maxResultsForProblem = viewModel.Results.Count(r => r.ProblemResults.Any(pr => pr.ProblemName == problem.Name && pr.BestSubmission != null && pr.BestSubmission.Points == pr.MaximumPoints)); var maxResultsForProblemPercent = (double)maxResultsForProblem / participantsCount; statsModel.StatsByProblem.Add(new ContestProblemStatsViewModel { Name = problem.Name, MaxResultsCount = maxResultsForProblem, MaxResultsPercent = maxResultsForProblemPercent, MaxPossiblePoints = problem.MaximumPoints }); if (toPoints == 0) { toPoints = problem.MaximumPoints; } else { toPoints += problem.MaximumPoints; } var participantsInPointsRange = viewModel.Results.Count(r => r.Total >= fromPoints && r.Total <= toPoints); var participantsInPointsRangePercent = (double)participantsInPointsRange / participantsCount; statsModel.StatsByPointsRange.Add(new ContestPointsRangeViewModel { PointsFrom = fromPoints, PointsTo = toPoints, Participants = participantsInPointsRange, PercentOfAllParticipants = participantsInPointsRangePercent }); fromPoints = toPoints + 1; } return this.PartialView("_StatsPartial", statsModel); } [Authorize(Roles = GlobalConstants.AdministratorRoleName)] public ActionResult StatsChart(int contestId) { return this.PartialView("_StatsChartPartial", contestId); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Controllers/SubmissionsController.cs ================================================ namespace OJS.Web.Areas.Contests.Controllers { using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using OJS.Common; using OJS.Data; using OJS.Web.Areas.Contests.ViewModels.Submissions; using OJS.Web.Common.Extensions; using OJS.Web.Controllers; using Resource = Resources.Areas.Contests.ContestsGeneral; public class SubmissionsController : BaseController { public SubmissionsController(IOjsData data) : base(data) { } [ActionName("View")] [Authorize] public ActionResult Details(int id) { var submission = this.Data.Submissions.All() .Where(x => x.Id == id) .Select(SubmissionDetailsViewModel.FromSubmission) .FirstOrDefault(); if (submission == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.Submission_not_found); } if (!this.User.IsAdmin() && submission.IsDeleted) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.Submission_not_found); } if (!this.User.IsAdmin() && this.UserProfile != null && submission.UserId != this.UserProfile.Id) { throw new HttpException((int)HttpStatusCode.Forbidden, Resource.Submission_not_made_by_user); } return this.View(submission); } // TODO: Extract common validations between Download() and Details() public FileResult Download(int id) { var submission = this.Data.Submissions.All() .Where(x => x.Id == id) .Select(SubmissionDetailsViewModel.FromSubmission) .FirstOrDefault(); if (submission == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.Submission_not_found); } if (!this.User.IsAdmin() && submission.IsDeleted) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.Submission_not_found); } if (!this.User.IsAdmin() && this.UserProfile != null && submission.UserId != this.UserProfile.Id) { throw new HttpException((int)HttpStatusCode.Forbidden, Resource.Submission_not_made_by_user); } // TODO: When text content is saved, uncompressing should be performed return this.File(submission.Content, GlobalConstants.BinaryFileMimeType, string.Format("Submission_{0}.{1}", submission.Id, submission.FileExtension)); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Helpers/ContestExtensions.cs ================================================ namespace OJS.Web.Areas.Contests.Helpers { using System.Linq; using OJS.Data.Models; public static class ContestExtensions { public static bool ShouldShowRegistrationForm(this Contest contest, bool isOfficialParticipant) { // Show registration form if contest password is required var showRegistrationForm = (isOfficialParticipant && contest.HasContestPassword) || (!isOfficialParticipant && contest.HasPracticePassword); // Show registration form if contest is official and questions should be asked if (isOfficialParticipant && contest.Questions.Any(x => x.AskOfficialParticipants)) { showRegistrationForm = true; } // Show registration form if contest is not official and questions should be asked if (!isOfficialParticipant && contest.Questions.Any(x => x.AskPracticeParticipants)) { showRegistrationForm = true; } return showRegistrationForm; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Models/BinarySubmissionModel.cs ================================================ namespace OJS.Web.Areas.Contests.Models { using System.ComponentModel.DataAnnotations; using System.Web; public class BinarySubmissionModel { public int ProblemId { get; set; } public int SubmissionTypeId { get; set; } [Required] public HttpPostedFileBase File { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Models/ContestQuestionAnswerModel.cs ================================================ namespace OJS.Web.Areas.Contests.Models { using System.ComponentModel.DataAnnotations; public class ContestQuestionAnswerModel { public int QuestionId { get; set; } [Required] public string Answer { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Models/ContestRegistrationModel.cs ================================================ namespace OJS.Web.Areas.Contests.Models { using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text.RegularExpressions; using OJS.Data; using Resource = Resources.Areas.Contests.ViewModels.ContestsViewModels; public class ContestRegistrationModel : IValidatableObject { private IOjsData data; public ContestRegistrationModel() : this(new OjsData()) { } public ContestRegistrationModel(IOjsData data) { this.Questions = new HashSet(); this.data = data; } public int ContestId { get; set; } public string Password { get; set; } public IEnumerable Questions { get; set; } public IEnumerable Validate(ValidationContext validationContext) { var validationResults = new HashSet(); var contest = this.data.Contests.GetById(this.ContestId); var contestQuestions = contest.Questions .Where(x => !x.IsDeleted) .ToList(); var counter = 0; foreach (var question in contestQuestions) { var answer = this.Questions.FirstOrDefault(x => x.QuestionId == question.Id); var memberName = string.Format("Questions[{0}].Answer", counter); if (answer == null) { var validationErrorMessage = string.Format(Resource.Question_not_answered, question.Id); var validationResult = new ValidationResult(validationErrorMessage, new[] { memberName }); validationResults.Add(validationResult); } else if (!string.IsNullOrWhiteSpace(question.RegularExpressionValidation) && !Regex.IsMatch(answer.Answer, question.RegularExpressionValidation)) { var validationErrorMessage = string.Format(Resource.Question_not_answered_correctly, question.Id); var validationResult = new ValidationResult(validationErrorMessage, new[] { memberName }); validationResults.Add(validationResult); } counter++; } return validationResults; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Models/SubmissionModel.cs ================================================ namespace OJS.Web.Areas.Contests.Models { using System.ComponentModel.DataAnnotations; using System.Web.Mvc; public class SubmissionModel { public int ProblemId { get; set; } public int SubmissionTypeId { get; set; } [StringLength(int.MaxValue, MinimumLength = 5)] [Required] [AllowHtml] public string Content { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/ContestCategoryListViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { using System; using System.Linq; using System.Linq.Expressions; using OJS.Common.Extensions; using OJS.Data.Models; public class ContestCategoryListViewModel { public static Expression> FromCategory { get { return category => new ContestCategoryListViewModel { Id = category.Id, Name = category.Name, HasChildren = category.Children.Any(x => x.IsVisible && !x.IsDeleted) }; } } public int Id { get; set; } public string Name { get; set; } public string NameUrl => this.Name.ToUrl(); public bool HasChildren { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/ContestCategoryViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using OJS.Data.Models; public class ContestCategoryViewModel { public static Expression> FromContestCategory { get { return contestCategory => new ContestCategoryViewModel { CategoryName = contestCategory.Name, Contests = contestCategory.Contests.AsQueryable() .Where(x => x.IsVisible && !x.IsDeleted) .OrderBy(x => x.OrderBy) .ThenByDescending(x => x.EndTime) .Select(ContestViewModel.FromContest), SubCategories = contestCategory.Children.AsQueryable() .Select(ContestCategoryListViewModel.FromCategory) }; } } public string CategoryName { get; set; } public IEnumerable Contests { get; set; } public IEnumerable SubCategories { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/ContestPointsRangeViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { public class ContestPointsRangeViewModel { public int PointsFrom { get; set; } public int PointsTo { get; set; } public int Participants { get; set; } public double PercentOfAllParticipants { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/ContestProblemResourceViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { using System; using System.Linq.Expressions; using OJS.Common.Models; using OJS.Data.Models; public class ContestProblemResourceViewModel { public static Expression> FromResource { get { return resource => new ContestProblemResourceViewModel { ResourceId = resource.Id, Name = resource.Name, Link = resource.Link, ProblemType = resource.Type }; } } public int ResourceId { get; set; } public string Name { get; set; } public string Link { get; set; } public ProblemResourceType ProblemType { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/ContestProblemStatsViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { public class ContestProblemStatsViewModel { public string Name { get; set; } public int MaxPossiblePoints { get; set; } public int MaxResultsCount { get; set; } public double MaxResultsPercent { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/ContestProblemViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using OJS.Data.Models; public class ContestProblemViewModel { private int memoryLimitInBytes; private int timeLimitInMs; private int? fileSizeLimitInBytes; public ContestProblemViewModel(Problem problem) { this.ProblemId = problem.Id; this.Name = problem.Name; this.OrderBy = problem.OrderBy; this.ContestId = problem.ContestId; this.ShowResults = problem.ShowResults; this.Resources = problem.Resources.AsQueryable() .OrderBy(x => x.OrderBy) .Where(x => !x.IsDeleted) .Select(ContestProblemResourceViewModel.FromResource); this.TimeLimit = problem.TimeLimit; this.MemoryLimit = problem.MemoryLimit; this.FileSizeLimit = problem.SourceCodeSizeLimit; this.CheckerName = problem.Checker.Name; this.CheckerDescription = problem.Checker.Description; this.MaximumPoints = problem.MaximumPoints; } public ContestProblemViewModel() { this.Resources = new HashSet(); } // TODO: Constructor and this static property have the same code. Refactor. public static Expression> FromProblem { get { return problem => new ContestProblemViewModel { Name = problem.Name, OrderBy = problem.OrderBy, ProblemId = problem.Id, ContestId = problem.ContestId, MemoryLimit = problem.MemoryLimit, TimeLimit = problem.TimeLimit, FileSizeLimit = problem.SourceCodeSizeLimit, ShowResults = problem.ShowResults, CheckerName = problem.Checker.Name, CheckerDescription = problem.Checker.Description, MaximumPoints = problem.MaximumPoints, Resources = problem.Resources.AsQueryable() .Where(x => !x.IsDeleted) .OrderBy(x => x.OrderBy) .Select(ContestProblemResourceViewModel.FromResource) }; } } public int ContestId { get; set; } public int ProblemId { get; set; } public string Name { get; set; } public int OrderBy { get; set; } public int MaximumPoints { get; set; } public bool ShowResults { get; set; } public double MemoryLimit { get { return (double)this.memoryLimitInBytes / 1024 / 1024; } set { this.memoryLimitInBytes = (int)value; } } public double TimeLimit { get { return this.timeLimitInMs / 1000.00; } set { this.timeLimitInMs = (int)value; } } public double? FileSizeLimit { get { if (!this.fileSizeLimitInBytes.HasValue) { return null; } return (double)this.fileSizeLimitInBytes / 1024; } set { this.fileSizeLimitInBytes = (int?)value; } } public string CheckerName { get; set; } public string CheckerDescription { get; set; } public IEnumerable Resources { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/ContestRegistrationViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using OJS.Data.Models; using OJS.Web.Areas.Contests.Models; using Resource = Resources.Areas.Contests.ViewModels.ContestsViewModels; public class ContestRegistrationViewModel { public ContestRegistrationViewModel(Contest contest, bool isOfficial) { this.ContestName = contest.Name; this.ContestId = contest.Id; this.RequirePassword = isOfficial ? contest.HasContestPassword : contest.HasPracticePassword; this.Questions = contest.Questions .Where(x => !x.IsDeleted) .AsQueryable() .Select(QuestionViewModel.FromQuestion); } public ContestRegistrationViewModel(Contest contest, ContestRegistrationModel userAnswers, bool isOfficial) : this(contest, isOfficial) { this.Questions = this.Questions.Select(x => { var userAnswer = userAnswers.Questions.FirstOrDefault(y => y.QuestionId == x.QuestionId); return new QuestionViewModel { Answer = userAnswer == null ? null : userAnswer.Answer, QuestionId = x.QuestionId, Question = x.Question, Type = x.Type, PossibleAnswers = x.PossibleAnswers }; }); } public int ContestId { get; set; } public string ContestName { get; set; } public bool RequirePassword { get; set; } [Display(Name = "Password", ResourceType = typeof(Resource))] public string Password { get; set; } public IEnumerable Questions { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/ContestStatsChartViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { public class ContestStatsChartViewModel { public double AverageResult { get; set; } public int Hour { get; set; } public int Minute { get; set; } public string DisplayValue => $"{this.Hour:00}:{this.Minute:00}"; } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/ContestStatsViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { using System.Collections.Generic; public class ContestStatsViewModel { public ContestStatsViewModel() { this.StatsByProblem = new List(); this.StatsByPointsRange = new List(); } public int MaxResultsCount { get; set; } public double MaxResultsPercent { get; set; } public int MinResultsCount { get; set; } public double MinResultsPercent { get; set; } public double AverageResult { get; set; } public ICollection StatsByProblem { get; set; } public ICollection StatsByPointsRange { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/ContestViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Linq.Expressions; using OJS.Common.Extensions; using OJS.Data.Models; using OJS.Web.Areas.Contests.ViewModels.Submissions; using Resource = Resources.Areas.Contests.ViewModels.ContestsViewModels; public class ContestViewModel { private string contestName; public static Expression> FromContest { get { return contest => new ContestViewModel { Id = contest.Id, Name = contest.Name, CategoryId = contest.CategoryId, CategoryName = contest.Category.Name, StartTime = contest.StartTime, EndTime = contest.EndTime, PracticeStartTime = contest.PracticeStartTime, PracticeEndTime = contest.PracticeEndTime, IsDeleted = contest.IsDeleted, IsVisible = contest.IsVisible, ContestPassword = contest.ContestPassword, PracticePassword = contest.PracticePassword, HasContestQuestions = contest.Questions.Any(x => x.AskOfficialParticipants), HasPracticeQuestions = contest.Questions.Any(x => x.AskPracticeParticipants), OfficialParticipants = contest.Participants.Count(x => x.IsOfficial), PracticeParticipants = contest.Participants.Count(x => !x.IsOfficial), ProblemsCount = contest.Problems.Count(x => !x.IsDeleted), Problems = contest.Problems.AsQueryable() .Where(x => !x.IsDeleted) .OrderBy(x => x.OrderBy) .ThenBy(x => x.Name) .Select(ContestProblemViewModel.FromProblem), LimitBetweenSubmissions = contest.LimitBetweenSubmissions, Description = contest.Description, AllowedSubmissionTypes = contest.SubmissionTypes.AsQueryable().Select(SubmissionTypeViewModel.FromSubmissionType) }; } } public int Id { get; set; } [Display(Name = "Name", ResourceType = typeof(Resource))] public string Name { get; set; } public int? CategoryId { get; set; } public string CategoryName { get { return this.contestName.ToUrl(); } set { this.contestName = value; } } public string Description { get; set; } public DateTime? StartTime { get; set; } public DateTime? EndTime { get; set; } public DateTime? PracticeStartTime { get; set; } public DateTime? PracticeEndTime { get; set; } public int LimitBetweenSubmissions { get; set; } public bool IsDeleted { get; set; } public bool IsVisible { get; set; } public string ContestPassword { private get; set; } public string PracticePassword { private get; set; } public bool HasContestQuestions { get; set; } public bool HasPracticeQuestions { get; set; } public int OfficialParticipants { get; set; } public int PracticeParticipants { get; set; } public int ProblemsCount { get; set; } public IEnumerable AllowedSubmissionTypes { get; set; } public IEnumerable Problems { get; set; } public bool CanBeCompeted { get { if (!this.IsVisible) { return false; } if (this.IsDeleted) { return false; } if (!this.StartTime.HasValue) { // Cannot be competed return false; } if (!this.EndTime.HasValue) { // Compete forever return this.StartTime <= DateTime.Now; } return this.StartTime <= DateTime.Now && DateTime.Now <= this.EndTime; } } public bool CanBePracticed { get { if (!this.IsVisible) { return false; } if (this.IsDeleted) { return false; } if (!this.PracticeStartTime.HasValue) { // Cannot be practiced return false; } if (!this.PracticeEndTime.HasValue) { // Practice forever return this.PracticeStartTime <= DateTime.Now; } return this.PracticeStartTime <= DateTime.Now && DateTime.Now <= this.PracticeEndTime; } } public bool ResultsArePubliclyVisible { get { if (!this.IsVisible) { return false; } if (this.IsDeleted) { return false; } if (!this.StartTime.HasValue) { // Cannot be competed return false; } return this.EndTime.HasValue && this.EndTime.Value <= DateTime.Now; } } public bool HasContestPassword => this.ContestPassword != null; public bool HasPracticePassword => this.PracticePassword != null; public double? RemainingTimeInMilliseconds { get { if (this.EndTime.HasValue) { return (this.EndTime.Value - DateTime.Now).TotalMilliseconds; } else { return null; } } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/DropDownAnswerViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { public class DropDownAnswerViewModel { public int Value { get; set; } public string Text { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Contests/QuestionViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Contests { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Linq.Expressions; using System.Web.Mvc; using OJS.Common.Models; using OJS.Data.Models; using Resource = Resources.Areas.Contests.ViewModels.ContestsViewModels; public class QuestionViewModel { public static Expression> FromQuestion { get { return question => new QuestionViewModel { QuestionId = question.Id, Question = question.Text, Type = question.Type, RegularExpression = question.RegularExpressionValidation, PossibleAnswers = question.Answers.Where(x => !x.IsDeleted).Select(x => new DropDownAnswerViewModel { Text = x.Text, Value = x.Id }) }; } } public int QuestionId { get; set; } public string RegularExpression { get; set; } [Display(Name = "Question", ResourceType = typeof(Resource))] public string Question { get; set; } [Required(ErrorMessageResourceName = "Answer_required", ErrorMessageResourceType = typeof(Resource))] public string Answer { get; set; } public ContestQuestionType Type { get; set; } public IEnumerable PossibleAnswers { get; set; } public IEnumerable DropDownItems { get { return this.PossibleAnswers.Select(x => new SelectListItem { Text = x.Text, Value = x.Value.ToString() }); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Participants/ParticipantViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Participants { using System; using System.Linq; using OJS.Data.Models; using OJS.Web.Areas.Contests.ViewModels.Contests; public class ParticipantViewModel { public ParticipantViewModel(Participant participant, bool official) { this.Contest = ContestViewModel.FromContest.Compile()(participant.Contest); this.LastSubmissionTime = participant.Submissions.Any() ? (DateTime?)participant.Submissions.Max(x => x.CreatedOn) : null; this.ContestIsCompete = official; } public ContestViewModel Contest { get; set; } public DateTime? LastSubmissionTime { get; set; } public bool ContestIsCompete { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/ParticipantsAnswers/ParticipantsAnswersViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.ParticipantsAnswers { using System.ComponentModel.DataAnnotations; using OJS.Common.DataAnnotations; public class ParticipantsAnswersViewModel { [ExcludeFromExcel] public int Id { get; set; } [Display(Name = "Потребител")] public string ParticipantUsername { get; set; } [Display(Name = "Пълно Име")] public string ParticipantFullName { get; set; } [Display(Name = "Преподавател")] public string Answer { get; set; } [Display(Name = "Точки")] public int Points { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Problems/ProblemListItemViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Problems { using System; using System.Linq.Expressions; using OJS.Data.Models; public class ProblemListItemViewModel { private string name; public static Expression> FromProblem { get { return pr => new ProblemListItemViewModel { ProblemId = pr.Id, Name = pr.Name }; } } public int ProblemId { get; set; } public string Name { get { return this.name; } set { this.name = value.Replace("#", "\\#"); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/BestSubmissionViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { public class BestSubmissionViewModel { public int Id { get; set; } public int Points { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/ContestFullResultsViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { using System.Collections.Generic; using OJS.Web.Areas.Contests.ViewModels.Contests; // TODO: Refactor to reuse same logic with ContestResultsViewModel public class ContestFullResultsViewModel { public int Id { get; set; } public string Name { get; set; } public IEnumerable Problems { get; set; } public IEnumerable Results { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/ContestResultsViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { using System.Collections.Generic; using OJS.Web.Areas.Contests.ViewModels.Contests; public class ContestResultsViewModel { public int Id { get; set; } public string Name { get; set; } public int CurrentPage { get; set; } public int AllPages { get; set; } public int TotalResults { get; set; } public IEnumerable Problems { get; set; } public IEnumerable Results { get; set; } public bool ContestCanBeCompeted { get; set; } public bool ContestCanBePracticed { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/ParticipantFullResultViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { using System.Collections.Generic; using System.Linq; public class ParticipantFullResultViewModel { public string ParticipantUsername { get; set; } public string ParticipantFirstName { get; set; } public string ParticipantLastName { get; set; } public string ParticipantFullName => $"{this.ParticipantFirstName} {this.ParticipantLastName}".Trim(); public IEnumerable ProblemResults { get; set; } public int Total { get { return this.ProblemResults.Where(problemResult => problemResult.BestSubmission != null) .Sum(problemResult => problemResult.BestSubmission.Points); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/ParticipantResultViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { using System.Collections.Generic; using System.Linq; public class ParticipantResultViewModel { public string ParticipantUsername { get; set; } public string ParticipantFirstName { get; set; } public string ParticipantLastName { get; set; } public string ParticipantFullName => $"{this.ParticipantFirstName} {this.ParticipantLastName}".Trim(); public IEnumerable ProblemResults { get; set; } public int Total { get { return this.ProblemResults.Where(x => x.ShowResult).Sum(x => x.BestSubmission?.Points ?? 0); } } public int AdminTotal { get { return this.ProblemResults.Sum(x => x.BestSubmission?.Points ?? 0); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/ProblemFullResultViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { public class ProblemFullResultViewModel { public int Id { get; set; } public string ProblemName { get; set; } public int ProblemOrderBy { get; set; } public SubmissionFullResultsViewModel BestSubmission { get; set; } public int MaximumPoints { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/ProblemResultPairViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { public class ProblemResultPairViewModel { public int Id { get; set; } public bool ShowResult { get; set; } public BestSubmissionViewModel BestSubmission { get; set; } public string ProblemName { get; set; } public int ProblemOrderBy { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/ProblemResultViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using OJS.Data.Models; using Resource = Resources.Areas.Contests.ViewModels.ProblemsViewModels; public class ProblemResultViewModel { public static Expression> FromSubmission { get { return submission => new ProblemResultViewModel { ProblemId = submission.Problem.Id, ParticipantName = submission.Participant.User.UserName, MaximumPoints = submission.Problem.MaximumPoints, Result = submission.Points }; } } [Display(Name = "Participant", ResourceType = typeof(Resource))] public string ParticipantName { get; set; } [Display(Name = "Result", ResourceType = typeof(Resource))] public int Result { get; set; } public int MaximumPoints { get; set; } public int ProblemId { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/SubmissionFullResultsViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using OJS.Data.Models; public class SubmissionFullResultsViewModel { public static Expression> FromSubmission { get { return submission => new SubmissionFullResultsViewModel { Id = submission.Id, SubmissionType = submission.SubmissionType.Name, MaxTimeUsed = submission.TestRuns.Max(x => x.TimeUsed), MaxMemoryUsed = submission.TestRuns.Max(x => x.MemoryUsed), TestRuns = submission.TestRuns.AsQueryable().Select(TestRunFullResultsViewModel.FromTestRun), Points = submission.Points, IsCompiledSuccessfully = submission.IsCompiledSuccessfully }; } } public int Id { get; set; } public string SubmissionType { get; set; } public IEnumerable TestRuns { get; set; } public int? MaxTimeUsed { get; set; } public long? MaxMemoryUsed { get; set; } public int Points { get; set; } public bool IsCompiledSuccessfully { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/SubmissionResultIsCompiledViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { using System; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using OJS.Data.Models; public class SubmissionResultIsCompiledViewModel { public static Expression> FromSubmission { get { return s => new SubmissionResultIsCompiledViewModel { Id = s.Id, IsCompiledSuccessfully = s.IsCompiledSuccessfully, SubmissionDate = s.CreatedOn, IsCalculated = s.Processed }; } } public int Id { get; set; } [Display(Name = "Компилация")] public bool IsCompiledSuccessfully { get; set; } [Display(Name = "Изпратено на")] public DateTime SubmissionDate { get; set; } public bool IsCalculated { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Results/TestRunFullResultsViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Results { using System; using System.Linq.Expressions; using OJS.Common.Models; using OJS.Data.Models; public class TestRunFullResultsViewModel { public static Expression> FromTestRun { get { return testRun => new TestRunFullResultsViewModel { TestRunId = testRun.Id, IsZeroTest = testRun.Test.IsTrialTest, TestId = testRun.TestId, ResultType = testRun.ResultType, }; } } public int TestRunId { get; set; } public bool IsZeroTest { get; set; } public int TestId { get; set; } public TestRunResultType ResultType { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Submissions/SubmissionDetailsViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Submissions { using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using OJS.Common.Extensions; using OJS.Data.Models; public class SubmissionDetailsViewModel { public static Expression> FromSubmission { get { return submission => new SubmissionDetailsViewModel { Id = submission.Id, UserId = submission.Participant.UserId, UserName = submission.Participant.User.UserName, CompilerComment = submission.CompilerComment, Content = submission.Content, FileExtension = submission.FileExtension, CreatedOn = submission.CreatedOn, IsCompiledSuccessfully = submission.IsCompiledSuccessfully, IsDeleted = submission.IsDeleted, Points = submission.Points, Processed = submission.Processed, Processing = submission.Processing, ProblemId = submission.ProblemId, ProblemName = submission.Problem.Name, ProcessingComment = submission.ProcessingComment, SubmissionType = submission.SubmissionType, TestRuns = submission.TestRuns.AsQueryable().Select(TestRunDetailsViewModel.FromTestRun), ShowResults = submission.Problem.ShowResults, ShowDetailedFeedback = submission.Problem.ShowDetailedFeedback }; } } public IEnumerable TestRuns { get; set; } public string UserId { get; set; } public string UserName { get; set; } public string ProblemName { get; set; } public int Id { get; set; } public string CompilerComment { get; set; } public string FileExtension { get; set; } public byte[] Content { get; set; } public bool IsBinaryFile => !string.IsNullOrWhiteSpace(this.FileExtension); public string ContentAsString => this.IsBinaryFile ? "Binary file." : this.Content.Decompress(); public DateTime CreatedOn { get; set; } public bool IsCompiledSuccessfully { get; set; } public bool IsDeleted { get; set; } public int Points { get; set; } public bool Processed { get; set; } public bool Processing { get; set; } public int? ProblemId { get; set; } public string ProcessingComment { get; set; } public SubmissionType SubmissionType { get; set; } public bool ShowResults { get; set; } public bool ShowDetailedFeedback { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Submissions/SubmissionResultViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Submissions { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Linq.Expressions; using OJS.Data.Models; using OJS.Web.ViewModels.TestRun; using Resource = Resources.Areas.Contests.ViewModels.SubmissionsViewModels; public class SubmissionResultViewModel { public SubmissionResultViewModel() { this.TestRuns = new HashSet(); } public static Expression> FromSubmission { get { return submission => new SubmissionResultViewModel { TestRuns = submission.TestRuns.AsQueryable().Select(TestRunViewModel.FromTestRun), SubmissionDate = submission.CreatedOn, MaximumPoints = submission.Problem.MaximumPoints, SubmissionId = submission.Id, IsCalculated = submission.Processed, SubmissionPoints = submission.Points, IsCompiledSuccessfully = submission.IsCompiledSuccessfully, IsOfficial = submission.Participant.IsOfficial, ProblemId = submission.ProblemId }; } } public int SubmissionId { get; set; } [Display(Name = "Problem", ResourceType = typeof(Resource))] public int? ProblemId { get; set; } [Display(Name = "Type", ResourceType = typeof(Resource))] public bool IsOfficial { get; set; } public short MaximumPoints { get; set; } public IEnumerable TestRuns { get; set; } [Display(Name = "Submission_date", ResourceType = typeof(Resource))] public DateTime SubmissionDate { get; set; } public bool IsCalculated { get; set; } [Display(Name = "Maximum_memory", ResourceType = typeof(Resource))] public long? MaximumMemoryUsed { get { if (!this.TestRuns.Any()) { return null; } return this.TestRuns.Max(x => x.MemoryUsed); } } [Display(Name = "Maximum_time", ResourceType = typeof(Resource))] public int? MaximumTimeUsed { get { if (!this.TestRuns.Any()) { return null; } return this.TestRuns.Max(x => x.TimeUsed); } } [Display(Name = "Points", ResourceType = typeof(Resource))] public int? SubmissionPoints { get; set; } [Display(Name = "Is_compiled_successfully", ResourceType = typeof(Resource))] public bool IsCompiledSuccessfully { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Submissions/SubmissionTypeViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Submissions { using System; using System.Linq.Expressions; using OJS.Data.Models; public class SubmissionTypeViewModel { public static Expression> FromSubmissionType { get { return submission => new SubmissionTypeViewModel { Id = submission.Id, Name = submission.Name }; } } public int Id { get; set; } public string Name { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/ViewModels/Submissions/TestRunDetailsViewModel.cs ================================================ namespace OJS.Web.Areas.Contests.ViewModels.Submissions { using System; using System.Linq.Expressions; using OJS.Common.Models; using OJS.Data.Models; public class TestRunDetailsViewModel { public static Expression> FromTestRun { get { return test => new TestRunDetailsViewModel { IsTrialTest = test.Test.IsTrialTest, CheckerComment = test.CheckerComment, ExpectedOutputFragment = test.ExpectedOutputFragment, UserOutputFragment = test.UserOutputFragment, ExecutionComment = test.ExecutionComment, Order = test.Test.OrderBy, ResultType = test.ResultType, TimeUsed = test.TimeUsed, MemoryUsed = test.MemoryUsed, Id = test.Id, TestId = test.TestId, }; } } public bool IsTrialTest { get; set; } public int Order { get; set; } public TestRunResultType ResultType { get; set; } public string ExecutionComment { get; set; } public string CheckerComment { get; set; } public string ExpectedOutputFragment { get; set; } public string UserOutputFragment { get; set; } public int TimeUsed { get; set; } public long MemoryUsed { get; set; } public int Id { get; set; } public int TestId { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Compete/Index.cshtml ================================================ @model OJS.Web.Areas.Contests.ViewModels.Participants.ParticipantViewModel @using Resource = Resources.Areas.Contests.Views.CompeteIndex; @using ContestResource = Resources.Areas.Contests.Views.ContestsDetails; @{ ViewBag.Title = Model.Contest.Name; } @section styles { @Styles.Render("~/Content/CodeMirror/codemirror", "~/Content/Contests/submission-page") }

@Model.Contest.Name

@{ var contestIsCompete = Model.ContestIsCompete && Model.Contest.EndTime.HasValue && Model.Contest.EndTime.Value > DateTime.Now; var contestIsPractice = !Model.ContestIsCompete && Model.Contest.PracticeEndTime.HasValue && Model.Contest.PracticeEndTime > DateTime.Now; }

@Resource.Submit_solution

@if (contestIsPractice) {
@Resource.Practice_end_time: @Model.Contest.PracticeEndTime.Value.ToString("hh:mm d.M.yyy")
}
@(Html.Kendo().TabStrip() .Name("SubmissionsTabStrip") .Items(tabstrip => { foreach (var problem in Model.Contest.Problems) { tabstrip.Add() .Text(problem.Name) .LoadContentFrom(Url.Action("Problem", new { id = problem.ProblemId, controller = ViewBag.CompeteType })); } if (!Model.Contest.Problems.Any()) { tabstrip.Add().Text(Resource.No_tasks).Content(Resource.No_tasks_added_yet); } if (User.IsAdmin()) { tabstrip.Add().Text(Resource.Add_task).Action("Create", "Problems", new { Area = "Administration", Model.Contest.Id }).HtmlAttributes(new { target = "_blank" }); } }) .Events(ev => { ev.ContentLoad("tabStripManager.onContentLoad"); ev.Activate("tabStripManager.tabSelected"); }) )
@{ string remainingTimeFormat = string.Format("\"
" + Resource.Remaining_time_format + "
\"", "", "", ""); } @section scripts { @Scripts.Render("~/bundles/codemirror") } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Compete/Register.cshtml ================================================ @model OJS.Web.Areas.Contests.ViewModels.Contests.ContestRegistrationViewModel @using Resource = Resources.Areas.Contests.Views.CompeteRegister @{ ViewBag.Title = Model.ContestName; }

@ViewBag.Title

@using (Html.BeginForm()) { @Html.HiddenFor(x => x.ContestId) if (Model.RequirePassword) {
@Html.LabelFor(x => x.Password)
@Html.PasswordFor(x => x.Password, new { @class = "form-control" }) @Html.ValidationMessageFor(x => x.Password)
} @Html.EditorFor(x => x.Questions) @Html.ValidationMessage("Questions") }
@section Scripts { @Scripts.Render("~/bundles/jqueryval") } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Contests/Details.cshtml ================================================ @using OJS.Common.Extensions; @using OJS.Common.Models; @using OJS.Web.Areas.Contests.ViewModels.Contests @using Resource = Resources.Areas.Contests.Views.ContestsDetails; @model ContestViewModel @{ ViewBag.Title = Model.Name; }

@ViewBag.Title

@Resource.Contest_details

@if (Model.CanBeCompeted && Model.EndTime != null) {
@Resource.Competition_active_until: @Model.EndTime.Value.ToString("hh:mm d.M.yyy")
} @if (Model.CanBePracticed && Model.PracticeEndTime != null) {
@Resource.Practice_active_until: @Model.PracticeEndTime.Value.ToString("hh:mm d.M.yyy")
} @if (!string.IsNullOrEmpty(Model.Description)) { @Model.Description } else {
@Resource.No_contest_description
}
@Resource.Allowed_languages: | @foreach (var submissionType in Model.AllowedSubmissionTypes) { @Html.ActionLink( submissionType.Name, "BySubmissionType", new { controller = "List", id = submissionType.Id, submissionTypeName = submissionType.Name.ToUrl() }) | }
@Resource.Contest_participants: @Model.OfficialParticipants
@Resource.Practice_participants: @Model.PracticeParticipants

@Resource.Problems

@if ((Model.CanBePracticed && !Model.HasPracticePassword) || (Model.CanBeCompeted && !Model.HasContestPassword)) { foreach (var problem in Model.Problems) {

@problem.Name

foreach (var resource in problem.Resources) { var resourceLink = string.IsNullOrWhiteSpace(resource.Link) ? Url.Action("DownloadResource", new { controller = "Practice", id = resource.ResourceId }) : resource.Link;

@if (resource.ProblemType == ProblemResourceType.ProblemDescription) { } else if (resource.ProblemType == ProblemResourceType.AuthorsSolution) { } else if (resource.ProblemType == ProblemResourceType.Video) { } else { } @resource.Name

} } } else {

@Resource.Problems_are_not_public

}
@if (Model.CanBeCompeted) { @Html.ActionLink(Resource.Compete, GlobalConstants.Index, new { controller = "Compete", id = Model.Id }, new { @class = "btn btn-sm btn-success" }) } @if (Model.CanBePracticed) { @Html.ActionLink(Resource.Practice, GlobalConstants.Index, new { controller = "Practice", id = Model.Id }, new { @class = "btn btn-sm btn-primary" }) } @if (User.IsAdmin()) { @Resource.Results @Resource.Full_results @Resource.Edit @Resource.Problems }
@if (User.Identity.IsAuthenticated) { Html.RenderPartial("_AllContestSubmissionsByUser"); } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/List/ByCategory.cshtml ================================================ @model OJS.Web.Areas.Contests.ViewModels.Contests.ContestCategoryViewModel @using Resource = Resources.Areas.Contests.Views.ListByCategory;

@Model.CategoryName

@if (Model.Contests.Any()) { @foreach (var contest in Model.Contests) { @if (User.IsAdmin()) { } }
@contest.Name @if (contest.CanBeCompeted) { @Html.RouteLink(Resource.Compete, "Contests_compete", new { id = contest.Id, action = GlobalConstants.Index }, new { @class = "btn btn-sm btn-success" }) if (contest.HasContestPassword) {
} if (contest.HasContestQuestions) {
} } @* TODO: Refactor these checks *@ @if (contest.CanBeCompeted || contest.ResultsArePubliclyVisible || User.IsAdmin()) {
@contest.OfficialParticipants } @if (contest.ResultsArePubliclyVisible || User.IsAdmin()) { @Resource.Results }
@if (contest.CanBePracticed) { @Html.RouteLink(Resource.Practice, "Contests_practice", new { id = contest.Id, action = GlobalConstants.Index }, new { @class = "btn btn-sm btn-primary" }) if (contest.HasPracticePassword) {
} if (contest.HasPracticeQuestions) {
}
@contest.PracticeParticipants }
@contest.ProblemsCount
} else { if (Model.SubCategories.Count() != 0) { @foreach (var subCategory in Model.SubCategories) { string url; url = string.Format(ViewBag.IsAjax ? "#!/List/ByCategory/{0}/{1}" : "/Contests/List/ByCategory/{0}/{1}", subCategory.Id, subCategory.NameUrl); }
@subCategory.Name
} else {

@Resource.Category_is_empty

} }
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/List/BySubmissionType.cshtml ================================================ @using OJS.Web.Areas.Contests.ViewModels.Contests @using Resource = Resources.Areas.Contests.Views.ListByType @model IEnumerable @{ ViewBag.Title = string.Format(Resource.Contests_with_allowed, ViewBag.SubmissionType); }

@ViewBag.Title

@(Html.Kendo() .Grid() .Name("Contests") .BindTo(Model) .Columns(col => { col.Bound(x => x.Name).ClientTemplate("#:Name#"); }).DataSource(data => { data.Ajax().ServerOperation(false).PageSize(10); }) .Pageable(page => page.Enabled(true)) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/List/Index.cshtml ================================================ @using OJS.Web.Areas.Contests.ViewModels.Contests @using Resource = Resources.Areas.Contests.Views.ListIndex @model IEnumerable @{ ViewBag.Title = Resource.Title; } @section Scripts { }

@ViewBag.Title

@(Html.Kendo().TreeView() .Name("contestsCategories") .DataTextField("Name") .DataSource(dataSource => dataSource .Model(x => { x.Id("Id"); x.HasChildren("HasChildren"); }) .Read(read => read .Action("ReadCategories", "List", new { area = "Contests" }))) .Events(x => { x.Select("expander.categorySelected"); x.DataBound("expander.onDataBound"); }) ) @if (User.IsAdmin()) {

@Resource.Categories »

@Resource.Hierarchy »

}
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/ParticipantsAnswers/Details.cshtml ================================================ @model int @using GeneralResource = Resources.Areas.Administration.AdministrationGeneral; @{ ViewBag.Title = "Информация за преподаватели"; const string ControllerName = "ParticipantsAnswers"; }

@ViewBag.Title

@(Html.Kendo() .Grid() .Name("DataGrid") .Columns(columns => { columns.Bound(x => x.ParticipantUsername).Width(180).Title("Потребител"); columns.Bound(x => x.ParticipantFullName).Width(240).Title("Пълно име"); columns.Bound(x => x.Answer).Title("Преподавател"); columns.Bound(x => x.Points).Title("Точки"); }) .ToolBar(toolbar => { //toolbar.Custom().Text(GeneralResource.Back_to_navigation).Action("Navigation", "Administration", new { Area = "" }).Name("custom-toolbar-button"); toolbar.Custom().Text(GeneralResource.Export_to_excel).Name("custom-toolbar-button").HtmlAttributes(new { id = "export" }).Url(Url.Action("ExportToExcel", ControllerName, new { page = 1, pageSize = "~", filter = "!!", sort = "~" })); }) .Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.Window(w => w.Title(ViewBag.Title)); }) .ColumnMenu() .Events(e => e.DataBound("onDataBound")) .Pageable(x => x.Refresh(true)) .Sortable(x => x.Enabled(true).AllowUnsort(false)) .Filterable(x => x.Enabled(true)) .Reorderable(x => x.Columns(true)) .Resizable(x => x.Columns(true)) .DataSource(datasource => datasource .Ajax() .ServerOperation(true) .Model(model => { model.Id(m => m.Id); }) .Sort(sort => sort.Add(x => x.Answer)) .PageSize(50) .Read(read => read.Action("ReadData", ControllerName, new { contestId = Model })) .Update(update => update.Action("Update", ControllerName)) .Events(ev => ev.Error("validateModelStateErrors")) ) ) @section scripts { } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Results/Full.cshtml ================================================ @model OJS.Web.Areas.Contests.ViewModels.Results.ContestFullResultsViewModel @using OJS.Common.Models @using Resource = Resources.Areas.Contests.Views.ResultsFull @using OJS.Web.Areas.Contests.Controllers @{ ViewBag.Title = string.Format(Resource.Title, Model.Name); ViewBag.Subtitle = string.Format(Resource.Subtitle, Model.Results.Count()); }

@ViewBag.Title

@ViewBag.Subtitle @Html.ActionLink(Resource.Public_results, "Simple", new { id = Model.Id, official = ViewBag.IsOfficial }, new { @class = "btn btn-primary" }) @if (User.IsAdmin() || User.IsInRole("KidsTeacher")) { @Html.ActionLink("Преподаватели", "Details", "ParticipantsAnswers", new { id = Model.Id }, new { @class = "btn btn-primary", style = "margin-left: 20px" }) }

@{Html.RenderAction("Stats", new { viewModel = Model });} @if (ViewBag.IsOfficial) {

@Ajax.ActionLink(Resource.Average_result_by_minutes, "StatsChart", new { contestId = Model.Id }, new AjaxOptions { UpdateTargetId = "StatsChartContainer", InsertionMode = InsertionMode.Replace })

}
@{ string isOfficial = ViewBag.IsOfficial ? CompeteController.CompeteUrl : CompeteController.PracticeUrl; int problemNumber = 0; } @foreach (var problem in Model.Problems) { problemNumber++; } @{ var count = 1; } @foreach (var participant in Model.Results) { @foreach (var problemResult in participant.ProblemResults) { } { count++; } }
No @Resource.User @Resource.UserFullName@problem.Name@Resource.Total
@count. @participant.ParticipantUsername @participant.ParticipantFullName @if (problemResult.BestSubmission == null) { @Resource.No_solution } else { @problemResult.BestSubmission.Points / @problemResult.MaximumPoints @problemResult.BestSubmission.SubmissionType
if (!problemResult.BestSubmission.IsCompiledSuccessfully) { @:Compilation failed! } foreach (var testRun in problemResult.BestSubmission.TestRuns) { var style = testRun.IsZeroTest ? "-ms-opacity: 0.3; opacity: 0.3" : string.Empty; switch (testRun.ResultType) { case TestRunResultType.CorrectAnswer:break; case TestRunResultType.WrongAnswer:break; case TestRunResultType.TimeLimit:break; case TestRunResultType.MemoryLimit:break; case TestRunResultType.RunTimeError:break; } } }
@participant.Total
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Results/Simple.cshtml ================================================ @model OJS.Web.Areas.Contests.ViewModels.Results.ContestResultsViewModel @using OJS.Web.Areas.Contests.Controllers @using OJS.Web.ViewModels.Shared @using Resource = Resources.Areas.Contests.Views.ResultsSimple @{ ViewBag.Title = string.Format(Resource.Title, Model.Name); ViewBag.Subtitle = string.Format(Resource.Subtitle, Model.TotalResults); string isOfficial = ViewBag.IsOfficial ? CompeteController.CompeteUrl : CompeteController.PracticeUrl; } @section Styles { }

@ViewBag.Title

@ViewBag.Subtitle @if (User.IsAdmin()) { @Html.ActionLink(Resource.Detailed_results, "Full", new { id = Model.Id, official = ViewBag.IsOfficial }, new { @class = "btn btn-primary" }) } @if (User.IsAdmin() || User.IsInRole("KidsTeacher")) { @Html.ActionLink("Преподаватели", "Details", "ParticipantsAnswers", new { id = Model.Id }, new { @class = "btn btn-primary", style = "margin-left: 20px" }) }

@if (Model.AllPages > 1) { @Html.Partial("_Pagination", new PaginationViewModel { AllPages = Model.AllPages, CurrentPage = Model.CurrentPage, Url = "/Contests/" + isOfficial + "/Results/Simple/" + Model.Id + "?page=" }) } @{ int problemCounter = 0; bool displayLink = Model.ContestCanBeCompeted || Model.ContestCanBePracticed; var contestLink = Model.ContestCanBeCompeted ? "Compete" : "Practice"; } @foreach (var problem in Model.Problems) { if (problem.ShowResults || (Model.ContestCanBePracticed && !ViewBag.IsOfficial) || User.IsAdmin()) { } } @{ var results = Model.Results.ToList(); } @for (int i = 0; i < results.Count; i++) { var participant = results[i]; string className = User.Identity.Name == participant.ParticipantUsername ? "success" : string.Empty; @foreach (var participantResult in participant.ProblemResults) { if (User.IsAdmin()) { if (participantResult.BestSubmission == null) { } else { } } else if (participantResult.ShowResult) { if (participantResult.BestSubmission == null) { } else { } } } @if (User.IsAdmin()) { } else { } }
@Resource.User @Resource.UserFullName @if (displayLink) { @problem.Name problemCounter++; } else { @problem.Name } @Resource.Total
@((Model.CurrentPage - 1) * ResultsController.ResultsPageSize + i + 1) @participant.ParticipantUsername @participant.ParticipantFullName0@participantResult.BestSubmission.Points0@participantResult.BestSubmission.Points@participant.AdminTotal@participant.Total
@if (Model.AllPages > 1) { @Html.Partial("_Pagination", new PaginationViewModel { AllPages = Model.AllPages, CurrentPage = Model.CurrentPage, Url = "/Contests/" + isOfficial + "/Results/Simple/" + Model.Id + "?page=" }) } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Results/_StatsChartPartial.cshtml ================================================ @using Resource = Resources.Areas.Contests.Views.Partials.StatsPartial; @model int @(Html.Kendo().Chart() .Name("AveragePointsChart") .HtmlAttributes(new { style = "height: 400px;" }) .Title(Resource.Points_label) .Legend(legend => legend.Visible(false)) .DataSource(ds => ds.Read(read => read.Action("GetParticipantsAveragePoints", "Results", new { id = Model }))) .Series(series => { series.Line(model => model.AverageResult).Name(Resource.Points_label).Tooltip(x => x.Format("0.000")); }) .CategoryAxis(axis => axis .Categories(model => model.DisplayValue) .Labels(labels => labels.Rotation(-90)) ) .Tooltip(tooltip => tooltip .Visible(true) .Shared(true) ) ) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Results/_StatsPartial.cshtml ================================================ @using Resource = Resources.Areas.Contests.Views.Partials.StatsPartial; @model OJS.Web.Areas.Contests.ViewModels.Contests.ContestStatsViewModel

@Resource.General_statistics

@Resource.Zero_points @Resource.Max_points @Resource.Average_result
@Model.MinResultsCount @Resource.Contestants - (@Model.MinResultsPercent.ToString("0.00%")) @Model.MaxResultsCount @Resource.Contestants - (@Model.MaxResultsPercent.ToString("0.00%")) @Model.AverageResult.ToString("0.000") @Resource.Points

@Resource.Participants_by_points

@foreach (var item in Model.StatsByPointsRange) { } @foreach (var item in Model.StatsByPointsRange) { }
@item.PointsFrom - @item.PointsTo @Resource.Points
@item.Participants @Resource.Contestants - (@item.PercentOfAllParticipants.ToString("0.00%"))

@Resource.Max_result_for_task

@foreach (var item in Model.StatsByProblem) { } @foreach (var item in Model.StatsByProblem) { }
@item.Name - @item.MaxPossiblePoints @Resource.Max_points_label
@item.MaxResultsCount @Resource.Contestants - (@item.MaxResultsPercent.ToString("0.##%"))

================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Shared/_AllContestSubmissionsByUser.cshtml ================================================ @using OJS.Web.Areas.Contests.ViewModels.Contests @using OJS.Web.Areas.Contests.ViewModels.Problems @using OJS.Web.Areas.Contests.ViewModels.Submissions @using Resource = Resources.Areas.Contests; @model ContestViewModel

@Resource.Shared.ContestsAllContestSubmissionsByUser.User_submission

@{ var clientTemplate = "#= IsCalculated ? " + "IsCompiledSuccessfully ? " + "displayTestRuns(TestRuns).concat(" + " SubmissionPoints.toString().concat(' / ').concat(MaximumPoints))" + " : '" + Resource.Shared.ContestsAllContestSubmissionsByUser.Compile_time_error + "' " + ": '" + Resource.Shared.ContestsAllContestSubmissionsByUser.Not_processed + "' #"; }
@(Html.Kendo() .Grid() .Name("UserSubmissionsGrid") .Columns(col => { col.ForeignKey("ProblemId", (IEnumerable)ViewBag.ContestProblems, "ProblemId", "Name"); col.Bound(model => model.SubmissionPoints).ClientTemplate(clientTemplate); col.Template(@) .Title(Resource.ViewModels.SubmissionsViewModels.Time_and_memory) .ClientTemplate("#= IsCalculated && IsCompiledSuccessfully ? displayMaximumValues(MaximumMemoryUsed, MaximumTimeUsed," + "'" + Resource.Shared.ContestsAllContestSubmissionsByUser.Memory + "','" + Resource.Shared.ContestsAllContestSubmissionsByUser.Time + "'" + ") : '---' #"); col.Bound(model => model.IsOfficial).ClientTemplate("#: IsOfficial ? '" + Resource.Shared.ContestsAllContestSubmissionsByUser.Compete + "' : '" + Resource.Shared.ContestsAllContestSubmissionsByUser.Practice + "'#"); col.Bound(model => model.SubmissionDate).Width(300).ClientTemplate("#= kendo.format('{0:HH:mm:ss dd.MM.yyyy}', SubmissionDate) # " + Resource.Shared.ContestsAllContestSubmissionsByUser.View + "
"); }) .DataSource(data => { data.Ajax() .Sort(sort => sort.Add("SubmissionDate").Descending()) .Read(read => read.Action("UserSubmissions", "Contests", new { contestId = Model.Id })) .PageSize(10); }) .Sortable(sort => { sort.Enabled(true); }) .Filterable(filter => { filter.Enabled(true); }) .Pageable(page => { page.Info(false); page.Refresh(true); }) .HtmlAttributes(new { @class = "problem_submit_grid" }) )
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Shared/_ProblemPartial.cshtml ================================================ @using OJS.Web.Areas.Contests.ViewModels.Contests @using OJS.Web.Areas.Contests.ViewModels.Submissions @using OJS.Web.Areas.Contests.ViewModels.Results @using OJS.Common.Models; @using Resource = Resources.Areas.Contests.Shared.ContestsProblemPartial @model ContestProblemViewModel

@Model.Name

@if (User.IsAdmin()) {
@Html.ActionLink(Resource.Participants_admin_button, "Contest", "Participants", new { Area = "Administration", Id = Model.ContestId }, new { @class = "btn btn-sm btn-primary" }) @Html.ActionLink(Resource.Tests_admin_button, "Problem", "Tests", new { Area = "Administration", Id = Model.ProblemId }, new { @class = "btn btn-sm btn-primary" }) @Html.ActionLink(Resource.Change_admin_button, "Edit", "Problems", new { Area = "Administration", Id = Model.ProblemId }, new { @class = "btn btn-sm btn-primary" }) @Html.ActionLink(Resource.Delete_admin_button, "Delete", "Problems", new { Area = "Administration", Id = Model.ProblemId }, new { @class = "btn btn-sm btn-primary" })
}
@{ var className = Model.ShowResults ? "col-lg-8" : "col-lg-12"; }
@using (Ajax.BeginForm("Submit", new { controller = ViewBag.CompeteType, id = Model.ContestId }, new AjaxOptions { OnSuccess = "messageNotifier.notifySuccess", OnFailure = "messageNotifier.notifyFailure", OnBegin = "validateSubmit.content" }, new { id = "problem_" + Model.ProblemId })) { @Html.HiddenFor(x => x.ProblemId)
@(Html.Kendo().Upload().Name("File").Multiple(false).ShowFileList(true).HtmlAttributes(new { id = "file-problem-" + Model.ProblemId }))
@Resource.Allowed_working_time: @string.Format("{0:0.00}", Model.TimeLimit) sec.
@Resource.Allowed_memory: @string.Format("{0:0.00}", Model.MemoryLimit) MB
@if (Model.FileSizeLimit.HasValue) { Size limit: @(string.Format("{0:0.00}", Model.FileSizeLimit.Value)) @:KB
} Checker: @Model.CheckerName @if (!string.IsNullOrWhiteSpace(Model.CheckerDescription)) { @:(@Model.CheckerDescription) }
@(Html.Kendo().DropDownList() .Name("SubmissionTypeId") .DataTextField("Text") .DataValueField("Value") .Events(ev => ev.Change("onSubmissionTypeChange").DataBound("onSubmissionTypeChange")) .DataSource(data => data.Read("GetAllowedSubmissionTypes", ViewBag.CompeteType, new { id = Model.ContestId })) .HtmlAttributes(new { id = "dropdown_" + Model.ProblemId }))
}
@{ var participantRowTemplate = "#= ParticipantName === '" + User.Identity.Name + "' ? \"\" : \"\"#" + "#:ParticipantName#" + "#:Result# / #:MaximumPoints#"; } @if (Model.ShowResults) {
@(Html.Kendo().Grid() .Name("ContestResults_" + Model.ProblemId) .ToolBar(tool => tool.Template(Resource.Problem_results)) .Columns(col => { col.Bound(x => x.ParticipantName).Width(100); col.Bound(x => x.Result).Width(80); }) .DataSource(data => { data.Ajax() .Sort(sort => { sort.Add(x => x.Result).Descending(); sort.Add(x => x.ParticipantName).Ascending(); }) .Read("ByProblem", "Results", new { official = ViewBag.IsOfficial, id = Model.ProblemId }) .PageSize(8); }) .Filterable(x => x.Enabled(false)) .Pageable(x => { x.ButtonCount(4); x.Refresh(true); x.Info(false); }) .ClientRowTemplate(participantRowTemplate) .TableHtmlAttributes(new { @class = "table table-striped table-bordered" }) .HtmlAttributes(new { @class = "problem_submit_grid" }) )
}
@{ var clientTemplate = "#= IsCalculated ? IsCompiledSuccessfully ? displayTestRuns(TestRuns).concat(" + " SubmissionPoints.toString().concat(' / ').concat(MaximumPoints)) : " + "'" + Resource.Compile_time_error + "'" + ":" + "'" + Resource.Not_processed + "'" + "#"; } @if (Model.ShowResults) {
@(Html.Kendo() .Grid() .Name("Submissions_" + Model.ProblemId) .ToolBar(tool => { tool.Template(Resource.Submissions); }) .DataSource(data => { data.Ajax() .Sort(sort => sort.Add("SubmissionDate").Descending()) .Read(read => read.Action("ReadSubmissionResults", ViewBag.CompeteType, new { id = Model.ProblemId })) .PageSize(10); }) .Pageable(page => { page.Info(false); page.Refresh(true); }) .Columns(col => { col.Bound(model => model.SubmissionPoints).ClientTemplate(clientTemplate); col.Template(@) .Title(Resource.Time_and_memory) .ClientTemplate("#= IsCalculated && IsCompiledSuccessfully ? displayMaximumValues(MaximumMemoryUsed, MaximumTimeUsed, '" + Resource.Memory + "','" + Resource.Time + "') : '---' #"); col.Bound(model => model.SubmissionDate).Width(300).ClientTemplate("#= kendo.format('{0:HH:mm:ss dd.MM.yyyy}', SubmissionDate) # " + Resource.Details + "
"); }).HtmlAttributes(new { @class = "problem_submit_grid" }) )
} else { } @Html.Kendo().Tooltip().For("#checkers-tooltip").ContentTemplateId("checkers-template").Position(TooltipPosition.Top).Width(700) ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Submissions/View.cshtml ================================================ @using OJS.Common.Extensions @using OJS.Common.Models @using Resource = Resources.Areas.Contests.Views.SubmissionsView; @model OJS.Web.Areas.Contests.ViewModels.Submissions.SubmissionDetailsViewModel @{ ViewBag.Title = string.Format(Resource.Title, Model.Id, Model.UserName, Model.ProblemName); } @section styles { @Styles.Render("~/Content/CodeMirror/codemirror") @Styles.Render("~/Content/CodeMirror/codemirrormerge") } @section scripts { @Scripts.Render("~/bundles/codemirror") @Scripts.Render("~/bundles/codemirrormerge") }

@ViewBag.Title

@Resource.View_code @if (User.IsAdmin()) { @Resource.Update @Resource.Delete @Resource.Tests @Resource.Authors_profile @Resource.Retest
if (!string.IsNullOrWhiteSpace(Model.ProcessingComment)) {

@Resource.Execution_result:

@Model.ProcessingComment
} }
@if (Model.IsDeleted) {
@Resource.Submission_is_deleted
} @if (!Model.Processed) { if (Model.Processing) {
@Resource.Submission_is_processing
} else {
@Resource.Submission_in_queue
} } else { if (!Model.IsCompiledSuccessfully) {
@Resource.Compile_time_error_occured
} else if (!Model.ShowResults) // Inform user that compilation is successful when not showing him all the test runs {

@Resource.Compiled_successfully

} if (!string.IsNullOrWhiteSpace(Model.CompilerComment)) {

@Resource.Compilation_result:

@Model.CompilerComment
} } @if (Model.Processed && (Model.ShowResults || User.IsAdmin())) { foreach (var testResult in Model.TestRuns.OrderByDescending(x => x.IsTrialTest).ThenBy(x => x.Order)) { var className = string.Empty; var testResultText = string.Empty; if (testResult.ResultType == TestRunResultType.CorrectAnswer) { className = "text-success"; testResultText = Resource.Answer_correct; } else if (testResult.ResultType == TestRunResultType.WrongAnswer) { className = "text-danger"; testResultText = Resource.Answer_incorrect; } else if (testResult.ResultType == TestRunResultType.MemoryLimit) { className = "text-danger"; testResultText = Resource.Memory_limit; } else if (testResult.ResultType == TestRunResultType.TimeLimit) { className = "text-danger"; testResultText = Resource.Time_limit; } else if (testResult.ResultType == TestRunResultType.RunTimeError) { className = "text-danger"; testResultText = Resource.Runtime_error; }

@if (testResult.IsTrialTest) { @:@string.Format("{0}{1}", Resource.Zero_test, testResult.Order) } else { @:@string.Format("{0}{1}", Resource.Test, testResult.Order) } (@testResultText) @if (User.IsAdmin()) { @string.Format("{0}{1}", Resource.Run, testResult.Id) @string.Format("{0}{1}", Resource.Test, testResult.TestId) }

if (testResult.IsTrialTest) {
@Resource.Zero_tests_not_included_in_result
} if (!string.IsNullOrWhiteSpace(testResult.ExecutionComment) && (testResult.IsTrialTest || User.IsAdmin() || Model.ShowDetailedFeedback)) // Temporally execution comments are visible only for administrators { var executionComment = testResult.ExecutionComment; if (!User.IsAdmin() && !Model.ShowDetailedFeedback) { if (Model.SubmissionType.CompilerType == CompilerType.CSharp) { // The following code will hide the exception message from user when the code is written in C# var errorParts = executionComment.Split(':'); if (errorParts.Length >= 2) { executionComment = errorParts[0] + ":" + errorParts[1]; } else { executionComment = executionComment.MaxLengthWithEllipsis(37); } } else // Other language { executionComment = executionComment.MaxLengthWithEllipsis(64); } }
@executionComment
} if (!string.IsNullOrWhiteSpace(testResult.CheckerComment) || testResult.ExpectedOutputFragment != null || testResult.UserOutputFragment != null) { if (testResult.IsTrialTest || User.IsAdmin() || Model.ShowDetailedFeedback) {
@if (!string.IsNullOrWhiteSpace(testResult.CheckerComment)) {
@testResult.CheckerComment
} @if (testResult.ExpectedOutputFragment != null || testResult.UserOutputFragment != null) {
Expected output:
Your output:
}
} }
@Resource.Time_used: @string.Format("{0:0.000}", testResult.TimeUsed / 1000.0) s
@Resource.Memory_used: @string.Format("{0:0.00}", testResult.MemoryUsed / 1024.0 / 1024.0) MB
} }

@Resource.Source_code

@if (Model.IsBinaryFile) { Download binary file } else { } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Contests/Views/Web.Config ================================================
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/Controllers/ProfileController.cs ================================================ namespace OJS.Web.Areas.Users.Controllers { using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using OJS.Data; using OJS.Web.Areas.Users.ViewModels; using OJS.Web.Controllers; using Resource = Resources.Areas.Users.Views.Profile; public class ProfileController : BaseController { public ProfileController(IOjsData data) : base(data) { } public ActionResult Index(string id) { if (string.IsNullOrEmpty(id)) { id = this.User.Identity.Name; } var profile = this.Data.Users.GetByUsername(id); if (profile == null) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.ProfileIndex.Not_found); } var userSettingsViewModel = new UserProfileViewModel(profile) { Participations = this.Data.Participants.All() .Where(x => x.UserId == profile.Id) .GroupBy(x => x.Contest) .Select(c => new UserParticipationViewModel { ContestId = c.Key.Id, ContestName = c.Key.Name, RegistrationTime = c.Key.CreatedOn, ContestMaximumPoints = c.Key.Problems.Where(x => !x.IsDeleted).Sum(pr => pr.MaximumPoints), CompeteResult = c.Where(x => x.IsOfficial) .Select(p => p.Submissions .Where(x => !x.IsDeleted) .GroupBy(s => s.ProblemId) .Sum(x => x.Max(z => z.Points))) .FirstOrDefault(), PracticeResult = c.Where(x => !x.IsOfficial) .Select(p => p.Submissions .Where(x => !x.IsDeleted) .GroupBy(s => s.ProblemId) .Sum(x => x.Max(z => z.Points))) .FirstOrDefault() }) .OrderByDescending(x => x.RegistrationTime) .ToList() }; return this.View(userSettingsViewModel); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/Controllers/SettingsController.cs ================================================ namespace OJS.Web.Areas.Users.Controllers { using System.Web.Mvc; using OJS.Common; using OJS.Data; using OJS.Data.Models; using OJS.Web.Areas.Users.ViewModels; using OJS.Web.Controllers; using Resource = Resources.Areas.Users.Views.Settings.SettingsIndex; [Authorize] public class SettingsController : BaseController { public SettingsController(IOjsData data) : base(data) { } [HttpGet] public ActionResult Index() { string currentUserName = this.User.Identity.Name; var profile = this.Data.Users.GetByUsername(currentUserName); var userProfileViewModel = new UserSettingsViewModel(profile); return this.View(userProfileViewModel); } [HttpPost] public ActionResult Index(UserSettingsViewModel settings) { if (this.ModelState.IsValid) { var user = this.Data.Users.GetByUsername(this.User.Identity.Name); this.UpdateUserSettings(user.UserSettings, settings); this.Data.SaveChanges(); this.TempData.Add(GlobalConstants.InfoMessage, Resource.Settings_were_saved); return this.RedirectToAction(GlobalConstants.Index, new { controller = "Profile", area = "Users" }); } return this.View(settings); } private void UpdateUserSettings(UserSettings model, UserSettingsViewModel viewModel) { model.FirstName = viewModel.FirstName; model.LastName = viewModel.LastName; model.City = viewModel.City; model.DateOfBirth = viewModel.DateOfBirth; model.Company = viewModel.Company; model.JobTitle = viewModel.JobTitle; model.EducationalInstitution = viewModel.EducationalInstitution; model.FacultyNumber = viewModel.FacultyNumber; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/Helpers/NullDisplayFormatAttribute.cs ================================================ namespace OJS.Web.Areas.Users.Helpers { using System.ComponentModel.DataAnnotations; using Resource = Resources.Areas.Users.ViewModels.ProfileViewModels; public class NullDisplayFormatAttribute : DisplayFormatAttribute { public NullDisplayFormatAttribute() { this.NullDisplayText = Resource.No_information; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/UsersAreaRegistration.cs ================================================ namespace OJS.Web.Areas.Users { using System.Web.Mvc; using OJS.Common; public class UsersAreaRegistration : AreaRegistration { public override string AreaName => "Users"; public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Users_current_user_profile", "Users/Profile/{action}", new { controller = "Profile", action = GlobalConstants.Index, id = UrlParameter.Optional }); context.MapRoute( "Users_settings", "Users/Settings/{action}", new { controller = "Settings", action = GlobalConstants.Index, id = UrlParameter.Optional }); context.MapRoute( "Users_profile", "Users/{id}", new { controller = "Profile", action = GlobalConstants.Index, id = UrlParameter.Optional }); // context.MapRoute( // "Users_default", // "Users/{controller}/{action}/{id}", // new { action = "Index", id = UrlParameter.Optional }); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/ViewModels/UserParticipationViewModel.cs ================================================ namespace OJS.Web.Areas.Users.ViewModels { using System; public class UserParticipationViewModel { public int ContestId { get; set; } public string ContestName { get; set; } public int? CompeteResult { get; set; } public int? PracticeResult { get; set; } public int? ContestMaximumPoints { get; set; } public DateTime RegistrationTime { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/ViewModels/UserProfileViewModel.cs ================================================ namespace OJS.Web.Areas.Users.ViewModels { using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using OJS.Common; using OJS.Data.Models; using OJS.Web.Areas.Users.Helpers; using Resource = Resources.Areas.Users.ViewModels.ProfileViewModels; public class UserProfileViewModel { public UserProfileViewModel(UserProfile profile) { this.Id = profile.Id; this.Username = profile.UserName; this.Email = profile.Email; this.FirstName = profile.UserSettings.FirstName; this.LastName = profile.UserSettings.LastName; this.City = profile.UserSettings.City; this.Age = profile.UserSettings.Age; this.Participations = new HashSet(); } public string Id { get; set; } public string Username { get; set; } public string Email { get; set; } [MaxLength( GlobalConstants.FirstNameMaxLength, ErrorMessageResourceName = "First_name_too_long", ErrorMessageResourceType = typeof(Resource))] [Display(Name = "First_name", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public string FirstName { get; set; } [MaxLength( GlobalConstants.LastNameMaxLength, ErrorMessage = "Family_name_too_long", ErrorMessageResourceType = typeof(Resource))] [Display( Name = "Family_name", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public string LastName { get; set; } [MaxLength( GlobalConstants.CityNameMaxLength, ErrorMessage = "City_too_long", ErrorMessageResourceType = typeof(Resource))] [Display(Name = "City", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public string City { get; set; } [Display(Name = "Age", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public byte? Age { get; set; } public IEnumerable Participations { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/ViewModels/UserSettingsViewModel.cs ================================================ namespace OJS.Web.Areas.Users.ViewModels { using System; using System.ComponentModel.DataAnnotations; using OJS.Common; using OJS.Data.Models; using OJS.Web.Areas.Users.Helpers; using Resource = Resources.Areas.Users.ViewModels.ProfileViewModels; public class UserSettingsViewModel { public UserSettingsViewModel() { } public UserSettingsViewModel(UserProfile profile) { this.Username = profile.UserName; this.Email = profile.Email; this.FirstName = profile.UserSettings.FirstName; this.LastName = profile.UserSettings.LastName; this.DateOfBirth = profile.UserSettings.DateOfBirth; this.City = profile.UserSettings.City; this.EducationalInstitution = profile.UserSettings.EducationalInstitution; this.FacultyNumber = profile.UserSettings.FacultyNumber; this.Company = profile.UserSettings.Company; this.JobTitle = profile.UserSettings.JobTitle; this.Age = profile.UserSettings.Age; } public string Username { get; set; } [Display(Name = "Email", ResourceType = typeof(Resource))] [MaxLength(GlobalConstants.EmailMaxLength)] [DataType(DataType.EmailAddress)] public string Email { get; set; } [MaxLength( GlobalConstants.FirstNameMaxLength, ErrorMessageResourceName = "First_name_too_long", ErrorMessageResourceType = typeof(Resource))] [Display(Name = "First_name", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public string FirstName { get; set; } [MaxLength( GlobalConstants.LastNameMaxLength, ErrorMessageResourceName = "Family_name_too_long", ErrorMessageResourceType = typeof(Resource))] [Display(Name = "Family_name", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public string LastName { get; set; } [Display(Name = "Date_of_birth", ResourceType = typeof(Resource))] [NullDisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ConvertEmptyStringToNull = true)] [DataType(DataType.Date)] public DateTime? DateOfBirth { get; set; } [MaxLength( GlobalConstants.CityNameMaxLength, ErrorMessageResourceName = "City_too_long", ErrorMessageResourceType = typeof(Resource))] [Display(Name = "City", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public string City { get; set; } [MaxLength( GlobalConstants.EducationalInstitutionMaxLength, ErrorMessageResourceName = "Education_too_long", ErrorMessageResourceType = typeof(Resource))] [Display(Name = "Education_institution", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public string EducationalInstitution { get; set; } [MaxLength( GlobalConstants.FacultyNumberMaxLength, ErrorMessageResourceName = "Faculty_number_too_long", ErrorMessageResourceType = typeof(Resource))] [Display(Name = "Faculty_number", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public string FacultyNumber { get; set; } [MaxLength( GlobalConstants.CompanyNameMaxLength, ErrorMessageResourceName = "Company_too_long", ErrorMessageResourceType = typeof(Resource))] [Display(Name = "Company", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public string Company { get; set; } [MaxLength( GlobalConstants.JobTitleMaxLenth, ErrorMessageResourceName = "Job_title_too_long", ErrorMessageResourceType = typeof(Resource))] [Display(Name = "Job_title", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] public string JobTitle { get; set; } [Display(Name = "Age", ResourceType = typeof(Resource))] [NullDisplayFormat(ConvertEmptyStringToNull = true)] [Range(0, byte.MaxValue)] public byte? Age { get; set; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/Views/Profile/Index.cshtml ================================================ @model OJS.Web.Areas.Users.ViewModels.UserProfileViewModel @using Resource = Resources.Areas.Users.Views.Profile.ProfileIndex @{ ViewBag.Title = string.Format(Resource.Title, Model.Username); }
@Html.Partial("_ProfileInfo", Model)
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/Views/Settings/Index.cshtml ================================================ @model OJS.Web.Areas.Users.ViewModels.UserSettingsViewModel @using Resource = Resources.Areas.Users.Views.Settings.SettingsIndex; @{ ViewBag.Title = Resource.Title; }
@if (Model == null) {
@Resource.Not_logged_in
} else {

@Resource.Settings

using (Html.BeginForm()) {
@Resource.Username
@User.Identity.Name

@Resource.Password
@Html.ActionLink(Resource.Change_password, "Manage", "Account", new { area = string.Empty }, null)

@Resource.Email
@Model.Email @Html.ActionLink(Resource.Change_email, "ChangeEmail", "Account", new { area = string.Empty}, null)

@Html.LabelFor(m => m.FirstName, new { @class = "text-primary loud" })
@Html.EditorFor(m => m.FirstName) @Html.ValidationMessageFor(m => m.FirstName)

@Html.LabelFor(m => m.LastName, new { @class = "text-primary loud" })
@Html.EditorFor(m => m.LastName) @Html.ValidationMessageFor(m => m.LastName)

@Html.LabelFor(m => m.DateOfBirth, new { @class = "text-primary loud" })
@(Html.Kendo().DatePicker() .Name("DateOfBirth") .Start(CalendarView.Decade) .Value(Model.DateOfBirth) .HtmlAttributes(new { style = "width:175px; margin-bottom: 3px" }) ) @Html.ValidationMessageFor(m => m.DateOfBirth)

@Html.LabelFor(m => m.City, new { @class = "text-primary loud" })
@Html.EditorFor(m => m.City) @Html.ValidationMessageFor(m => m.City)

@Html.LabelFor(m => m.EducationalInstitution, new { @class = "text-primary loud" })
@Html.EditorFor(m => m.EducationalInstitution) @Html.ValidationMessageFor(m => m.EducationalInstitution)

@Html.LabelFor(m => m.FacultyNumber, new { @class = "text-primary loud" })
@Html.EditorFor(m => m.FacultyNumber) @Html.ValidationMessageFor(m => m.FacultyNumber)

@Html.LabelFor(m => m.Company, new { @class = "text-primary loud" })
@Html.EditorFor(m => m.Company) @Html.ValidationMessageFor(m => m.Company)

@Html.LabelFor(m => m.JobTitle, new { @class = "text-primary loud" })
@Html.EditorFor(m => m.JobTitle) @Html.ValidationMessageFor(m => m.JobTitle)

} }
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/Views/Shared/_ProfileInfo.cshtml ================================================ @using OJS.Web.Areas.Users.ViewModels @using Resource = Resources.Areas.Users.Shared.ProfileProfileInfo; @model UserProfileViewModel

@string.Format(Resource.Profile_title, Model.Username) @if (!string.IsNullOrEmpty(Model.FirstName) || !string.IsNullOrEmpty(Model.LastName)) { (@Model.FirstName @Model.LastName) }

@if (User.IsAdmin()) {
Id: @Model.Id
E-mail: @Model.Email
}
@if (Model.Age != null) {
@Resource.Age: @Model.Age
} @if (!string.IsNullOrEmpty(Model.City)) {
@Resource.City: @Model.City
}
@if (User.Identity.Name == Model.Username) { }

@if (User.IsAdmin() || User.Identity.Name == Model.Username) {

Решения

@{Html.RenderPartial("_AdvancedSubmissionsGridPartial", Model.Id);}

}

@Resource.Participations

@if (User.Identity.Name == Model.Username || User.IsAdmin()) { } @foreach (var result in Model.Participations) { @if (User.Identity.Name == Model.Username || User.IsAdmin()) { } }
@Resource.Contest @Resource.Results
@result.ContestName @Resource.Compete: @result.CompeteResult / @result.ContestMaximumPoints.GetValueOrDefault()
@Resource.Practice: @result.PracticeResult / @result.ContestMaximumPoints.GetValueOrDefault()
================================================ FILE: Open Judge System/Web/OJS.Web/Areas/Users/Views/Web.Config ================================================ 
================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/addon/merge.css ================================================ .CodeMirror-merge { position: relative; border: 1px solid #ddd; white-space: pre; } .CodeMirror-merge, .CodeMirror-merge .CodeMirror { height: 350px; } .CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; } .CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; } .CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; } .CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; } .CodeMirror-merge-pane { display: inline-block; white-space: normal; vertical-align: top; } .CodeMirror-merge-pane-rightmost { position: absolute; right: 0px; z-index: 1; } .CodeMirror-merge-gap { z-index: 2; display: inline-block; height: 100%; -moz-box-sizing: border-box; box-sizing: border-box; overflow: hidden; border-left: 1px solid #ddd; border-right: 1px solid #ddd; position: relative; background: #f8f8f8; } .CodeMirror-merge-scrolllock-wrap { position: absolute; bottom: 0; left: 50%; } .CodeMirror-merge-scrolllock { position: relative; left: -50%; cursor: pointer; color: #555; line-height: 1; } .CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right { position: absolute; left: 0; top: 0; right: 0; bottom: 0; line-height: 1; } .CodeMirror-merge-copy { position: absolute; cursor: pointer; color: #44c; } .CodeMirror-merge-copy-reverse { position: absolute; cursor: pointer; color: #44c; } .CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; } .CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; } .CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==); background-position: bottom left; background-repeat: repeat-x; } .CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==); background-position: bottom left; background-repeat: repeat-x; } .CodeMirror-merge-r-chunk { background: #ffffe0; } .CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; } .CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; } .CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; } .CodeMirror-merge-l-chunk { background: #eef; } .CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; } .CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; } .CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; } .CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; } .CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; } .CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; } .CodeMirror-merge-collapsed-widget:before { content: "(...)"; } .CodeMirror-merge-collapsed-widget { cursor: pointer; color: #88b; background: #eef; border: 1px solid #ddf; font-size: 90%; padding: 0 3px; border-radius: 4px; } .CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/codemirror.css ================================================ /* BASICS */ .CodeMirror { /* Set height, width, borders, and global font properties here */ font-family: monospace; height: 300px; } .CodeMirror-scroll { /* Set scrolling behaviour here */ overflow: auto; } /* PADDING */ .CodeMirror-lines { padding: 4px 0; /* Vertical padding around content */ } .CodeMirror pre { padding: 0 4px; /* Horizontal padding of content */ } .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { background-color: white; /* The little square between H and V scrollbars */ } /* GUTTER */ .CodeMirror-gutters { border-right: 1px solid #ddd; background-color: #f7f7f7; white-space: nowrap; } .CodeMirror-linenumbers {} .CodeMirror-linenumber { padding: 0 3px 0 5px; min-width: 20px; text-align: right; color: #999; -moz-box-sizing: content-box; box-sizing: content-box; } /* CURSOR */ .CodeMirror div.CodeMirror-cursor { border-left: 1px solid black; z-index: 3; } /* Shown when moving in bi-directional text */ .CodeMirror div.CodeMirror-secondarycursor { border-left: 1px solid silver; } .CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor { width: auto; border: 0; background: #7e7; z-index: 1; } /* Can style cursor different in overwrite (non-insert) mode */ .CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {} .cm-tab { display: inline-block; } .CodeMirror-ruler { border-left: 1px solid #ccc; position: absolute; } /* DEFAULT THEME */ .cm-s-default .cm-keyword {color: #708;} .cm-s-default .cm-atom {color: #219;} .cm-s-default .cm-number {color: #164;} .cm-s-default .cm-def {color: #00f;} .cm-s-default .cm-variable {color: black;} .cm-s-default .cm-variable-2 {color: #05a;} .cm-s-default .cm-variable-3 {color: #085;} .cm-s-default .cm-property {color: black;} .cm-s-default .cm-operator {color: black;} .cm-s-default .cm-comment {color: #a50;} .cm-s-default .cm-string {color: #a11;} .cm-s-default .cm-string-2 {color: #f50;} .cm-s-default .cm-meta {color: #555;} .cm-s-default .cm-qualifier {color: #555;} .cm-s-default .cm-builtin {color: #30a;} .cm-s-default .cm-bracket {color: #997;} .cm-s-default .cm-tag {color: #170;} .cm-s-default .cm-attribute {color: #00c;} .cm-s-default .cm-header {color: blue;} .cm-s-default .cm-quote {color: #090;} .cm-s-default .cm-hr {color: #999;} .cm-s-default .cm-link {color: #00c;} .cm-negative {color: #d44;} .cm-positive {color: #292;} .cm-header, .cm-strong {font-weight: bold;} .cm-em {font-style: italic;} .cm-link {text-decoration: underline;} .cm-s-default .cm-error {color: #f00;} .cm-invalidchar {color: #f00;} div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} .CodeMirror-activeline-background {background: #e8f2ff;} /* STOP */ /* The rest of this file contains styles related to the mechanics of the editor. You probably shouldn't touch them. */ .CodeMirror { line-height: 1; position: relative; overflow: hidden; background: white; color: black; } .CodeMirror-scroll { /* 30px is the magic margin used to hide the element's real scrollbars */ /* See overflow: hidden in .CodeMirror */ margin-bottom: -30px; margin-right: -30px; padding-bottom: 30px; height: 100%; outline: none; /* Prevent dragging from highlighting the element */ position: relative; -moz-box-sizing: content-box; box-sizing: content-box; } .CodeMirror-sizer { position: relative; border-right: 30px solid transparent; -moz-box-sizing: content-box; box-sizing: content-box; } /* The fake, visible scrollbars. Used to force redraw during scrolling before actuall scrolling happens, thus preventing shaking and flickering artifacts. */ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { position: absolute; z-index: 6; display: none; } .CodeMirror-vscrollbar { right: 0; top: 0; overflow-x: hidden; overflow-y: scroll; } .CodeMirror-hscrollbar { bottom: 0; left: 0; overflow-y: hidden; overflow-x: scroll; } .CodeMirror-scrollbar-filler { right: 0; bottom: 0; } .CodeMirror-gutter-filler { left: 0; bottom: 0; } .CodeMirror-gutters { position: absolute; left: 0; top: 0; padding-bottom: 30px; z-index: 3; } .CodeMirror-gutter { white-space: normal; height: 100%; -moz-box-sizing: content-box; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; /* Hack to make IE7 behave */ *zoom:1; *display:inline; } .CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; } .CodeMirror-lines { cursor: text; } .CodeMirror pre { /* Reset some styles that the rest of the page might have set */ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; border-width: 0; background: transparent; font-family: inherit; font-size: inherit; margin: 0; white-space: pre; word-wrap: normal; line-height: inherit; color: inherit; z-index: 2; position: relative; overflow: visible; } .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; } .CodeMirror-linebackground { position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: 0; } .CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; } .CodeMirror-widget {} .CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; } .CodeMirror-measure { position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden; } .CodeMirror-measure pre { position: static; } .CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0; } .CodeMirror-focused div.CodeMirror-cursor { visibility: visible; } .CodeMirror-selected { background: #d9d9d9; } .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } .cm-searching { background: #ffa; background: rgba(255, 255, 0, .4); } /* IE7 hack to prevent it from returning funny offsetTops on the spans */ .CodeMirror span { *vertical-align: text-bottom; } @media print { /* Hide the cursor when printing */ .CodeMirror div.CodeMirror-cursor { visibility: hidden; } } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/3024-day.css ================================================ /* Name: 3024 day Author: Jan T. Sott (http://github.com/idleberg) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-3024-day.CodeMirror {background: #f7f7f7; color: #3a3432;} .cm-s-3024-day div.CodeMirror-selected {background: #d6d5d4 !important;} .cm-s-3024-day .CodeMirror-gutters {background: #f7f7f7; border-right: 0px;} .cm-s-3024-day .CodeMirror-linenumber {color: #807d7c;} .cm-s-3024-day .CodeMirror-cursor {border-left: 1px solid #5c5855 !important;} .cm-s-3024-day span.cm-comment {color: #cdab53;} .cm-s-3024-day span.cm-atom {color: #a16a94;} .cm-s-3024-day span.cm-number {color: #a16a94;} .cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute {color: #01a252;} .cm-s-3024-day span.cm-keyword {color: #db2d20;} .cm-s-3024-day span.cm-string {color: #fded02;} .cm-s-3024-day span.cm-variable {color: #01a252;} .cm-s-3024-day span.cm-variable-2 {color: #01a0e4;} .cm-s-3024-day span.cm-def {color: #e8bbd0;} .cm-s-3024-day span.cm-bracket {color: #3a3432;} .cm-s-3024-day span.cm-tag {color: #db2d20;} .cm-s-3024-day span.cm-link {color: #a16a94;} .cm-s-3024-day span.cm-error {background: #db2d20; color: #5c5855;} .cm-s-3024-day .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/3024-night.css ================================================ /* Name: 3024 night Author: Jan T. Sott (http://github.com/idleberg) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-3024-night.CodeMirror {background: #090300; color: #d6d5d4;} .cm-s-3024-night div.CodeMirror-selected {background: #3a3432 !important;} .cm-s-3024-night .CodeMirror-gutters {background: #090300; border-right: 0px;} .cm-s-3024-night .CodeMirror-linenumber {color: #5c5855;} .cm-s-3024-night .CodeMirror-cursor {border-left: 1px solid #807d7c !important;} .cm-s-3024-night span.cm-comment {color: #cdab53;} .cm-s-3024-night span.cm-atom {color: #a16a94;} .cm-s-3024-night span.cm-number {color: #a16a94;} .cm-s-3024-night span.cm-property, .cm-s-3024-night span.cm-attribute {color: #01a252;} .cm-s-3024-night span.cm-keyword {color: #db2d20;} .cm-s-3024-night span.cm-string {color: #fded02;} .cm-s-3024-night span.cm-variable {color: #01a252;} .cm-s-3024-night span.cm-variable-2 {color: #01a0e4;} .cm-s-3024-night span.cm-def {color: #e8bbd0;} .cm-s-3024-night span.cm-bracket {color: #d6d5d4;} .cm-s-3024-night span.cm-tag {color: #db2d20;} .cm-s-3024-night span.cm-link {color: #a16a94;} .cm-s-3024-night span.cm-error {background: #db2d20; color: #807d7c;} .cm-s-3024-night .CodeMirror-activeline-background {background: #2F2F2F !important;} .cm-s-3024-night .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/ambiance-mobile.css ================================================ .cm-s-ambiance.CodeMirror { -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/ambiance.css ================================================ /* ambiance theme for codemirror */ /* Color scheme */ .cm-s-ambiance .cm-keyword { color: #cda869; } .cm-s-ambiance .cm-atom { color: #CF7EA9; } .cm-s-ambiance .cm-number { color: #78CF8A; } .cm-s-ambiance .cm-def { color: #aac6e3; } .cm-s-ambiance .cm-variable { color: #ffb795; } .cm-s-ambiance .cm-variable-2 { color: #eed1b3; } .cm-s-ambiance .cm-variable-3 { color: #faded3; } .cm-s-ambiance .cm-property { color: #eed1b3; } .cm-s-ambiance .cm-operator {color: #fa8d6a;} .cm-s-ambiance .cm-comment { color: #555; font-style:italic; } .cm-s-ambiance .cm-string { color: #8f9d6a; } .cm-s-ambiance .cm-string-2 { color: #9d937c; } .cm-s-ambiance .cm-meta { color: #D2A8A1; } .cm-s-ambiance .cm-qualifier { color: yellow; } .cm-s-ambiance .cm-builtin { color: #9999cc; } .cm-s-ambiance .cm-bracket { color: #24C2C7; } .cm-s-ambiance .cm-tag { color: #fee4ff } .cm-s-ambiance .cm-attribute { color: #9B859D; } .cm-s-ambiance .cm-header {color: blue;} .cm-s-ambiance .cm-quote { color: #24C2C7; } .cm-s-ambiance .cm-hr { color: pink; } .cm-s-ambiance .cm-link { color: #F4C20B; } .cm-s-ambiance .cm-special { color: #FF9D00; } .cm-s-ambiance .cm-error { color: #AF2018; } .cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; } .cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; } .cm-s-ambiance .CodeMirror-selected { background: rgba(255, 255, 255, 0.15); } .cm-s-ambiance.CodeMirror-focused .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } /* Editor styling */ .cm-s-ambiance.CodeMirror { line-height: 1.40em; font-family: Monaco, Menlo,"Andale Mono","lucida console","Courier New",monospace !important; color: #E6E1DC; background-color: #202020; -webkit-box-shadow: inset 0 0 10px black; -moz-box-shadow: inset 0 0 10px black; box-shadow: inset 0 0 10px black; } .cm-s-ambiance .CodeMirror-gutters { background: #3D3D3D; border-right: 1px solid #4D4D4D; box-shadow: 0 10px 20px black; } .cm-s-ambiance .CodeMirror-linenumber { text-shadow: 0px 1px 1px #4d4d4d; color: #222; padding: 0 5px; } .cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor { border-left: 1px solid #7991E8; } .cm-s-ambiance .CodeMirror-activeline-background { background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031); } .cm-s-ambiance.CodeMirror, .cm-s-ambiance .CodeMirror-gutters { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC"); } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/base16-dark.css ================================================ /* Name: Base16 Default Dark Author: Chris Kempson (http://chriskempson.com) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-base16-dark.CodeMirror {background: #151515; color: #e0e0e0;} .cm-s-base16-dark div.CodeMirror-selected {background: #202020 !important;} .cm-s-base16-dark .CodeMirror-gutters {background: #151515; border-right: 0px;} .cm-s-base16-dark .CodeMirror-linenumber {color: #505050;} .cm-s-base16-dark .CodeMirror-cursor {border-left: 1px solid #b0b0b0 !important;} .cm-s-base16-dark span.cm-comment {color: #8f5536;} .cm-s-base16-dark span.cm-atom {color: #aa759f;} .cm-s-base16-dark span.cm-number {color: #aa759f;} .cm-s-base16-dark span.cm-property, .cm-s-base16-dark span.cm-attribute {color: #90a959;} .cm-s-base16-dark span.cm-keyword {color: #ac4142;} .cm-s-base16-dark span.cm-string {color: #f4bf75;} .cm-s-base16-dark span.cm-variable {color: #90a959;} .cm-s-base16-dark span.cm-variable-2 {color: #6a9fb5;} .cm-s-base16-dark span.cm-def {color: #d28445;} .cm-s-base16-dark span.cm-bracket {color: #e0e0e0;} .cm-s-base16-dark span.cm-tag {color: #ac4142;} .cm-s-base16-dark span.cm-link {color: #aa759f;} .cm-s-base16-dark span.cm-error {background: #ac4142; color: #b0b0b0;} .cm-s-base16-dark .CodeMirror-activeline-background {background: #2F2F2F !important;} .cm-s-base16-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/base16-light.css ================================================ /* Name: Base16 Default Light Author: Chris Kempson (http://chriskempson.com) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-base16-light.CodeMirror {background: #f5f5f5; color: #202020;} .cm-s-base16-light div.CodeMirror-selected {background: #e0e0e0 !important;} .cm-s-base16-light .CodeMirror-gutters {background: #f5f5f5; border-right: 0px;} .cm-s-base16-light .CodeMirror-linenumber {color: #b0b0b0;} .cm-s-base16-light .CodeMirror-cursor {border-left: 1px solid #505050 !important;} .cm-s-base16-light span.cm-comment {color: #8f5536;} .cm-s-base16-light span.cm-atom {color: #aa759f;} .cm-s-base16-light span.cm-number {color: #aa759f;} .cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute {color: #90a959;} .cm-s-base16-light span.cm-keyword {color: #ac4142;} .cm-s-base16-light span.cm-string {color: #f4bf75;} .cm-s-base16-light span.cm-variable {color: #90a959;} .cm-s-base16-light span.cm-variable-2 {color: #6a9fb5;} .cm-s-base16-light span.cm-def {color: #d28445;} .cm-s-base16-light span.cm-bracket {color: #202020;} .cm-s-base16-light span.cm-tag {color: #ac4142;} .cm-s-base16-light span.cm-link {color: #aa759f;} .cm-s-base16-light span.cm-error {background: #ac4142; color: #505050;} .cm-s-base16-light .CodeMirror-activeline-background {background: #DDDCDC !important;} .cm-s-base16-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/blackboard.css ================================================ /* Port of TextMate's Blackboard theme */ .cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; } .cm-s-blackboard .CodeMirror-selected { background: #253B76 !important; } .cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; } .cm-s-blackboard .CodeMirror-linenumber { color: #888; } .cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; } .cm-s-blackboard .cm-keyword { color: #FBDE2D; } .cm-s-blackboard .cm-atom { color: #D8FA3C; } .cm-s-blackboard .cm-number { color: #D8FA3C; } .cm-s-blackboard .cm-def { color: #8DA6CE; } .cm-s-blackboard .cm-variable { color: #FF6400; } .cm-s-blackboard .cm-operator { color: #FBDE2D;} .cm-s-blackboard .cm-comment { color: #AEAEAE; } .cm-s-blackboard .cm-string { color: #61CE3C; } .cm-s-blackboard .cm-string-2 { color: #61CE3C; } .cm-s-blackboard .cm-meta { color: #D8FA3C; } .cm-s-blackboard .cm-builtin { color: #8DA6CE; } .cm-s-blackboard .cm-tag { color: #8DA6CE; } .cm-s-blackboard .cm-attribute { color: #8DA6CE; } .cm-s-blackboard .cm-header { color: #FF6400; } .cm-s-blackboard .cm-hr { color: #AEAEAE; } .cm-s-blackboard .cm-link { color: #8DA6CE; } .cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; } .cm-s-blackboard .CodeMirror-activeline-background {background: #3C3636 !important;} .cm-s-blackboard .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/cobalt.css ================================================ .cm-s-cobalt.CodeMirror { background: #002240; color: white; } .cm-s-cobalt div.CodeMirror-selected { background: #b36539 !important; } .cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } .cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; } .cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-cobalt span.cm-comment { color: #08f; } .cm-s-cobalt span.cm-atom { color: #845dc4; } .cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; } .cm-s-cobalt span.cm-keyword { color: #ffee80; } .cm-s-cobalt span.cm-string { color: #3ad900; } .cm-s-cobalt span.cm-meta { color: #ff9d00; } .cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; } .cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def { color: white; } .cm-s-cobalt span.cm-bracket { color: #d8d8d8; } .cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; } .cm-s-cobalt span.cm-link { color: #845dc4; } .cm-s-cobalt span.cm-error { color: #9d1e15; } .cm-s-cobalt .CodeMirror-activeline-background {background: #002D57 !important;} .cm-s-cobalt .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/eclipse.css ================================================ .cm-s-eclipse span.cm-meta {color: #FF1717;} .cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; } .cm-s-eclipse span.cm-atom {color: #219;} .cm-s-eclipse span.cm-number {color: #164;} .cm-s-eclipse span.cm-def {color: #00f;} .cm-s-eclipse span.cm-variable {color: black;} .cm-s-eclipse span.cm-variable-2 {color: #0000C0;} .cm-s-eclipse span.cm-variable-3 {color: #0000C0;} .cm-s-eclipse span.cm-property {color: black;} .cm-s-eclipse span.cm-operator {color: black;} .cm-s-eclipse span.cm-comment {color: #3F7F5F;} .cm-s-eclipse span.cm-string {color: #2A00FF;} .cm-s-eclipse span.cm-string-2 {color: #f50;} .cm-s-eclipse span.cm-qualifier {color: #555;} .cm-s-eclipse span.cm-builtin {color: #30a;} .cm-s-eclipse span.cm-bracket {color: #cc7;} .cm-s-eclipse span.cm-tag {color: #170;} .cm-s-eclipse span.cm-attribute {color: #00c;} .cm-s-eclipse span.cm-link {color: #219;} .cm-s-eclipse span.cm-error {color: #f00;} .cm-s-eclipse .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-eclipse .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/elegant.css ================================================ .cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom {color: #762;} .cm-s-elegant span.cm-comment {color: #262; font-style: italic; line-height: 1em;} .cm-s-elegant span.cm-meta {color: #555; font-style: italic; line-height: 1em;} .cm-s-elegant span.cm-variable {color: black;} .cm-s-elegant span.cm-variable-2 {color: #b11;} .cm-s-elegant span.cm-qualifier {color: #555;} .cm-s-elegant span.cm-keyword {color: #730;} .cm-s-elegant span.cm-builtin {color: #30a;} .cm-s-elegant span.cm-link {color: #762;} .cm-s-elegant span.cm-error {background-color: #fdd;} .cm-s-elegant .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-elegant .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/erlang-dark.css ================================================ .cm-s-erlang-dark.CodeMirror { background: #002240; color: white; } .cm-s-erlang-dark div.CodeMirror-selected { background: #b36539 !important; } .cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } .cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; } .cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-erlang-dark span.cm-atom { color: #f133f1; } .cm-s-erlang-dark span.cm-attribute { color: #ff80e1; } .cm-s-erlang-dark span.cm-bracket { color: #ff9d00; } .cm-s-erlang-dark span.cm-builtin { color: #eaa; } .cm-s-erlang-dark span.cm-comment { color: #77f; } .cm-s-erlang-dark span.cm-def { color: #e7a; } .cm-s-erlang-dark span.cm-keyword { color: #ffee80; } .cm-s-erlang-dark span.cm-meta { color: #50fefe; } .cm-s-erlang-dark span.cm-number { color: #ffd0d0; } .cm-s-erlang-dark span.cm-operator { color: #d55; } .cm-s-erlang-dark span.cm-property { color: #ccc; } .cm-s-erlang-dark span.cm-qualifier { color: #ccc; } .cm-s-erlang-dark span.cm-quote { color: #ccc; } .cm-s-erlang-dark span.cm-special { color: #ffbbbb; } .cm-s-erlang-dark span.cm-string { color: #3ad900; } .cm-s-erlang-dark span.cm-string-2 { color: #ccc; } .cm-s-erlang-dark span.cm-tag { color: #9effff; } .cm-s-erlang-dark span.cm-variable { color: #50fe50; } .cm-s-erlang-dark span.cm-variable-2 { color: #e0e; } .cm-s-erlang-dark span.cm-variable-3 { color: #ccc; } .cm-s-erlang-dark span.cm-error { color: #9d1e15; } .cm-s-erlang-dark .CodeMirror-activeline-background {background: #013461 !important;} .cm-s-erlang-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/lesser-dark.css ================================================ /* http://lesscss.org/ dark theme Ported to CodeMirror by Peter Kroon */ .cm-s-lesser-dark { line-height: 1.3em; } .cm-s-lesser-dark { font-family: 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Monaco', Courier, monospace !important; } .cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; } .cm-s-lesser-dark div.CodeMirror-selected {background: #45443B !important;} /* 33322B*/ .cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/ .cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/ .cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; } .cm-s-lesser-dark .CodeMirror-linenumber { color: #777; } .cm-s-lesser-dark span.cm-keyword { color: #599eff; } .cm-s-lesser-dark span.cm-atom { color: #C2B470; } .cm-s-lesser-dark span.cm-number { color: #B35E4D; } .cm-s-lesser-dark span.cm-def {color: white;} .cm-s-lesser-dark span.cm-variable { color:#D9BF8C; } .cm-s-lesser-dark span.cm-variable-2 { color: #669199; } .cm-s-lesser-dark span.cm-variable-3 { color: white; } .cm-s-lesser-dark span.cm-property {color: #92A75C;} .cm-s-lesser-dark span.cm-operator {color: #92A75C;} .cm-s-lesser-dark span.cm-comment { color: #666; } .cm-s-lesser-dark span.cm-string { color: #BCD279; } .cm-s-lesser-dark span.cm-string-2 {color: #f50;} .cm-s-lesser-dark span.cm-meta { color: #738C73; } .cm-s-lesser-dark span.cm-qualifier {color: #555;} .cm-s-lesser-dark span.cm-builtin { color: #ff9e59; } .cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; } .cm-s-lesser-dark span.cm-tag { color: #669199; } .cm-s-lesser-dark span.cm-attribute {color: #00c;} .cm-s-lesser-dark span.cm-header {color: #a0a;} .cm-s-lesser-dark span.cm-quote {color: #090;} .cm-s-lesser-dark span.cm-hr {color: #999;} .cm-s-lesser-dark span.cm-link {color: #00c;} .cm-s-lesser-dark span.cm-error { color: #9d1e15; } .cm-s-lesser-dark .CodeMirror-activeline-background {background: #3C3A3A !important;} .cm-s-lesser-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/mbo.css ================================================ /* Based on mbonaci's Brackets mbo theme */ .cm-s-mbo.CodeMirror {background: #2c2c2c; color: #ffffe9;} .cm-s-mbo div.CodeMirror-selected {background: #716C62 !important;} .cm-s-mbo .CodeMirror-gutters {background: #4e4e4e; border-right: 0px;} .cm-s-mbo .CodeMirror-linenumber {color: #dadada;} .cm-s-mbo .CodeMirror-cursor {border-left: 1px solid #ffffec !important;} .cm-s-mbo span.cm-comment {color: #95958a;} .cm-s-mbo span.cm-atom {color: #00a8c6;} .cm-s-mbo span.cm-number {color: #00a8c6;} .cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute {color: #9ddfe9;} .cm-s-mbo span.cm-keyword {color: #ffb928;} .cm-s-mbo span.cm-string {color: #ffcf6c;} .cm-s-mbo span.cm-variable {color: #ffffec;} .cm-s-mbo span.cm-variable-2 {color: #00a8c6;} .cm-s-mbo span.cm-def {color: #ffffec;} .cm-s-mbo span.cm-bracket {color: #fffffc; font-weight: bold;} .cm-s-mbo span.cm-tag {color: #9ddfe9;} .cm-s-mbo span.cm-link {color: #f54b07;} .cm-s-mbo span.cm-error {background: #636363; color: #ffffec;} .cm-s-mbo .CodeMirror-activeline-background {background: #494b41 !important;} .cm-s-mbo .CodeMirror-matchingbracket { text-decoration: underline; color: #f5e107 !important; } .cm-s-mbo .CodeMirror-matchingtag {background: #4e4e4e;} .cm-s-mbo span.cm-searching { background-color: none; background: none; box-shadow: 0 0 0 1px #ffffec; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/mdn-like.css ================================================ /* MDN-LIKE Theme - Mozilla Ported to CodeMirror by Peter Kroon Report bugs/issues here: https://github.com/marijnh/CodeMirror/issues GitHub: @peterkroon The mdn-like theme is inspired on the displayed code examples at: https://developer.mozilla.org/en-US/docs/Web/CSS/animation */ .cm-s-mdn-like.CodeMirror { color: #999; font-family: monospace; background-color: #fff; } .cm-s-mdn-like .CodeMirror-selected { background: #cfc !important; } .cm-s-mdn-like .CodeMirror-gutters { background: #f8f8f8; border-left: 6px solid rgba(0,83,159,0.65); color: #333; } .cm-s-mdn-like .CodeMirror-linenumber { color: #aaa; margin-left: 3px; } div.cm-s-mdn-like .CodeMirror-cursor { border-left: 2px solid #222; } .cm-s-mdn-like .cm-keyword { color: #6262FF; } .cm-s-mdn-like .cm-atom { color: #F90; } .cm-s-mdn-like .cm-number { color: #ca7841; } .cm-s-mdn-like .cm-def { color: #8DA6CE; } .cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; } .cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def { color: #07a; } .cm-s-mdn-like .cm-variable { color: #07a; } .cm-s-mdn-like .cm-property { color: #905; } .cm-s-mdn-like .cm-qualifier { color: #690; } .cm-s-mdn-like .cm-operator { color: #cda869; } .cm-s-mdn-like .cm-comment { color:#777; font-weight:normal; } .cm-s-mdn-like .cm-string { color:#07a; font-style:italic; } .cm-s-mdn-like .cm-string-2 { color:#bd6b18; } /*?*/ .cm-s-mdn-like .cm-meta { color: #000; } /*?*/ .cm-s-mdn-like .cm-builtin { color: #9B7536; } /*?*/ .cm-s-mdn-like .cm-tag { color: #997643; } .cm-s-mdn-like .cm-attribute { color: #d6bb6d; } /*?*/ .cm-s-mdn-like .cm-header { color: #FF6400; } .cm-s-mdn-like .cm-hr { color: #AEAEAE; } .cm-s-mdn-like .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } .cm-s-mdn-like .cm-error { border-bottom: 1px solid red; } div.cm-s-mdn-like .CodeMirror-activeline-background {background: #efefff;} div.cm-s-mdn-like span.CodeMirror-matchingbracket {outline:1px solid grey; color: inherit;} .cm-s-mdn-like.CodeMirror { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAAAyCAYAAAAp8UeFAAAHvklEQVR42s2b63bcNgyEQZCSHCdt2vd/0tWF7I+Q6XgMXiTtuvU5Pl57ZQKkKHzEAOtF5KeIJBGJ8uvL599FRFREZhFx8DeXv8trn68RuGaC8TRfo3SNp9dlDDHedyLyTUTeRWStXKPZrjtpZxaRw5hPqozRs1N8/enzIiQRWcCgy4MUA0f+XWliDhyL8Lfyvx7ei/Ae3iQFHyw7U/59pQVIMEEPEz0G7XiwdRjzSfC3UTtz9vchIntxvry5iMgfIhJoEflOz2CQr3F5h/HfeFe+GTdLaKcu9L8LTeQb/R/7GgbsfKedyNdoHsN31uRPWrfZ5wsj/NzzRQHuToIdU3ahwnsKPxXCjJITuOsi7XLc7SG/v5GdALs7wf8JjTFiB5+QvTEfRyGOfX3Lrx8wxyQi3sNq46O7QahQiCsRFgqddjBouVEHOKDgXAQHD9gJCr5sMKkEdjwsarG/ww3BMHBU7OBjXnzdyY7SfCxf5/z6ATccrwlKuwC/jhznnPF4CgVzhhVf4xp2EixcBActO75iZ8/fM9zAs2OMzKdslgXWJ9XG8PQoOAMA5fGcsvORgv0doBXyHrCwfLJAOwo71QLNkb8n2Pl6EWiR7OCibtkPaz4Kc/0NNAze2gju3zOwekALDaCFPI5vjPFmgGY5AZqyGEvH1x7QfIb8YtxMnA/b+QQ0aQDAwc6JMFg8CbQZ4qoYEEHbRwNojuK3EHwd7VALSgq+MNDKzfT58T8qdpADrgW0GmgcAS1lhzztJmkAzcPNOQbsWEALBDSlMKUG0Eq4CLAQWvEVQ9WU57gZJwZtgPO3r9oBTQ9WO8TjqXINx8R0EYpiZEUWOF3FxkbJkgU9B2f41YBrIj5ZfsQa0M5kTgiAAqM3ShXLgu8XMqcrQBvJ0CL5pnTsfMB13oB8athpAq2XOQmcGmoACCLydx7nToa23ATaSIY2ichfOdPTGxlasXMLaL0MLZAOwAKIM+y8CmicobGdCcbbK9DzN+yYGVoNNI5iUKTMyYOjPse4A8SM1MmcXgU0toOq1yO/v8FOxlASyc7TgeYaAMBJHcY1CcCwGI/TK4AmDbDyKYBBtFUkRwto8gygiQEaByFgJ00BH2M8JWwQS1nafDXQCidWyOI8AcjDCSjCLk8ngObuAm3JAHAdubAmOaK06V8MNEsKPJOhobSprwQa6gD7DclRQdqcwL4zxqgBrQcabUiBLclRDKAlWp+etPkBaNMA0AKlrHwTdEByZAA4GM+SNluSY6wAzcMNewxmgig5Ks0nkrSpBvSaQHMdKTBAnLojOdYyGpQ254602ZILPdTD1hdlggdIm74jbTp8vDwF5ZYUeLWGJpWsh6XNyXgcYwVoJQTEhhTYkxzZjiU5npU2TaB979TQehlaAVq4kaGpiPwwwLkYUuBbQwocyQTv1tA0+1UFWoJF3iv1oq+qoSk8EQdJmwHkziIF7oOZk14EGitibAdjLYYK78H5vZOhtWpoI0ATGHs0Q8OMb4Ey+2bU2UYztCtA0wFAs7TplGLRVQCcqaFdGSPCeTI1QNIC52iWNzof6Uib7xjEp07mNNoUYmVosVItHrHzRlLgBn9LFyRHaQCtVUMbtTNhoXWiTOO9k/V8BdAc1Oq0ArSQs6/5SU0hckNy9NnXqQY0PGYo5dWJ7nINaN6o958FWin27aBaWRka1r5myvLOAm0j30eBJqCxHLReVclxhxOEN2JfDWjxBtAC7MIH1fVaGdoOp4qJYDgKtKPSFNID2gSnGldrCqkFZ+5UeQXQBIRrSwocbdZYQT/2LwRahBPBXoHrB8nxaGROST62DKUbQOMMzZIC9abkuELfQzQALWTnDNAm8KHWFOJgJ5+SHIvTPcmx1xQyZRhNL5Qci689aXMEaN/uNIWkEwDAvFpOZmgsBaaGnbs1NPa1Jm32gBZAIh1pCtG7TSH4aE0y1uVY4uqoFPisGlpP2rSA5qTecWn5agK6BzSpgAyD+wFaqhnYoSZ1Vwr8CmlTQbrcO3ZaX0NAEyMbYaAlyquFoLKK3SPby9CeVUPThrSJmkCAE0CrKUQadi4DrdSlWhmah0YL9z9vClH59YGbHx1J8VZTyAjQepJjmXwAKTDQI3omc3p1U4gDUf6RfcdYfrUp5ClAi2J3Ba6UOXGo+K+bQrjjssitG2SJzshaLwMtXgRagUNpYYoVkMSBLM+9GGiJZMvduG6DRZ4qc04DMPtQQxOjEtACmhO7K1AbNbQDEggZyJwscFpAGwENhoBeUwh3bWolhe8BTYVKxQEWrSUn/uhcM5KhvUu/+eQu0Lzhi+VrK0PrZZNDQKs9cpYUuFYgMVpD4/NxenJTiMCNqdUEUf1qZWjppLT5qSkkUZbCwkbZMSuVnu80hfSkzRbQeqCZSAh6huR4VtoM2gHAlLf72smuWgE+VV7XpE25Ab2WFDgyhnSuKbs4GuGzCjR+tIoUuMFg3kgcWKLTwRqanJQ2W00hAsenfaApRC42hbCvK1SlE0HtE9BGgneJO+ELamitD1YjjOYnNYVcraGhtKkW0EqVVeDx733I2NH581k1NNxNLG0i0IJ8/NjVaOZ0tYZ2Vtr0Xv7tPV3hkWp9EFkgS/J0vosngTaSoaG06WHi+xObQkaAdlbanP8B2+2l0f90LmUAAAAASUVORK5CYII=); } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/midnight.css ================================================ /* Based on the theme at http://bonsaiden.github.com/JavaScript-Garden */ /**/ .cm-s-midnight span.CodeMirror-matchhighlight { background: #494949; } .cm-s-midnight.CodeMirror-focused span.CodeMirror-matchhighlight { background: #314D67 !important; } /**/ .cm-s-midnight .CodeMirror-activeline-background {background: #253540 !important;} .cm-s-midnight.CodeMirror { background: #0F192A; color: #D1EDFF; } .cm-s-midnight.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;} .cm-s-midnight div.CodeMirror-selected {background: #314D67 !important;} .cm-s-midnight .CodeMirror-gutters {background: #0F192A; border-right: 1px solid;} .cm-s-midnight .CodeMirror-linenumber {color: #D0D0D0;} .cm-s-midnight .CodeMirror-cursor { border-left: 1px solid #F8F8F0 !important; } .cm-s-midnight span.cm-comment {color: #428BDD;} .cm-s-midnight span.cm-atom {color: #AE81FF;} .cm-s-midnight span.cm-number {color: #D1EDFF;} .cm-s-midnight span.cm-property, .cm-s-midnight span.cm-attribute {color: #A6E22E;} .cm-s-midnight span.cm-keyword {color: #E83737;} .cm-s-midnight span.cm-string {color: #1DC116;} .cm-s-midnight span.cm-variable {color: #FFAA3E;} .cm-s-midnight span.cm-variable-2 {color: #FFAA3E;} .cm-s-midnight span.cm-def {color: #4DD;} .cm-s-midnight span.cm-bracket {color: #D1EDFF;} .cm-s-midnight span.cm-tag {color: #449;} .cm-s-midnight span.cm-link {color: #AE81FF;} .cm-s-midnight span.cm-error {background: #F92672; color: #F8F8F0;} .cm-s-midnight .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/monokai.css ================================================ /* Based on Sublime Text's Monokai theme */ .cm-s-monokai.CodeMirror {background: #272822; color: #f8f8f2;} .cm-s-monokai div.CodeMirror-selected {background: #49483E !important;} .cm-s-monokai .CodeMirror-gutters {background: #272822; border-right: 0px;} .cm-s-monokai .CodeMirror-linenumber {color: #d0d0d0;} .cm-s-monokai .CodeMirror-cursor {border-left: 1px solid #f8f8f0 !important;} .cm-s-monokai span.cm-comment {color: #75715e;} .cm-s-monokai span.cm-atom {color: #ae81ff;} .cm-s-monokai span.cm-number {color: #ae81ff;} .cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute {color: #a6e22e;} .cm-s-monokai span.cm-keyword {color: #f92672;} .cm-s-monokai span.cm-string {color: #e6db74;} .cm-s-monokai span.cm-variable {color: #a6e22e;} .cm-s-monokai span.cm-variable-2 {color: #9effff;} .cm-s-monokai span.cm-def {color: #fd971f;} .cm-s-monokai span.cm-bracket {color: #f8f8f2;} .cm-s-monokai span.cm-tag {color: #f92672;} .cm-s-monokai span.cm-link {color: #ae81ff;} .cm-s-monokai span.cm-error {background: #f92672; color: #f8f8f0;} .cm-s-monokai .CodeMirror-activeline-background {background: #373831 !important;} .cm-s-monokai .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/neat.css ================================================ .cm-s-neat span.cm-comment { color: #a86; } .cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; } .cm-s-neat span.cm-string { color: #a22; } .cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } .cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } .cm-s-neat span.cm-variable { color: black; } .cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } .cm-s-neat span.cm-meta {color: #555;} .cm-s-neat span.cm-link { color: #3a3; } .cm-s-neat .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-neat .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/night.css ================================================ /* Loosely based on the Midnight Textmate theme */ .cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; } .cm-s-night div.CodeMirror-selected { background: #447 !important; } .cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } .cm-s-night .CodeMirror-linenumber { color: #f8f8f8; } .cm-s-night .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-night span.cm-comment { color: #6900a1; } .cm-s-night span.cm-atom { color: #845dc4; } .cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; } .cm-s-night span.cm-keyword { color: #599eff; } .cm-s-night span.cm-string { color: #37f14a; } .cm-s-night span.cm-meta { color: #7678e2; } .cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } .cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { color: white; } .cm-s-night span.cm-bracket { color: #8da6ce; } .cm-s-night span.cm-comment { color: #6900a1; } .cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } .cm-s-night span.cm-link { color: #845dc4; } .cm-s-night span.cm-error { color: #9d1e15; } .cm-s-night .CodeMirror-activeline-background {background: #1C005A !important;} .cm-s-night .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/paraiso-dark.css ================================================ /* Name: Paraíso (Dark) Author: Jan T. Sott Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) Inspired by the art of Rubens LP (http://www.rubenslp.com.br) */ .cm-s-paraiso-dark.CodeMirror {background: #2f1e2e; color: #b9b6b0;} .cm-s-paraiso-dark div.CodeMirror-selected {background: #41323f !important;} .cm-s-paraiso-dark .CodeMirror-gutters {background: #2f1e2e; border-right: 0px;} .cm-s-paraiso-dark .CodeMirror-linenumber {color: #776e71;} .cm-s-paraiso-dark .CodeMirror-cursor {border-left: 1px solid #8d8687 !important;} .cm-s-paraiso-dark span.cm-comment {color: #e96ba8;} .cm-s-paraiso-dark span.cm-atom {color: #815ba4;} .cm-s-paraiso-dark span.cm-number {color: #815ba4;} .cm-s-paraiso-dark span.cm-property, .cm-s-paraiso-dark span.cm-attribute {color: #48b685;} .cm-s-paraiso-dark span.cm-keyword {color: #ef6155;} .cm-s-paraiso-dark span.cm-string {color: #fec418;} .cm-s-paraiso-dark span.cm-variable {color: #48b685;} .cm-s-paraiso-dark span.cm-variable-2 {color: #06b6ef;} .cm-s-paraiso-dark span.cm-def {color: #f99b15;} .cm-s-paraiso-dark span.cm-bracket {color: #b9b6b0;} .cm-s-paraiso-dark span.cm-tag {color: #ef6155;} .cm-s-paraiso-dark span.cm-link {color: #815ba4;} .cm-s-paraiso-dark span.cm-error {background: #ef6155; color: #8d8687;} .cm-s-paraiso-dark .CodeMirror-activeline-background {background: #4D344A !important;} .cm-s-paraiso-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/paraiso-light.css ================================================ /* Name: Paraíso (Light) Author: Jan T. Sott Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) Inspired by the art of Rubens LP (http://www.rubenslp.com.br) */ .cm-s-paraiso-light.CodeMirror {background: #e7e9db; color: #41323f;} .cm-s-paraiso-light div.CodeMirror-selected {background: #b9b6b0 !important;} .cm-s-paraiso-light .CodeMirror-gutters {background: #e7e9db; border-right: 0px;} .cm-s-paraiso-light .CodeMirror-linenumber {color: #8d8687;} .cm-s-paraiso-light .CodeMirror-cursor {border-left: 1px solid #776e71 !important;} .cm-s-paraiso-light span.cm-comment {color: #e96ba8;} .cm-s-paraiso-light span.cm-atom {color: #815ba4;} .cm-s-paraiso-light span.cm-number {color: #815ba4;} .cm-s-paraiso-light span.cm-property, .cm-s-paraiso-light span.cm-attribute {color: #48b685;} .cm-s-paraiso-light span.cm-keyword {color: #ef6155;} .cm-s-paraiso-light span.cm-string {color: #fec418;} .cm-s-paraiso-light span.cm-variable {color: #48b685;} .cm-s-paraiso-light span.cm-variable-2 {color: #06b6ef;} .cm-s-paraiso-light span.cm-def {color: #f99b15;} .cm-s-paraiso-light span.cm-bracket {color: #41323f;} .cm-s-paraiso-light span.cm-tag {color: #ef6155;} .cm-s-paraiso-light span.cm-link {color: #815ba4;} .cm-s-paraiso-light span.cm-error {background: #ef6155; color: #776e71;} .cm-s-paraiso-light .CodeMirror-activeline-background {background: #CFD1C4 !important;} .cm-s-paraiso-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/pastel-on-dark.css ================================================ /** * Pastel On Dark theme ported from ACE editor * @license MIT * @copyright AtomicPages LLC 2014 * @author Dennis Thompson, AtomicPages LLC * @version 1.1 * @source https://github.com/atomicpages/codemirror-pastel-on-dark-theme */ .cm-s-pastel-on-dark.CodeMirror { background: #2c2827; color: #8F938F; line-height: 1.5; font-family: consolas, Courier, monospace; font-size: 14px; } .cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2) !important; } .cm-s-pastel-on-dark .CodeMirror-gutters { background: #34302f; border-right: 0px; padding: 0 3px; } .cm-s-pastel-on-dark .CodeMirror-linenumber { color: #8F938F; } .cm-s-pastel-on-dark .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; } .cm-s-pastel-on-dark span.cm-comment { color: #A6C6FF; } .cm-s-pastel-on-dark span.cm-atom { color: #DE8E30; } .cm-s-pastel-on-dark span.cm-number { color: #CCCCCC; } .cm-s-pastel-on-dark span.cm-property { color: #8F938F; } .cm-s-pastel-on-dark span.cm-attribute { color: #a6e22e; } .cm-s-pastel-on-dark span.cm-keyword { color: #AEB2F8; } .cm-s-pastel-on-dark span.cm-string { color: #66A968; } .cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; } .cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; } .cm-s-pastel-on-dark span.cm-variable-3 { color: #DE8E30; } .cm-s-pastel-on-dark span.cm-def { color: #757aD8; } .cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; } .cm-s-pastel-on-dark span.cm-tag { color: #C1C144; } .cm-s-pastel-on-dark span.cm-link { color: #ae81ff; } .cm-s-pastel-on-dark span.cm-qualifier,.cm-s-pastel-on-dark span.cm-builtin { color: #C1C144; } .cm-s-pastel-on-dark span.cm-error { background: #757aD8; color: #f8f8f0; } .cm-s-pastel-on-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.031) !important; } .cm-s-pastel-on-dark .CodeMirror-matchingbracket { border: 1px solid rgba(255,255,255,0.25); color: #8F938F !important; margin: -1px -1px 0 -1px; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/rubyblue.css ================================================ .cm-s-rubyblue { font-family: Trebuchet, Verdana, sans-serif; } /* - customized editor font - */ .cm-s-rubyblue.CodeMirror { background: #112435; color: white; } .cm-s-rubyblue div.CodeMirror-selected { background: #38566F !important; } .cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; } .cm-s-rubyblue .CodeMirror-linenumber { color: white; } .cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; } .cm-s-rubyblue span.cm-atom { color: #F4C20B; } .cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; } .cm-s-rubyblue span.cm-keyword { color: #F0F; } .cm-s-rubyblue span.cm-string { color: #F08047; } .cm-s-rubyblue span.cm-meta { color: #F0F; } .cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; } .cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def { color: white; } .cm-s-rubyblue span.cm-bracket { color: #F0F; } .cm-s-rubyblue span.cm-link { color: #F4C20B; } .cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; } .cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; } .cm-s-rubyblue span.cm-error { color: #AF2018; } .cm-s-rubyblue .CodeMirror-activeline-background {background: #173047 !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/solarized.css ================================================ /* Solarized theme for code-mirror http://ethanschoonover.com/solarized */ /* Solarized color pallet http://ethanschoonover.com/solarized/img/solarized-palette.png */ .solarized.base03 { color: #002b36; } .solarized.base02 { color: #073642; } .solarized.base01 { color: #586e75; } .solarized.base00 { color: #657b83; } .solarized.base0 { color: #839496; } .solarized.base1 { color: #93a1a1; } .solarized.base2 { color: #eee8d5; } .solarized.base3 { color: #fdf6e3; } .solarized.solar-yellow { color: #b58900; } .solarized.solar-orange { color: #cb4b16; } .solarized.solar-red { color: #dc322f; } .solarized.solar-magenta { color: #d33682; } .solarized.solar-violet { color: #6c71c4; } .solarized.solar-blue { color: #268bd2; } .solarized.solar-cyan { color: #2aa198; } .solarized.solar-green { color: #859900; } /* Color scheme for code-mirror */ .cm-s-solarized { line-height: 1.45em; font-family: Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace !important; color-profile: sRGB; rendering-intent: auto; } .cm-s-solarized.cm-s-dark { color: #839496; background-color: #002b36; text-shadow: #002b36 0 1px; } .cm-s-solarized.cm-s-light { background-color: #fdf6e3; color: #657b83; text-shadow: #eee8d5 0 1px; } .cm-s-solarized .CodeMirror-widget { text-shadow: none; } .cm-s-solarized .cm-keyword { color: #cb4b16 } .cm-s-solarized .cm-atom { color: #d33682; } .cm-s-solarized .cm-number { color: #d33682; } .cm-s-solarized .cm-def { color: #2aa198; } .cm-s-solarized .cm-variable { color: #268bd2; } .cm-s-solarized .cm-variable-2 { color: #b58900; } .cm-s-solarized .cm-variable-3 { color: #6c71c4; } .cm-s-solarized .cm-property { color: #2aa198; } .cm-s-solarized .cm-operator {color: #6c71c4;} .cm-s-solarized .cm-comment { color: #586e75; font-style:italic; } .cm-s-solarized .cm-string { color: #859900; } .cm-s-solarized .cm-string-2 { color: #b58900; } .cm-s-solarized .cm-meta { color: #859900; } .cm-s-solarized .cm-qualifier { color: #b58900; } .cm-s-solarized .cm-builtin { color: #d33682; } .cm-s-solarized .cm-bracket { color: #cb4b16; } .cm-s-solarized .CodeMirror-matchingbracket { color: #859900; } .cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; } .cm-s-solarized .cm-tag { color: #93a1a1 } .cm-s-solarized .cm-attribute { color: #2aa198; } .cm-s-solarized .cm-header { color: #586e75; } .cm-s-solarized .cm-quote { color: #93a1a1; } .cm-s-solarized .cm-hr { color: transparent; border-top: 1px solid #586e75; display: block; } .cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; } .cm-s-solarized .cm-special { color: #6c71c4; } .cm-s-solarized .cm-em { color: #999; text-decoration: underline; text-decoration-style: dotted; } .cm-s-solarized .cm-strong { color: #eee; } .cm-s-solarized .cm-tab:before { content: "➤"; /*visualize tab character*/ color: #586e75; position:absolute; } .cm-s-solarized .cm-error, .cm-s-solarized .cm-invalidchar { color: #586e75; border-bottom: 1px dotted #dc322f; } .cm-s-solarized.cm-s-dark .CodeMirror-selected { background: #073642; } .cm-s-solarized.cm-s-light .CodeMirror-selected { background: #eee8d5; } /* Editor styling */ /* Little shadow on the view-port of the buffer view */ .cm-s-solarized.CodeMirror { -moz-box-shadow: inset 7px 0 12px -6px #000; -webkit-box-shadow: inset 7px 0 12px -6px #000; box-shadow: inset 7px 0 12px -6px #000; } /* Gutter border and some shadow from it */ .cm-s-solarized .CodeMirror-gutters { padding: 0 15px 0 10px; box-shadow: 0 10px 20px black; border-right: 1px solid; } /* Gutter colors and line number styling based of color scheme (dark / light) */ /* Dark */ .cm-s-solarized.cm-s-dark .CodeMirror-gutters { background-color: #073642; border-color: #00232c; } .cm-s-solarized.cm-s-dark .CodeMirror-linenumber { text-shadow: #021014 0 -1px; } /* Light */ .cm-s-solarized.cm-s-light .CodeMirror-gutters { background-color: #eee8d5; border-color: #eee8d5; } /* Common */ .cm-s-solarized .CodeMirror-linenumber { color: #586e75; } .cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text { color: #586e75; } .cm-s-solarized .CodeMirror-lines { padding-left: 5px; } .cm-s-solarized .CodeMirror-lines .CodeMirror-cursor { border-left: 1px solid #819090; } /* Active line. Negative margin compensates left padding of the text in the view-port */ .cm-s-solarized.cm-s-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.10); } .cm-s-solarized.cm-s-light .CodeMirror-activeline-background { background: rgba(0, 0, 0, 0.10); } /* View-port and gutter both get little noise background to give it a real feel. */ .cm-s-solarized.CodeMirror, .cm-s-solarized .CodeMirror-gutters { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC"); } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/the-matrix.css ================================================ .cm-s-the-matrix.CodeMirror { background: #000000; color: #00FF00; } .cm-s-the-matrix div.CodeMirror-selected { background: #2D2D2D !important; } .cm-s-the-matrix .CodeMirror-gutters { background: #060; border-right: 2px solid #00FF00; } .cm-s-the-matrix .CodeMirror-linenumber { color: #FFFFFF; } .cm-s-the-matrix .CodeMirror-cursor { border-left: 1px solid #00FF00 !important; } .cm-s-the-matrix span.cm-keyword {color: #008803; font-weight: bold;} .cm-s-the-matrix span.cm-atom {color: #3FF;} .cm-s-the-matrix span.cm-number {color: #FFB94F;} .cm-s-the-matrix span.cm-def {color: #99C;} .cm-s-the-matrix span.cm-variable {color: #F6C;} .cm-s-the-matrix span.cm-variable-2 {color: #C6F;} .cm-s-the-matrix span.cm-variable-3 {color: #96F;} .cm-s-the-matrix span.cm-property {color: #62FFA0;} .cm-s-the-matrix span.cm-operator {color: #999} .cm-s-the-matrix span.cm-comment {color: #CCCCCC;} .cm-s-the-matrix span.cm-string {color: #39C;} .cm-s-the-matrix span.cm-meta {color: #C9F;} .cm-s-the-matrix span.cm-qualifier {color: #FFF700;} .cm-s-the-matrix span.cm-builtin {color: #30a;} .cm-s-the-matrix span.cm-bracket {color: #cc7;} .cm-s-the-matrix span.cm-tag {color: #FFBD40;} .cm-s-the-matrix span.cm-attribute {color: #FFF700;} .cm-s-the-matrix span.cm-error {color: #FF0000;} .cm-s-the-matrix .CodeMirror-activeline-background {background: #040;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/tomorrow-night-eighties.css ================================================ /* Name: Tomorrow Night - Eighties Author: Chris Kempson CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-tomorrow-night-eighties.CodeMirror {background: #000000; color: #CCCCCC;} .cm-s-tomorrow-night-eighties div.CodeMirror-selected {background: #2D2D2D !important;} .cm-s-tomorrow-night-eighties .CodeMirror-gutters {background: #000000; border-right: 0px;} .cm-s-tomorrow-night-eighties .CodeMirror-linenumber {color: #515151;} .cm-s-tomorrow-night-eighties .CodeMirror-cursor {border-left: 1px solid #6A6A6A !important;} .cm-s-tomorrow-night-eighties span.cm-comment {color: #d27b53;} .cm-s-tomorrow-night-eighties span.cm-atom {color: #a16a94;} .cm-s-tomorrow-night-eighties span.cm-number {color: #a16a94;} .cm-s-tomorrow-night-eighties span.cm-property, .cm-s-tomorrow-night-eighties span.cm-attribute {color: #99cc99;} .cm-s-tomorrow-night-eighties span.cm-keyword {color: #f2777a;} .cm-s-tomorrow-night-eighties span.cm-string {color: #ffcc66;} .cm-s-tomorrow-night-eighties span.cm-variable {color: #99cc99;} .cm-s-tomorrow-night-eighties span.cm-variable-2 {color: #6699cc;} .cm-s-tomorrow-night-eighties span.cm-def {color: #f99157;} .cm-s-tomorrow-night-eighties span.cm-bracket {color: #CCCCCC;} .cm-s-tomorrow-night-eighties span.cm-tag {color: #f2777a;} .cm-s-tomorrow-night-eighties span.cm-link {color: #a16a94;} .cm-s-tomorrow-night-eighties span.cm-error {background: #f2777a; color: #6A6A6A;} .cm-s-tomorrow-night-eighties .CodeMirror-activeline-background {background: #343600 !important;} .cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/twilight.css ================================================ .cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/ .cm-s-twilight .CodeMirror-selected { background: #323232 !important; } /**/ .cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; } .cm-s-twilight .CodeMirror-linenumber { color: #aaa; } .cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-twilight .cm-keyword { color: #f9ee98; } /**/ .cm-s-twilight .cm-atom { color: #FC0; } .cm-s-twilight .cm-number { color: #ca7841; } /**/ .cm-s-twilight .cm-def { color: #8DA6CE; } .cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/ .cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def { color: #607392; } /**/ .cm-s-twilight .cm-operator { color: #cda869; } /**/ .cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/ .cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/ .cm-s-twilight .cm-string-2 { color:#bd6b18 } /*?*/ .cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/ .cm-s-twilight .cm-builtin { color: #cda869; } /*?*/ .cm-s-twilight .cm-tag { color: #997643; } /**/ .cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/ .cm-s-twilight .cm-header { color: #FF6400; } .cm-s-twilight .cm-hr { color: #AEAEAE; } .cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/ .cm-s-twilight .cm-error { border-bottom: 1px solid red; } .cm-s-twilight .CodeMirror-activeline-background {background: #27282E !important;} .cm-s-twilight .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/vibrant-ink.css ================================================ /* Taken from the popular Visual Studio Vibrant Ink Schema */ .cm-s-vibrant-ink.CodeMirror { background: black; color: white; } .cm-s-vibrant-ink .CodeMirror-selected { background: #35493c !important; } .cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } .cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; } .cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-vibrant-ink .cm-keyword { color: #CC7832; } .cm-s-vibrant-ink .cm-atom { color: #FC0; } .cm-s-vibrant-ink .cm-number { color: #FFEE98; } .cm-s-vibrant-ink .cm-def { color: #8DA6CE; } .cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D } .cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def { color: #FFC66D } .cm-s-vibrant-ink .cm-operator { color: #888; } .cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; } .cm-s-vibrant-ink .cm-string { color: #A5C25C } .cm-s-vibrant-ink .cm-string-2 { color: red } .cm-s-vibrant-ink .cm-meta { color: #D8FA3C; } .cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; } .cm-s-vibrant-ink .cm-tag { color: #8DA6CE; } .cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; } .cm-s-vibrant-ink .cm-header { color: #FF6400; } .cm-s-vibrant-ink .cm-hr { color: #AEAEAE; } .cm-s-vibrant-ink .cm-link { color: blue; } .cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; } .cm-s-vibrant-ink .CodeMirror-activeline-background {background: #27282E !important;} .cm-s-vibrant-ink .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/xq-dark.css ================================================ /* Copyright (C) 2011 by MarkLogic Corporation Author: Mike Brevoort Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ .cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; } .cm-s-xq-dark .CodeMirror-selected { background: #27007A !important; } .cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } .cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; } .cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-xq-dark span.cm-keyword {color: #FFBD40;} .cm-s-xq-dark span.cm-atom {color: #6C8CD5;} .cm-s-xq-dark span.cm-number {color: #164;} .cm-s-xq-dark span.cm-def {color: #FFF; text-decoration:underline;} .cm-s-xq-dark span.cm-variable {color: #FFF;} .cm-s-xq-dark span.cm-variable-2 {color: #EEE;} .cm-s-xq-dark span.cm-variable-3 {color: #DDD;} .cm-s-xq-dark span.cm-property {} .cm-s-xq-dark span.cm-operator {} .cm-s-xq-dark span.cm-comment {color: gray;} .cm-s-xq-dark span.cm-string {color: #9FEE00;} .cm-s-xq-dark span.cm-meta {color: yellow;} .cm-s-xq-dark span.cm-qualifier {color: #FFF700;} .cm-s-xq-dark span.cm-builtin {color: #30a;} .cm-s-xq-dark span.cm-bracket {color: #cc7;} .cm-s-xq-dark span.cm-tag {color: #FFBD40;} .cm-s-xq-dark span.cm-attribute {color: #FFF700;} .cm-s-xq-dark span.cm-error {color: #f00;} .cm-s-xq-dark .CodeMirror-activeline-background {background: #27282E !important;} .cm-s-xq-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/CodeMirror/theme/xq-light.css ================================================ /* Copyright (C) 2011 by MarkLogic Corporation Author: Mike Brevoort Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ .cm-s-xq-light span.cm-keyword {line-height: 1em; font-weight: bold; color: #5A5CAD; } .cm-s-xq-light span.cm-atom {color: #6C8CD5;} .cm-s-xq-light span.cm-number {color: #164;} .cm-s-xq-light span.cm-def {text-decoration:underline;} .cm-s-xq-light span.cm-variable {color: black; } .cm-s-xq-light span.cm-variable-2 {color:black;} .cm-s-xq-light span.cm-variable-3 {color: black; } .cm-s-xq-light span.cm-property {} .cm-s-xq-light span.cm-operator {} .cm-s-xq-light span.cm-comment {color: #0080FF; font-style: italic;} .cm-s-xq-light span.cm-string {color: red;} .cm-s-xq-light span.cm-meta {color: yellow;} .cm-s-xq-light span.cm-qualifier {color: grey} .cm-s-xq-light span.cm-builtin {color: #7EA656;} .cm-s-xq-light span.cm-bracket {color: #cc7;} .cm-s-xq-light span.cm-tag {color: #3F7F7F;} .cm-s-xq-light span.cm-attribute {color: #7F007F;} .cm-s-xq-light span.cm-error {color: #f00;} .cm-s-xq-light .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-xq-light .CodeMirror-matchingbracket {outline:1px solid grey;color:black !important;background:yellow;} ================================================ FILE: Open Judge System/Web/OJS.Web/Content/Contests/results-page.css ================================================ .table-bordered th { padding: 10px; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/Contests/submission-page.css ================================================ .problem_submit_grid .k-grid-top { line-height: 25px; text-align: center; } .row { margin-bottom: 10px; } .row .k-widget * { -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important; } .resource-glyph { margin-right: 5px; padding-left: 5px; } .resource-link { padding-right: 5px; border-right: 1px solid grey; } .materials { margin-bottom: 10px; } .alert { padding: 10px; } .countdown-warning { color: rgb(204, 21, 21) !important; } #countdown-timer { display: none; } .submit-container { margin: 6px; } .submision-submit-button { padding-top: 0; padding-bottom: 1px; } .view-submission-button { padding: 5px; margin: 0 5px; } .problem-result-container .k-grid td { white-space: nowrap; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis; text-overflow: ellipsis; max-width: 120px; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/Contests/submission-view-page.css ================================================ .CodeMirror-merge, .CodeMirror-merge .CodeMirror { height: 150px; } .CodeMirror-merge .CodeMirror-code { color: #fff; } .CodeMirror-merge-l-chunk-end, .CodeMirror-merge-l-chunk-start { border: none; } .CodeMirror-merge-l-chunk { background: transparent; } .CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 50%; } .CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 0; } .diff { padding: 10px; background-color: #AAA; border-color: #AAA; color: black; } span.CodeMirror-merge-l-deleted { background: none; background-color: rgb(199, 13, 13); } span.CodeMirror-merge-l-inserted { background: none; background-color: rgb(12, 108, 12); } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/KendoUI/kendo.black.css ================================================ /* * Kendo UI v2014.3.1411 (http://www.telerik.com/kendo-ui) * Copyright 2015 Telerik AD. All rights reserved. * * Kendo UI commercial licenses may be obtained at * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete * If you do not own a commercial license, this file shall be governed by the trial license terms. */ /* Widget Base Styles */ /* Selects, Dropdowns */ /* Inputs */ /* Links */ /* Headers */ /* Buttons */ /* Group Base Styles */ /* Content */ /* Widget States */ /* Hover State */ /* Selected State */ /*Focused State*/ /* Active State */ /* Error State */ /* Disabled State */ /* Notification */ /* ToolTip */ /* Validation Message */ /* Splitter */ /* Slider */ /* Grid */ /* Scheduler */ /* Upload */ /* Gantt*/ /* Loading Indicators */ /* Shadows */ /* Border Radii */ /* Icons */ /* Kendo skin */ .k-in, .k-item, .k-window-action { border-color: transparent; } /* main colors */ .k-block, .k-widget { background-color: #4d4d4d; } .k-block, .k-widget, .k-input, .k-textbox, .k-group, .k-content, .k-header, .k-filter-row > th, .k-editable-area, .k-separator, .k-colorpicker .k-i-arrow-s, .k-textbox > input, .k-autocomplete, .k-dropdown-wrap, .k-toolbar, .k-group-footer td, .k-grid-footer, .k-footer-template td, .k-state-default, .k-state-default .k-select, .k-state-disabled, .k-grid-header, .k-grid-header-wrap, .k-grid-header-locked, .k-grid-footer-locked, .k-grid-content-locked, .k-grid td, .k-grid td.k-state-selected, .k-grid-footer-wrap, .k-pager-wrap, .k-pager-wrap .k-link, .k-pager-refresh, .k-grouping-header, .k-grouping-header .k-group-indicator, .k-panelbar > .k-item > .k-link, .k-panel > .k-item > .k-link, .k-panelbar .k-panel, .k-panelbar .k-content, .k-treemap-tile, .k-calendar th, .k-slider-track, .k-splitbar, .k-dropzone-active, .k-tiles, .k-toolbar, .k-tooltip, .k-button-group .k-tool, .k-upload-files { border-color: #2b2b2b; } .k-group, .k-toolbar, .k-grouping-header, .k-pager-wrap, .k-group-footer td, .k-grid-footer, .k-footer-template td, .k-widget .k-status, .k-calendar th, .k-dropzone-hovered, .k-widget.k-popup { background-color: #555555; } .k-grouping-row td, td.k-group-cell, .k-resize-handle-inner { background-color: #1d1d1d; } .k-list-container { border-color: #2b2b2b; background-color: #272727; } .k-content, .k-editable-area, .k-panelbar > li.k-item, .k-panel > li.k-item, .k-tiles { background-color: #3d3d3d; } .k-alt, .k-separator, .k-resource.k-alt, .k-pivot-layout > tbody > tr:first-child > td:first-child { background-color: #525252; } .k-pivot-rowheaders .k-alt .k-alt, .k-header.k-alt { background-color: #666666; } .k-textbox, .k-autocomplete.k-header, .k-dropdown-wrap.k-state-active, .k-picker-wrap.k-state-active, .k-numeric-wrap.k-state-active { border-color: #2b2b2b; background-color: #272727; } .k-textbox > input, .k-autocomplete .k-input, .k-dropdown-wrap .k-input, .k-autocomplete.k-state-focused .k-input, .k-dropdown-wrap.k-state-focused .k-input, .k-picker-wrap.k-state-focused .k-input, .k-numeric-wrap.k-state-focused .k-input { border-color: #2b2b2b; } input.k-textbox, textarea.k-textbox, input.k-textbox:hover, textarea.k-textbox:hover, .k-textbox > input { background: none; } .k-input, input.k-textbox, textarea.k-textbox, input.k-textbox:hover, textarea.k-textbox:hover, .k-textbox > input, .k-multiselect-wrap { background-color: #ffffff; color: #181818; } .k-input[readonly] { background-color: #ffffff; color: #181818; } .k-block, .k-widget, .k-popup, .k-content, .k-toolbar, .k-dropdown .k-input { color: #ffffff; } .k-inverse { color: #000000; } .k-block { color: #ffffff; } .k-link:link, .k-link:visited, .k-nav-current.k-state-hover .k-link { color: #ffffff; } .k-tabstrip-items .k-link, .k-panelbar > li > .k-link { color: #ffffff; } .k-header, .k-treemap-title, .k-grid-header .k-header > .k-link { color: #ffffff; } .k-header, .k-grid-header, .k-toolbar, .k-dropdown-wrap, .k-picker-wrap, .k-numeric-wrap, .k-grouping-header, .k-pager-wrap, .k-textbox, .k-button, .k-progressbar, .k-draghandle, .k-autocomplete, .k-state-highlight, .k-tabstrip-items .k-item, .k-panelbar .k-tabstrip-items .k-item, .km-pane-wrapper > .km-pane > .km-view > .km-content { background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, -moz-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, -o-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, linear-gradient(to bottom, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-position: 50% 50%; background-color: #1d1d1d; } .k-widget.k-tooltip { background-image: url('textures/highlight.png'); } .k-block, .k-header, .k-grid-header, .k-toolbar, .k-grouping-header, .k-pager-wrap, .k-button, .k-draghandle, .k-treemap-tile, html .km-pane-wrapper .k-header { background-color: #1d1d1d; } /* icons */ .k-icon:hover, .k-state-hover .k-icon, .k-state-selected .k-icon, .k-state-focused .k-icon, .k-column-menu .k-state-hover .k-sprite, .k-column-menu .k-state-active .k-sprite { opacity: 1; } .k-icon, .k-state-disabled .k-icon, .k-column-menu .k-sprite { opacity: 0.85; } .k-mobile-list .k-check:checked, .k-mobile-list .k-edit-field [type=checkbox]:checked, .k-mobile-list .k-edit-field [type=radio]:checked { opacity: 0.85; } .k-tool { border-color: transparent; } .k-icon, .k-tool-icon, .k-grouping-dropclue, .k-drop-hint, .k-column-menu .k-sprite, .k-grid-mobile .k-resize-handle-inner:before, .k-grid-mobile .k-resize-handle-inner:after { background-image: url('Black/sprite.png'); border-color: transparent; } /* IE will ignore the above selectors if these are added too */ .k-mobile-list .k-check:checked, .k-mobile-list .k-edit-field [type=checkbox]:checked, .k-mobile-list .k-edit-field [type=radio]:checked { background-image: url('Black/sprite.png'); border-color: transparent; } .k-loading, .k-state-hover .k-loading { background-image: url('Black/loading.gif'); background-position: 50% 50%; } .k-loading-image { background-image: url('Black/loading-image.gif'); } .k-loading-color { background-color: #666666; } .k-button { color: #ffffff; border-color: #2b2b2b; background-color: #272727; } .k-draghandle { border-color: #2b2b2b; background-color: #4d4d4d; -webkit-box-shadow: none; box-shadow: none; } .k-draghandle:hover { border-color: #2b2b2b; background-color: #3d3d3d; -webkit-box-shadow: none; box-shadow: none; } /* Scheduler */ .k-scheduler { color: #ffffff; background-color: #272727; } .k-scheduler-layout { color: #ffffff; } .k-scheduler-datecolumn, .k-scheduler-groupcolumn { background-color: #272727; color: #ffffff; } .k-scheduler-times tr, .k-scheduler-times th, .k-scheduler-table td, .k-scheduler-header th, .k-scheduler-header-wrap, .k-scheduler-times { border-color: #444444; } .k-nonwork-hour { background-color: #363636; } .k-gantt .k-nonwork-hour { background-color: rgba(0, 0, 0, 0.02); } .k-gantt .k-header.k-nonwork-hour { background-color: rgba(0, 0, 0, 0.2); } .k-scheduler-table .k-today, .k-today > .k-scheduler-datecolumn, .k-today > .k-scheduler-groupcolumn { background-color: #303030; } .k-scheduler-now-arrow { border-left-color: #ff0000; } .k-scheduler-now-line { background-color: #ff0000; } .k-event, .k-task-complete { border-color: #0167cc; background: #0167cc 0 -257px url('textures/highlight.png') repeat-x; color: #ffffff; } .k-event-inverse { color: #272727; } .k-event.k-state-selected { background-position: 0 0; } .k-ie7 .k-event .k-resize-handle, .k-event .k-resize-handle:after, .k-ie7 .k-task-single .k-resize-handle, .k-task-single .k-resize-handle:after { background-color: #ffffff; } .k-scheduler-marquee:before, .k-scheduler-marquee:after { border-color: #0066cc; } .k-panelbar .k-content, .k-panelbar .k-panel, .k-panelbar .k-item { background-color: #3d3d3d; color: #ffffff; border-color: #2b2b2b; } .k-panelbar > li > .k-link { color: #ffffff; } .k-panelbar > .k-item > .k-link { border-color: #2b2b2b; } .k-panel > li.k-item { background-color: #3d3d3d; } /* states */ .k-state-active, .k-state-active:hover, .k-active-filter, .k-tabstrip .k-state-active { background-color: #4d4d4d; border-color: #020202; color: #ffffff; } .k-fieldselector .k-list-container { background-color: #4d4d4d; } .k-button:focus, .k-button.k-state-focused { border-color: #2b2b2b; } .k-button:hover, .k-button.k-state-hover { color: #ffffff; border-color: #2b2b2b; background-color: #3d3d3d; } .k-button:active, .k-button.k-state-active { color: #ffffff; background-color: #0066cc; border-color: #0066cc; } .k-button:active:hover, .k-button.k-state-active:hover { color: #ffffff; border-color: #145cbc; background-color: #004eb6; } .k-button[disabled], .k-button.k-state-disabled, .k-state-disabled .k-button, .k-state-disabled .k-button:hover, .k-button.k-state-disabled:hover, .k-state-disabled .k-button:active, .k-button.k-state-disabled:active { color: #7a7a7a; border-color: #2b2b2b; background-color: #272727; background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, -moz-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, -o-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, linear-gradient(to bottom, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); } .k-button:focus:not(.k-state-disabled):not([disabled]) { -webkit-box-shadow: inset 0 0 3px 1px #080808; box-shadow: inset 0 0 3px 1px #080808; } .k-button:focus:active:not(.k-state-disabled):not([disabled]) { -webkit-box-shadow: inset 0 0 3px 1px #004080; box-shadow: inset 0 0 3px 1px #004080; } .k-menu .k-state-hover > .k-state-active { background-color: transparent; } .k-state-highlight { background: #4d4d4d; color: #ffffff; } .k-state-focused, .k-grouping-row .k-state-focused { border-color: #2b2b2b; } .k-calendar .k-link { color: #ffffff; } .k-calendar .k-footer { padding: 0; } .k-calendar .k-footer .k-nav-today { color: #ffffff; text-decoration: none; background-color: #4d4d4d; } .k-calendar .k-footer .k-nav-today:hover, .k-calendar .k-footer .k-nav-today.k-state-hover { background-color: #4d4d4d; text-decoration: underline; } .k-calendar .k-footer .k-nav-today:active { background-color: #4d4d4d; } .k-calendar .k-link.k-nav-fast { color: #ffffff; } .k-calendar .k-nav-fast.k-state-hover { text-decoration: none; background-color: #3d3d3d; color: #ffffff; } .k-calendar .k-link.k-state-hover, .k-window-titlebar .k-link { border-radius: 4px; } .k-calendar .k-footer .k-link { border-radius: 0; } .k-calendar th { background-color: #555555; } .k-calendar-container.k-group { border-color: #2b2b2b; } .k-state-selected, .k-state-selected:link, .k-state-selected:visited, .k-list > .k-state-selected, .k-list > .k-state-highlight, .k-panel > .k-state-selected, .k-ghost-splitbar-vertical, .k-ghost-splitbar-horizontal, .k-draghandle.k-state-selected:hover, .k-scheduler .k-scheduler-toolbar .k-state-selected, .k-scheduler .k-today.k-state-selected, .k-marquee-color { color: #ffffff; background-color: #0066cc; border-color: #0066cc; } .k-marquee-text { color: #ffffff; } .k-state-focused, .k-list > .k-state-focused, .k-listview > .k-state-focused, .k-grid-header th.k-state-focused, td.k-state-focused, .k-button.k-state-focused { -webkit-box-shadow: inset 0 0 3px 1px #080808; box-shadow: inset 0 0 3px 1px #080808; } .k-state-focused.k-state-selected, .k-list > .k-state-focused.k-state-selected, .k-listview > .k-state-focused.k-state-selected, td.k-state-focused.k-state-selected { -webkit-box-shadow: inset 0 0 3px 1px #004080; box-shadow: inset 0 0 3px 1px #004080; } .k-ie8 .k-panelbar span.k-state-focused, .k-ie8 .k-menu li.k-state-focused, .k-ie8 .k-listview > .k-state-focused, .k-ie8 .k-grid-header th.k-state-focused, .k-ie8 td.k-state-focused, .k-ie8 .k-tool.k-state-hover, .k-ie8 .k-button:focus, .k-ie8 .k-button.k-state-focused, .k-ie7 .k-panelbar span.k-state-focused, .k-ie7 .k-menu li.k-state-focused, .k-ie7 .k-listview > .k-state-focused, .k-ie7 .k-grid-header th.k-state-focused, .k-ie7 td.k-state-focused, .k-ie7 .k-tool.k-state-hover, .k-ie7 .k-button:focus, .k-ie7 .k-button.k-state-focused { background-color: #3d3d3d; } .k-list > .k-state-selected.k-state-focused { -webkit-box-shadow: none; box-shadow: none; } .k-state-selected > .k-link, .k-panelbar > li > .k-state-selected, .k-panelbar > li.k-state-default > .k-link.k-state-selected { color: #ffffff; } .k-state-hover, .k-state-hover:hover, .k-splitbar-horizontal-hover:hover, .k-splitbar-vertical-hover:hover, .k-list > .k-state-hover, .k-scheduler .k-scheduler-toolbar ul li.k-state-hover, .k-pager-wrap .k-link:hover, .k-dropdown .k-state-focused, .k-filebrowser-dropzone, .k-mobile-list .k-item > .k-link:active, .k-mobile-list .k-item > .k-label:active, .k-mobile-list .k-edit-label.k-check:active, .k-mobile-list .k-recur-view .k-check:active { color: #ffffff; background-color: #3d3d3d; border-color: #2b2b2b; } /* this selector should be used separately, otherwise old IEs ignore the whole rule */ .k-mobile-list .k-scheduler-timezones .k-edit-field:nth-child(2):active { color: #ffffff; background-color: #3d3d3d; border-color: #2b2b2b; } .k-ie7 .k-window-titlebar .k-state-hover, .k-ie8 .k-window-titlebar .k-state-hover { border-color: #2b2b2b; } .k-state-hover > .k-select, .k-state-focused > .k-select { border-color: #2b2b2b; } .k-button:hover, .k-button.k-state-hover, .k-button:focus, .k-button.k-state-focused, .k-textbox:hover, .k-state-hover, .k-state-hover:hover, .k-pager-wrap .k-link:hover, .k-other-month.k-state-hover .k-link, div.k-filebrowser-dropzone em, .k-draghandle:hover { background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, -moz-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, -o-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, linear-gradient(to bottom, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); } .k-pager-wrap { background-color: #1d1d1d; color: #ffffff; } .k-autocomplete.k-state-active, .k-picker-wrap.k-state-active, .k-numeric-wrap.k-state-active, .k-dropdown-wrap.k-state-active, .k-state-active, .k-state-active:hover, .k-state-active > .k-link, .k-button:active, .k-panelbar > .k-item > .k-state-focused { background-image: none; } .k-state-selected, .k-button:active, .k-button.k-state-active, .k-draghandle.k-state-selected:hover { background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, -moz-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, -o-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, linear-gradient(to bottom, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); } .k-button:active, .k-button.k-state-active, .k-draghandle.k-state-selected:hover { background-position: 50% 50%; } .k-tool-icon { background-image: url('Black/sprite.png'); } .k-state-hover > .k-link, .k-other-month.k-state-hover .k-link, div.k-filebrowser-dropzone em { color: #ffffff; } .k-autocomplete.k-state-hover, .k-autocomplete.k-state-focused, .k-picker-wrap.k-state-hover, .k-picker-wrap.k-state-focused, .k-numeric-wrap.k-state-hover, .k-numeric-wrap.k-state-focused, .k-dropdown-wrap.k-state-hover, .k-dropdown-wrap.k-state-focused { background-color: #080808; background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, -moz-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, -o-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, linear-gradient(to bottom, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-position: 50% 50%; border-color: #2b2b2b; } .km-pane-wrapper .k-mobile-list input:not([type="checkbox"]):not([type="radio"]), .km-pane-wrapper .km-pane .k-mobile-list select:not([multiple]), .km-pane-wrapper .k-mobile-list textarea, .k-dropdown .k-state-focused .k-input { color: #ffffff; } .k-dropdown .k-state-hover .k-input { color: #ffffff; } .k-state-error { border-color: #ff0000; background-color: #ff0000; color: #ffffff; } .k-state-disabled { opacity: .7; } .k-ie7 .k-state-disabled, .k-ie8 .k-state-disabled { filter: alpha(opacity=70); } .k-tile-empty.k-state-selected, .k-loading-mask.k-state-selected { border-width: 0; background-image: none; background-color: transparent; } .k-state-disabled, .k-state-disabled .k-link, .k-state-disabled .k-button, .k-other-month, .k-other-month .k-link, .k-dropzone em, .k-dropzone .k-upload-status, .k-tile-empty strong, .k-slider .k-draghandle { color: #7a7a7a; } /* Progressbar */ .k-progressbar-indeterminate { background: url('Black/indeterminate.gif'); } .k-progressbar-indeterminate .k-progress-status-wrap, .k-progressbar-indeterminate .k-state-selected { display: none; } /* Slider */ .k-slider-track { background-color: #2b2b2b; } .k-slider-selection { background-color: #0066cc; } .k-slider-horizontal .k-tick { background-image: url('Black/slider-h.gif'); } .k-slider-vertical .k-tick { background-image: url('Black/slider-v.gif'); } /* Tooltip */ .k-widget.k-tooltip { border-color: #000000; background-color: #000000; color: #ffffff; } .k-widget.k-tooltip-validation { border-color: #ffb400; background-color: #ffb400; color: #080808; } /* Bootstrap theme fix */ .input-prepend .k-tooltip-validation, .input-append .k-tooltip-validation { font-size: 12px; position: relative; top: 3px; } .k-callout-n { border-bottom-color: #000000; } .k-callout-w { border-right-color: #000000; } .k-callout-s { border-top-color: #000000; } .k-callout-e { border-left-color: #000000; } .k-tooltip-validation .k-callout-n { border-bottom-color: #ffb400; } .k-tooltip-validation .k-callout-w { border-right-color: #ffb400; } .k-tooltip-validation .k-callout-s { border-top-color: #ffb400; } .k-tooltip-validation .k-callout-e { border-left-color: #ffb400; } /* Splitter */ .k-splitbar { background-color: #4c4c4c; } .k-restricted-size-vertical, .k-restricted-size-horizontal { background-color: #ffffff; } /* Upload */ .k-file { background-color: #4d4d4d; border-color: #444444; } .k-file-progress { color: #ffffff; } .k-file-progress .k-progress { background-color: #366ba0; } .k-file-success { color: #ffffff; } .k-file-success .k-progress { background-color: #3f8b66; } .k-file-error { color: #ffffff; } .k-file-error .k-progress { background-color: #aa2929; } /* ImageBrowser */ .k-tile { border-color: #3d3d3d; } .k-textbox:hover, .k-tiles li.k-state-hover { border-color: #2b2b2b; } .k-tiles li.k-state-selected { border-color: #0066cc; } .k-filebrowser .k-tile .k-folder, .k-filebrowser .k-tile .k-file { background-image: url('Black/imagebrowser.png'); background-size: auto auto; } /* TreeMap */ .k-leaf, .k-leaf.k-state-hover:hover { color: #fff; } .k-leaf.k-inverse, .k-leaf.k-inverse.k-state-hover:hover { color: #000; } /* Shadows */ .k-widget, .k-button { -webkit-box-shadow: none; box-shadow: none; } .k-slider, .k-treeview, .k-upload { -webkit-box-shadow: none; box-shadow: none; } .k-state-hover { -webkit-box-shadow: none; box-shadow: none; } .k-autocomplete.k-state-focused, .k-dropdown-wrap.k-state-focused, .k-picker-wrap.k-state-focused, .k-numeric-wrap.k-state-focused { -webkit-box-shadow: 0 0 3px 0 #0066cc; box-shadow: 0 0 3px 0 #0066cc; } .k-state-selected { -webkit-box-shadow: none; box-shadow: none; } .k-state-active { -webkit-box-shadow: none; box-shadow: none; } .k-grid td.k-state-selected.k-state-focused { background-color: #006edb; } .k-popup, .k-menu .k-menu-group, .k-grid .k-filter-options, .k-time-popup, .k-datepicker-calendar, .k-autocomplete.k-state-border-down, .k-autocomplete.k-state-border-up, .k-dropdown-wrap.k-state-active, .k-picker-wrap.k-state-active, .k-multiselect.k-state-focused, .k-filebrowser .k-image, .k-tooltip { -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.3); box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.3); } .k-treemap-tile.k-state-hover { -webkit-box-shadow: inset 0 0 0 3px #2b2b2b; box-shadow: inset 0 0 0 3px #2b2b2b; } /* Window */ .k-window { border-color: rgba(0, 0, 0, 0.3); -webkit-box-shadow: 1px 1px 7px 1px rgba(128, 128, 128, 0.3); box-shadow: 1px 1px 7px 1px rgba(128, 128, 128, 0.3); background-color: #4d4d4d; } .k-window.k-state-focused { border-color: rgba(0, 0, 0, 0.3); -webkit-box-shadow: 1px 1px 7px 1px rgba(0, 0, 0, 0.3); box-shadow: 1px 1px 7px 1px rgba(0, 0, 0, 0.3); } .k-window.k-window-maximized, .k-window-maximized .k-window-titlebar, .k-window-maximized .k-window-content { border-radius: 0; } .k-shadow { -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.3); box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.3); } .k-inset { -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.3); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.3); } /* Selection */ .k-editor-inline ::selection { background-color: #0066cc; text-shadow: none; color: #fff; } .k-editor-inline ::-moz-selection { background-color: #0066cc; text-shadow: none; color: #fff; } /* Notification */ .k-notification.k-notification-info { background-color: #0c779b; color: #ffffff; border-color: #0c779b; } .k-notification.k-notification-success { background-color: #2b893c; color: #ffffff; border-color: #2b893c; } .k-notification.k-notification-warning { background-color: #be9938; color: #ffffff; border-color: #be9938; } .k-notification.k-notification-error { background-color: #be5138; color: #ffffff; border-color: #be5138; } /* Gantt */ .k-gantt .k-treelist { background: #525252; } .k-gantt .k-treelist .k-alt { background-color: #393939; } .k-gantt .k-treelist .k-state-selected, .k-gantt .k-treelist .k-state-selected td, .k-gantt .k-treelist .k-alt.k-state-selected, .k-gantt .k-treelist .k-alt.k-state-selected > td { background-color: #0066cc; } .k-task-dot:after { background-color: #ffffff; border-color: #ffffff; } .k-task-dot:hover:after { background-color: #4d4d4d; } .k-task-summary { border-color: #bfbfbf; background: #bfbfbf; } .k-task-milestone, .k-task-summary-complete { border-color: #ffffff; background: #ffffff; } .k-state-selected.k-task-summary { border-color: #00264d; background: #00264d; } .k-state-selected.k-task-milestone, .k-state-selected .k-task-summary-complete { border-color: #0066cc; background: #0066cc; } .k-task-single { background-color: #0179f0; border-color: #0167cc; color: #ffffff; } .k-state-selected.k-task-single { border-color: #0066cc; } .k-line { background-color: #ffffff; color: #ffffff; } .k-state-selected.k-line { background-color: #0066cc; color: #0066cc; } .k-resource { background-color: #4d4d4d; } /* PivotGrid */ .k-i-kpi-decrease, .k-i-kpi-denied, .k-i-kpi-equal, .k-i-kpi-hold, .k-i-kpi-increase, .k-i-kpi-open { background-image: url('Black/sprite_kpi.png'); } /* Border radius */ .k-block, .k-button, .k-textbox, .k-drag-clue, .k-touch-scrollbar, .k-window, .k-window-titleless .k-window-content, .k-window-action, .k-inline-block, .k-grid .k-filter-options, .k-grouping-header .k-group-indicator, .k-autocomplete, .k-multiselect, .k-combobox, .k-dropdown, .k-dropdown-wrap, .k-datepicker, .k-timepicker, .k-colorpicker, .k-datetimepicker, .k-notification, .k-numerictextbox, .k-picker-wrap, .k-numeric-wrap, .k-colorpicker, .k-list-container, .k-calendar-container, .k-calendar td, .k-calendar .k-link, .k-treeview .k-in, .k-editor-inline, .k-tooltip, .k-tile, .k-slider-track, .k-slider-selection, .k-upload { border-radius: 4px; } .k-tool { text-align: center; vertical-align: middle; } .k-tool.k-group-start, .k-toolbar .k-split-button .k-button, .k-toolbar .k-button-group .k-group-start { border-radius: 4px 0 0 4px; } .k-rtl .k-tool.k-group-start { border-radius: 0 4px 4px 0; } .k-tool.k-group-end, .k-toolbar .k-button-group .k-group-end, .k-toolbar .k-split-button .k-split-button-arrow { border-radius: 0 4px 4px 0; } .k-rtl .k-tool.k-group-end { border-radius: 4px 0 0 4px; } .k-group-start.k-group-end.k-tool { border-radius: 4px; } .k-calendar-container.k-state-border-up, .k-list-container.k-state-border-up, .k-autocomplete.k-state-border-up, .k-multiselect.k-state-border-up, .k-dropdown-wrap.k-state-border-up, .k-picker-wrap.k-state-border-up, .k-numeric-wrap.k-state-border-up, .k-window-content, .k-filter-menu { border-radius: 0 0 4px 4px; } .k-autocomplete.k-state-border-up .k-input, .k-dropdown-wrap.k-state-border-up .k-input, .k-picker-wrap.k-state-border-up .k-input, .k-picker-wrap.k-state-border-up .k-selected-color, .k-numeric-wrap.k-state-border-up .k-input { border-radius: 0 0 0 4px; } .k-multiselect.k-state-border-up .k-multiselect-wrap { border-radius: 0 0 4px 4px; } .k-window-titlebar, .k-block > .k-header, .k-tabstrip-items .k-item, .k-panelbar .k-tabstrip-items .k-item, .k-tabstrip-items .k-link, .k-calendar-container.k-state-border-down, .k-list-container.k-state-border-down, .k-autocomplete.k-state-border-down, .k-multiselect.k-state-border-down, .k-dropdown-wrap.k-state-border-down, .k-picker-wrap.k-state-border-down, .k-numeric-wrap.k-state-border-down { border-radius: 4px 4px 0 0; } .k-split-button.k-state-border-down > .k-button { border-radius: 4px 0 0 0; } .k-split-button.k-state-border-up > .k-button { border-radius: 0 0 0 4px; } .k-split-button.k-state-border-down > .k-split-button-arrow { border-radius: 0 4px 0 0; } .k-split-button.k-state-border-up > .k-split-button-arrow { border-radius: 0 0 4px 0; } .k-dropdown-wrap .k-input, .k-picker-wrap .k-input, .k-numeric-wrap .k-input { border-radius: 3px 0 0 3px; } .k-rtl .k-dropdown-wrap .k-input, .k-rtl .k-picker-wrap .k-input, .k-rtl .k-numeric-wrap .k-input { border-radius: 0 3px 3px 0; } .k-numeric-wrap .k-link { border-radius: 0 3px 0 0; } .k-numeric-wrap .k-link + .k-link { border-radius: 0 0 3px 0; } .k-colorpicker .k-selected-color { border-radius: 3px 0 0 3px; } .k-rtl .k-colorpicker .k-selected-color { border-radius: 0 3px 3px 0; } .k-autocomplete.k-state-border-down .k-input { border-radius: 4px 4px 0 0; } .k-dropdown-wrap.k-state-border-down .k-input, .k-picker-wrap.k-state-border-down .k-input, .k-picker-wrap.k-state-border-down .k-selected-color, .k-numeric-wrap.k-state-border-down .k-input { border-radius: 4px 0 0 0; } .k-numeric-wrap .k-link.k-state-selected { background-color: #0066cc; } .k-multiselect.k-state-border-down .k-multiselect-wrap { border-radius: 3px 3px 0 0; } .k-dropdown-wrap .k-select, .k-picker-wrap .k-select, .k-numeric-wrap .k-select, .k-datetimepicker .k-select + .k-select, .k-list-container.k-state-border-right { border-radius: 0 4px 4px 0; } .k-rtl .k-dropdown-wrap .k-select, .k-rtl .k-picker-wrap .k-select, .k-rtl .k-numeric-wrap .k-select, .k-rtl .k-datetimepicker .k-select + .k-select, .k-rtl .k-list-container.k-state-border-right { border-radius: 4px 0 0 4px; } .k-numeric-wrap.k-expand-padding .k-input { border-radius: 4px; } .k-textbox > input, .k-autocomplete .k-input, .k-multiselect-wrap { border-radius: 3px; } .k-list .k-state-hover, .k-list .k-state-focused, .k-list .k-state-highlight, .k-list .k-state-selected, .k-fieldselector .k-list .k-item, .k-dropzone { border-radius: 3px; } .k-slider .k-button, .k-grid .k-slider .k-button { border-radius: 13px; } .k-draghandle { border-radius: 7px; } .k-scheduler-toolbar > ul li:first-child, .k-scheduler-toolbar > ul li:first-child .k-link { border-radius: 4px 0 0 4px; } .k-rtl .k-scheduler-toolbar > ul li:first-child, .k-rtl .k-scheduler-toolbar > ul li:first-child .k-link, .km-view.k-popup-edit-form .k-scheduler-toolbar > ul li:last-child, .km-view.k-popup-edit-form .k-scheduler-toolbar > ul li:last-child .k-link { border-radius: 0 4px 4px 0; } .k-scheduler-phone .k-scheduler-toolbar > ul li.k-nav-today, .k-scheduler-phone .k-scheduler-toolbar > ul li.k-nav-today .k-link, .k-edit-field > .k-scheduler-navigation { border-radius: 4px; } .k-scheduler-toolbar .k-nav-next, .k-scheduler-toolbar ul + ul li:last-child, .k-scheduler-toolbar .k-nav-next .k-link, .k-scheduler-toolbar ul + ul li:last-child .k-link { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .k-rtl .k-scheduler-toolbar .k-nav-next, .k-rtl .k-scheduler-toolbar ul + ul li:last-child, .k-rtl .k-scheduler-toolbar .k-nav-next .k-link, .k-rtl .k-scheduler-toolbar ul + ul li:last-child .k-link { border-radius: 4px 0 0 4px; } .k-scheduler div.k-scheduler-footer ul li, .k-scheduler div.k-scheduler-footer .k-link { border-radius: 4px; } .k-more-events, .k-event, .k-task-single, .k-task-complete, .k-event .k-link { border-radius: 3px; } .k-scheduler-mobile .k-event { border-radius: 2px; } /* Adaptive Grid */ .k-grid-mobile .k-column-active + th.k-header { border-left-color: #ffffff; } html .km-pane-wrapper .km-widget, .k-ie .km-pane-wrapper .k-widget, .k-ie .km-pane-wrapper .k-group, .k-ie .km-pane-wrapper .k-content, .k-ie .km-pane-wrapper .k-header, .k-ie .km-pane-wrapper .k-popup-edit-form .k-edit-field .k-button, .km-pane-wrapper .k-mobile-list .k-item, .km-pane-wrapper .k-mobile-list .k-edit-label, .km-pane-wrapper .k-mobile-list .k-edit-field { color: #ffffff; } @media screen and (-ms-high-contrast: active) and (-ms-high-contrast: none) { div.km-pane-wrapper a { color: #ffffff; } .km-pane-wrapper .k-icon { background-image: url('Black/sprite_2x.png'); background-size: 21.2em 21em; } } .km-pane-wrapper .k-mobile-list .k-item, .km-pane-wrapper .k-mobile-list .k-edit-field, .km-pane-wrapper .k-mobile-list .k-recur-view > .k-edit-field .k-check { background-color: #4d4d4d; border-top: 1px solid #444444; } .km-pane-wrapper .k-mobile-list .k-edit-field textarea { outline-width: 0; } .km-pane-wrapper .k-mobile-list .k-item.k-state-selected { background-color: #0066cc; border-top-color: #0066cc; } .km-pane-wrapper .k-mobile-list .k-recur-view > .k-edit-field .k-check:first-child { border-top-color: transparent; } .km-pane-wrapper .k-mobile-list .k-item:last-child { -webkit-box-shadow: inset 0 -1px 0 #444444; box-shadow: inset 0 -1px 0 #444444; } .km-pane-wrapper .k-mobile-list > ul > li > .k-link, .km-pane-wrapper .k-mobile-list .k-recur-view > .k-edit-label:nth-child(3), .km-pane-wrapper #recurrence .km-scroll-container > .k-edit-label:first-child { color: #000000; } .km-pane-wrapper .k-mobile-list > ul > li > .k-link { border-bottom: 1px solid #444444; } .km-pane-wrapper .k-mobile-list .k-edit-field { -webkit-box-shadow: 0 1px 1px #444444; box-shadow: 0 1px 1px #444444; } .km-actionsheet .k-grid-delete, .km-actionsheet .k-scheduler-delete, .km-pane-wrapper .k-scheduler-delete, .km-pane-wrapper .k-filter-menu .k-button[type=reset] { color: #fff; border-color: #ff0000; background-color: red; background-image: -webkit-gradient(linear, 50% 0, 50% 100%, from(rgba(255,255,255,.3)), to(rgba(255,255,255,.15))); background-image: -webkit-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,.15)); background-image: -moz-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,.15)); background-image: -ms-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,.15)); background-image: linear-gradient(to bottom, rgba(255,255,255,.3), rgba(255,255,255,.15)); } .km-actionsheet .k-grid-delete:active, .km-actionsheet .k-scheduler-delete:active, .km-pane-wrapper .k-scheduler-delete:active, .km-pane-wrapper .k-filter-menu .k-button[type=reset]:active { background-color: #990000; } /* /Column Menu */ .k-autocomplete.k-state-default, .k-picker-wrap.k-state-default, .k-numeric-wrap.k-state-default, .k-dropdown-wrap.k-state-default { background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, -moz-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, -o-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-image: none, linear-gradient(to bottom, rgba(255,255,255,.12) 0%, rgba(255,255,255,.20) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.07) 100%); background-position: 50% 50%; background-color: #272727; border-color: #2b2b2b; } .k-autocomplete.k-state-hover, .k-picker-wrap.k-state-hover, .k-numeric-wrap.k-state-hover, .k-dropdown-wrap.k-state-hover { background-color: #080808; background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, -moz-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, -o-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, linear-gradient(to bottom, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-position: 50% 50%; border-color: #080808; } .k-multiselect.k-header { border-color: #2b2b2b; } .k-multiselect.k-header.k-state-hover { border-color: #080808; } .k-autocomplete.k-state-focused, .k-picker-wrap.k-state-focused, .k-numeric-wrap.k-state-focused, .k-dropdown-wrap.k-state-focused, .k-multiselect.k-header.k-state-focused { background-color: #080808; background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, -moz-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, -o-linear-gradient(top, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-image: none, linear-gradient(to bottom, rgba(255,255,255,.12) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.05) 51%, rgba(255,255,255,.0) 100%); background-position: 50% 50%; border-color: #0066cc; -webkit-box-shadow: 0 0 3px 0 #0066cc; box-shadow: 0 0 3px 0 #0066cc; } .k-list-container { color: #ffffff; } .k-dropdown .k-input, .k-dropdown .k-state-focused .k-input, .k-menu .k-popup { color: #ffffff; } .k-state-default > .k-select { border-color: #2b2b2b; } .k-state-hover > .k-select { border-color: #080808; } .k-state-focused > .k-select { border-color: #0066cc; } .k-tabstrip:focus { -webkit-box-shadow: 0 0 3px 0 #0066cc; box-shadow: 0 0 3px 0 #0066cc; } .k-tabstrip-items .k-state-default .k-link, .k-panelbar > li.k-state-default > .k-link { color: #ffffff; } .k-tabstrip-items .k-state-hover .k-link, .k-panelbar > li.k-state-hover > .k-link, .k-panelbar > li.k-state-default > .k-link.k-state-hover { color: #ffffff; } .k-panelbar .k-state-focused.k-state-hover { background: #3d3d3d; -webkit-box-shadow: none; box-shadow: none; } .k-tabstrip-items .k-state-default, .k-ie7 .k-tabstrip-items .k-state-default .k-loading { border-color: #2b2b2b; } .k-tabstrip-items .k-state-hover, .k-ie7 .k-tabstrip-items .k-state-hover .k-loading { border-color: #2b2b2b; } .k-tabstrip-items .k-state-active, .k-panelbar .k-tabstrip-items .k-state-active, .k-ie7 .k-tabstrip-items .k-state-active .k-loading { background-color: #4d4d4d; background-image: none; border-color: #020202; } .k-tabstrip .k-content.k-state-active { background-color: #4d4d4d; color: #ffffff; } .k-menu.k-header, .k-menu .k-item { border-color: #2b2b2b; } .k-column-menu, .k-column-menu .k-item, .k-overflow-container .k-overflow-group { border-color: #2b2b2b; } .k-overflow-container .k-overflow-group { box-shadow: inset 0 1px 0 #787878, 0 1px 0 #787878; } .k-toolbar-first-visible.k-overflow-group, .k-overflow-container .k-overflow-group + .k-overflow-group { box-shadow: 0 1px 0 #787878; } .k-toolbar-last-visible.k-overflow-group { box-shadow: inset 0 1px 0 #787878; } .k-column-menu .k-separator { border-color: #2b2b2b; background-color: transparent; } .k-menu .k-group { border-color: #2b2b2b; } .k-grid-filter.k-state-active { background-color: #4d4d4d; } .k-grouping-row td, .k-group-footer td, .k-grid-footer td { color: #ffffff; border-color: #2b2b2b; font-weight: bold; } .k-grouping-header { color: #ffffff; } .k-grid td.k-state-focused { -webkit-box-shadow: inset 0 0 0 1px inset 0 0 3px 1px #080808; box-shadow: inset 0 0 0 1px inset 0 0 3px 1px #080808; } .k-header, .k-grid-header-wrap, .k-grid .k-grouping-header, .k-grid-header, .k-pager-wrap, .k-pager-wrap .k-textbox, .k-pager-wrap .k-link, .k-grouping-header .k-group-indicator, .k-gantt-toolbar .k-state-default { border-color: #2b2b2b; } .k-primary, .k-overflow-container .k-primary { color: #ffffff; border-color: #1472d0; background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, #1472d0 0%, #0267cc 100%); background-image: none, -moz-linear-gradient(top, #1472d0 0%, #0267cc 100%); background-image: none, -o-linear-gradient(top, #1472d0 0%, #0267cc 100%); background-image: none, linear-gradient(to bottom, #1472d0 0%, #0267cc 100%); background-position: 50% 50%; background-color: #1c77d2; -webkit-box-shadow: none; box-shadow: none; } .k-primary:focus, .k-primary.k-state-focused { color: #ffffff; border-color: #004992; background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, #1472d0 0%, #0267cc 100%); background-image: none, -moz-linear-gradient(top, #1472d0 0%, #0267cc 100%); background-image: none, -o-linear-gradient(top, #1472d0 0%, #0267cc 100%); background-image: none, linear-gradient(to bottom, #1472d0 0%, #0267cc 100%); -webkit-box-shadow: 0 0 3px 3px #004992; box-shadow: 0 0 3px 3px #004992; } .k-primary:hover { color: #ffffff; border-color: #145cbc; background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, #145cbc 0%, #024fb7 100%); background-image: none, -moz-linear-gradient(top, #145cbc 0%, #024fb7 100%); background-image: none, -o-linear-gradient(top, #145cbc 0%, #024fb7 100%); background-image: none, linear-gradient(to bottom, #145cbc 0%, #024fb7 100%); background-color: #004eb6; -webkit-box-shadow: none; box-shadow: none; } .k-primary:focus:active:not(.k-state-disabled):not([disabled]), .k-primary:focus:not(.k-state-disabled):not([disabled]) { -webkit-box-shadow: 0 0 3px 3px #004992; box-shadow: 0 0 3px 3px #004992; } .k-primary:active { color: #ffffff; border-color: #0167cc; background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, #1472d0 0%, #0267cc 100%); background-image: none, -moz-linear-gradient(top, #1472d0 0%, #0267cc 100%); background-image: none, -o-linear-gradient(top, #1472d0 0%, #0267cc 100%); background-image: none, linear-gradient(to bottom, #1472d0 0%, #0267cc 100%); background-color: #0066cc; -webkit-box-shadow: none; box-shadow: none; } .k-primary.k-state-disabled, .k-state-disabled .k-primary, .k-primary.k-state-disabled:hover, .k-state-disabled .k-primary:hover, .k-primary.k-state-disabled:hover, .k-state-disabled .k-primary:active, .k-primary.k-state-disabled:active { color: #91aeca; border-color: #245d95; background-color: #0066cc; background-image: url('textures/glass.png'); background-image: none, -webkit-linear-gradient(top, #245d95 0%, #1a5693 100%); background-image: none, -moz-linear-gradient(top, #245d95 0%, #1a5693 100%); background-image: none, -o-linear-gradient(top, #245d95 0%, #1a5693 100%); background-image: none, linear-gradient(to bottom, #245d95 0%, #1a5693 100%); -webkit-box-shadow: none; box-shadow: none; } .k-pager-numbers .k-link, .k-treeview .k-in { border-color: transparent; } .k-treeview .k-icon, .k-scheduler-table .k-icon, .k-grid .k-hierarchy-cell .k-icon { background-color: transparent; border-radius: 4px; } .k-scheduler-table .k-state-hover .k-icon { background-color: transparent; } .k-button:focus { outline: none; } .k-editor .k-tool:focus { outline: 0; border-color: #2b2b2b; -webkit-box-shadow: inset 0 0 3px 1px #080808; box-shadow: inset 0 0 3px 1px #080808; } .k-checkbox-label:before { border-color: transparent; border-radius: 3px; } .k-checkbox-label:after { border-color: #2b2b2b; background: #ffffff; border-radius: 3px; } .k-checkbox-label:hover:after, .k-checkbox:checked + .k-checkbox-label:hover:after { border-color: #080808; box-shadow: none; } .k-checkbox:checked + .k-checkbox-label:after { background-color: #ffffff; border-color: #2b2b2b; border-radius: 3px; color: #1472d0; } .k-checkbox-label:active:before { box-shadow: 0 0 3px 0 #0066cc; border-color: #0066cc; border-radius: 3px; } .k-checkbox-label:active:after { border-color: #0066cc; border-radius: 3px; } .k-checkbox:checked + .k-checkbox-label:active:after { border-color: #0066cc; } .k-checkbox:checked + .k-checkbox-label:active:before { box-shadow: 0 0 3px 0 #0066cc; border-radius: 3px; } .k-checkbox:disabled + .k-checkbox-label { color: #2b2b2b; } .k-checkbox:disabled + .k-checkbox-label:hover:after, .k-checkbox:disabled + .k-checkbox-label:active:before { box-shadow: none; } .k-checkbox:checked:disabled + .k-checkbox-label:after { background: #7a7a7a; color: #2b2b2b; } .k-checkbox:disabled + .k-checkbox-label:after, .k-checkbox:checked:disabled + .k-checkbox-label:active:after, .k-checkbox:disabled + .k-checkbox-label:hover:before, .k-checkbox:checked:disabled + .k-checkbox-label:hover:after { background: #7a7a7a; border-color: #2b2b2b; border-radius: 3px; } .k-radio-label:before { border-color: #2b2b2b; border-radius: 50%; background-color: #ffffff; border-width: 1px; } .k-radio-label:hover:before, .k-radio:checked + .k-radio-label:hover:before { border-color: #080808; box-shadow: none; } .k-radio:checked + .k-radio-label:before { border-color: #2b2b2b; } .k-radio:checked + .k-radio-label:after { background-color: #0066cc; border-radius: 50%; } .k-radio-label:active:before { box-shadow: 0 0 3px 0 #0066cc; border-radius: 50%; border-color: #0066cc; } .k-radio:checked + .k-radio-label:active:before { box-shadow: 0 0 3px 0 #0066cc; border-radius: 50%; border-color: #0066cc; } .k-radio:disabled + .k-radio-label { color: #2b2b2b; } .k-radio:disabled + .k-radio-label:before { border-color: #bfbfbf; } .k-radio:disabled + .k-radio-label:active:before { box-shadow: none; background: #7a7a7a; } .k-radio:disabled + .k-radio-label:before { background: #7a7a7a; } .k-radio:disabled + .k-radio-label:hover:after, .k-radio:disabled + .k-radio-label:hover:before { box-shadow: none; } .k-checkbox:focus + .k-checkbox-label:after, .k-radio:focus + .k-radio-label:before { border-color: #0066cc; box-shadow: 0 0 3px 0 #0066cc; } @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) { .k-icon:not(.k-loading), .k-grouping-dropclue, .k-drop-hint, .k-callout, .k-tool-icon, .k-state-hover .k-tool-icon, .k-state-active .k-tool-icon, .k-state-active.k-state-hover .k-tool-icon, .k-state-selected .k-tool-icon, .k-state-selected.k-state-hover .k-tool-icon, .k-column-menu .k-sprite, .k-mobile-list .k-check:checked, .k-mobile-list .k-edit-field [type=checkbox]:checked, .k-mobile-list .k-edit-field [type=radio]:checked { background-image: url('Black/sprite_2x.png'); background-size: 340px 336px; } .k-dropdown-wrap .k-input, .k-picker-wrap .k-input, .k-numeric-wrap .k-input { border-radius: 3px 0 0 3px; } .k-i-kpi-decrease, .k-i-kpi-denied, .k-i-kpi-equal, .k-i-kpi-hold, .k-i-kpi-increase, .k-i-kpi-open { background-image: url('Black/sprite_kpi_2x.png'); background-size: 96px 16px; } } @media screen and (-ms-high-contrast: active) { .k-editor-toolbar-wrap .k-dropdown-wrap.k-state-focused, .k-editor-toolbar-wrap .k-button-group .k-tool:focus { border-color: #fff; } } .ktb-checkbox-label-after { border-color: #2b2b2b; background: #ffffff; } .ktb-checkbox-label-hover-after, .ktb-checkbox-checked + .ktb-checkbox-label-hover-after { border-color: #080808; } .ktb-checkbox-checked + .ktb-checkbox-label-after { background-color: #ffffff; border-color: #2b2b2b; color: #1472d0; } .ktb-checkbox-label-hover-after, .ktb-checkbox-checked + .ktb-checkbox-label-hover-after { border-color: #080808; } .ktb-checkbox-label-active-after { border-color: #0066cc; } .ktb-checkbox-checked-disabled + .ktb-checkbox-label-after, .ktb-checkbox-disabled + .ktb-checkbox-label-after, .ktb-checkbox-checked-disabled + .ktb-checkbox-label-active-after, .ktb-checkbox-disabled + .ktb-checkbox-label-hover-before, .ktb-checkbox-checked-disabled + .ktb-checkbox-label-hover-after { background: #7a7a7a; color: #2b2b2b; border-color: #2b2b2b; } .ktb-radio-label-before { border-color: #2b2b2b; background-color: #ffffff; } .ktb-radio-checked + .ktb-radio-label-after { background-color: #0066cc; } .ktb-radio-checked + .ktb-radio-label-before { border-color: #2b2b2b; } .ktb-radio-label-hover-before, .ktb-radio-checked + .ktb-radio-label-hover-before { border-color: #080808; } .ktb-radio-label-active-before { border-color: #0066cc; } .ktb-radio-checked + .ktb-radio-label-after { background-color: #0066cc; } .ktb-radio-disabled + .ktb-radio-label-before, .ktb-radio-disabled + .ktb-radio-label-active-before { background: #7a7a7a; border-color: #2b2b2b; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/KendoUI/kendo.common.css ================================================ /* * Kendo UI v2014.3.1411 (http://www.telerik.com/kendo-ui) * Copyright 2015 Telerik AD. All rights reserved. * * Kendo UI commercial licenses may be obtained at * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete * If you do not own a commercial license, this file shall be governed by the trial license terms. */ /* Kendo base CSS */ .fake { color: red; } .k-reset { margin: 0; padding: 0; border: 0; outline: 0; text-decoration: none; font-size: 100%; list-style: none; } .k-floatwrap:after, .k-slider-items:after, .k-grid-toolbar:after { content: ""; display: block; clear: both; visibility: hidden; height: 0; overflow: hidden; } .k-floatwrap, .k-slider-items, .k-grid-toolbar { display: inline-block; } .k-floatwrap, .k-slider-items, .k-grid-toolbar { display: block; } /* main gradient */ .k-block, .k-button, .k-header, .k-grid-header, .k-toolbar, .k-grouping-header, .k-tooltip, .k-pager-wrap, .k-tabstrip-items .k-item, .k-link.k-state-hover, .k-textbox, .k-textbox:hover, .k-autocomplete, .k-dropdown-wrap, .k-picker-wrap, .k-numeric-wrap, .k-autocomplete.k-state-hover, .k-dropdown-wrap.k-state-hover, .k-picker-wrap.k-state-hover, .k-numeric-wrap.k-state-hover, .k-draghandle { background-repeat: repeat; background-position: 0 center; } .k-link:hover { text-decoration: none; } .k-state-highlight > .k-link { color: inherit; } /* widget */ .k-textbox > input, .k-input[type="text"], .k-input[type="number"], .k-textbox, .k-picker-wrap .k-input, .k-button { font-size: 100%; font-family: inherit; border-style: solid; border-width: 1px; -webkit-appearance: none; } .k-widget, .k-block, .k-inline-block, .k-draghandle { border-style: solid; border-width: 1px; -webkit-appearance: none; } .k-block, .k-widget { line-height: normal; outline: 0; } /* Block */ .k-block { padding: 2px; } /* button */ .k-button { display: inline-block; margin: 0; padding: 2px 7px 2px; font-family: inherit; line-height: 1.72em; text-align: center; cursor: pointer; text-decoration: none; } .k-button[disabled], .k-button.k-state-disabled, .k-state-disabled .k-button, .k-state-disabled .k-button:hover, .k-button.k-state-disabled:hover, .k-state-disabled .k-button:active, .k-button.k-state-disabled:active { cursor: default; } .k-ie7 .k-button { line-height: normal; } a.k-button { -khtml-user-select: none; -webkit-user-select: none; -moz-user-select: -moz-none; -ms-user-select: none; user-select: none; text-decoration: none; } /* Override the important default line-height in Firefox 4+ */ .k-ff input.k-button { padding-bottom: 0.37em; padding-top: 0.37em; } .k-ie7 .k-button { overflow: visible; margin-right: 4px; } .k-ie7 a.k-button { line-height: 1.6; padding-left: 7px; padding-right: 7px; /*+1*/ } .k-ie7 .k-slider a.k-button { height: 22px; line-height: 22px; padding: 0; } .k-ie7 .k-button-expand { margin-left: 0; margin-right: 0; } button.k-button::-moz-focus-inner, input.k-button::-moz-focus-inner { padding: 0; border: 0; } a.k-button-expand { display: block; } button.k-button-expand, input[type="submit"].k-button-expand, input[type="button"].k-button-expand, input[type="reset"].k-button-expand { width: 100%; } body .k-button-icon, body .k-split-button-arrow { padding-left: .4em; padding-right: .4em; } .k-ie7 a.k-button-icon { padding-left: 5px; padding-right: 5px; /*+1*/ } .k-button-icontext { overflow: visible; /*IE9*/ } .k-toolbar .k-button-icontext { padding-right: .8em; } .k-button-icontext .k-icon, .k-button-icontext .k-image { margin-right: 3px; margin-right: .3rem; margin-left: -3px; margin-left: -0.3rem; } .k-button.k-button-icontext .k-icon, .k-button.k-button-icontext .k-image { vertical-align: text-top; } html body .k-button-bare { background: none !important; /*spares long selectors*/ color: inherit; border-width: 0; } html body .k-button-bare.k-upload-button:hover { color: inherit; } /* link */ .k-link { cursor: pointer; outline: 0; text-decoration: none; } .k-grid-header span.k-link { cursor: default; } /* states */ .k-state-disabled, .k-state-disabled .k-link, .k-state-disabled .k-icon, .k-state-disabled .k-button, .k-state-disabled .k-draghandle, .k-state-disabled .k-upload-button input { cursor: default !important; outline: 0; } @media print { .k-state-disabled, .k-state-disabled .k-input { opacity: 1 !important; } } .k-state-error { border-style: ridge; } .k-state-empty { font-style: italic; } /* icons */ .k-icon, .k-sprite, .k-button-group .k-tool-icon { display: inline-block; width: 16px; height: 16px; overflow: hidden; background-repeat: no-repeat; font-size: 0; line-height: 0; text-align: center; -ms-high-contrast-adjust: none; } .k-icon.k-i-none { background-image: none !important; /* should never be a background on these */ } /* In IE7 vertical align: middle can't be overridden */ .k-ie8 .k-icon, .k-ie8 .k-sprite, .k-ie8 .k-button-group .k-tool-icon { vertical-align: middle; } :root * > .k-icon, :root * > .k-sprite, :root * > .k-button-group .k-tool-icon { vertical-align: middle; } .k-icon, .k-sprite { background-color: transparent; } .k-ie7 .k-icon, .k-ie7 .k-sprite { text-indent: 0; } .k-numerictextbox .k-select .k-link span.k-i-arrow-n { background-position: 0 -3px; } .k-numerictextbox .k-select .k-link span.k-i-arrow-s { background-position: 0 -35px; } .k-state-selected .k-i-arrow-n { background-position: -16px 0px; } .k-link:not(.k-state-disabled):hover > .k-state-selected .k-i-arrow-n, .k-state-hover > .k-state-selected .k-i-arrow-n, .k-state-hover > * > .k-state-selected .k-i-arrow-n, .k-button:not(.k-state-disabled):hover .k-state-selected .k-i-arrow-n, .k-textbox:hover .k-state-selected .k-i-arrow-n, .k-button:active .k-state-selected .k-i-arrow-n { background-position: -32px 0px; } .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-n, .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-n { background-position: -16px -3px; } .k-state-selected .k-i-arrow-s { background-position: -16px -32px; } .k-link:not(.k-state-disabled):hover > .k-state-selected .k-i-arrow-s, .k-state-hover > .k-state-selected .k-i-arrow-s, .k-state-hover > * > .k-state-selected .k-i-arrow-s, .k-button:not(.k-state-disabled):hover .k-state-selected .k-i-arrow-s, .k-textbox:hover .k-state-selected .k-i-arrow-s, .k-button:active .k-state-selected .k-i-arrow-s { background-position: -32px -32px; } .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-s, .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-s { background-position: -16px -35px; } .k-grid-header th > .k-link:hover span.k-i-arrow-n { background-position: 0px 0px; } .k-grid-header th > .k-link:hover span.k-i-arrow-s { background-position: 0px -32px; } .k-group-indicator .k-link:hover span.k-si-arrow-n { background-position: 0 -129px; } .k-group-indicator .k-link:hover span.k-si-arrow-s { background-position: 0 -159px; } .k-group-indicator .k-button:hover span.k-group-delete { background-position: -32px -16px; } .k-scheduler .k-scheduler-toolbar .k-nav-current .k-link .k-i-calendar { background-position: -32px -176px; } .k-i-arrow-n { background-position: 0px 0px; } .k-link:not(.k-state-disabled):hover > .k-i-arrow-n, .k-state-hover > .k-i-arrow-n, .k-state-hover > * > .k-i-arrow-n, .k-button:not(.k-state-disabled):hover .k-i-arrow-n, .k-textbox:hover .k-i-arrow-n, .k-button:active .k-i-arrow-n { background-position: -16px 0px; } .k-i-arrow-e { background-position: 0px -16px; } .k-link:not(.k-state-disabled):hover > .k-i-arrow-e, .k-state-hover > .k-i-arrow-e, .k-state-hover > * > .k-i-arrow-e, .k-button:not(.k-state-disabled):hover .k-i-arrow-e, .k-textbox:hover .k-i-arrow-e, .k-button:active .k-i-arrow-e { background-position: -16px -16px; } .k-rtl .k-i-arrow-w { background-position: 0px -16px; } .k-rtl .k-link:not(.k-state-disabled):hover > .k-i-arrow-w, .k-rtl .k-state-hover > .k-i-arrow-w, .k-rtl .k-state-hover > * > .k-i-arrow-w, .k-rtl .k-button:not(.k-state-disabled):hover .k-i-arrow-w, .k-rtl .k-textbox:hover .k-i-arrow-w, .k-rtl .k-button:active .k-i-arrow-w { background-position: -16px -16px; } .k-i-arrow-s { background-position: 0px -32px; } .k-link:not(.k-state-disabled):hover > .k-i-arrow-s, .k-state-hover > .k-i-arrow-s, .k-state-hover > * > .k-i-arrow-s, .k-button:not(.k-state-disabled):hover .k-i-arrow-s, .k-textbox:hover .k-i-arrow-s, .k-button:active .k-i-arrow-s { background-position: -16px -32px; } .k-i-arrow-w { background-position: 0px -48px; } .k-link:not(.k-state-disabled):hover > .k-i-arrow-w, .k-state-hover > .k-i-arrow-w, .k-state-hover > * > .k-i-arrow-w, .k-button:not(.k-state-disabled):hover .k-i-arrow-w, .k-textbox:hover .k-i-arrow-w, .k-button:active .k-i-arrow-w { background-position: -16px -48px; } .k-rtl .k-i-arrow-e { background-position: 0px -48px; } .k-rtl .k-link:not(.k-state-disabled):hover > .k-i-arrow-e, .k-rtl .k-state-hover > .k-i-arrow-e, .k-rtl .k-state-hover > * > .k-i-arrow-e, .k-rtl .k-button:not(.k-state-disabled):hover .k-i-arrow-e, .k-rtl .k-textbox:hover .k-i-arrow-e, .k-rtl .k-button:active .k-i-arrow-e { background-position: -16px -48px; } .k-i-seek-n { background-position: 0px -64px; } .k-link:not(.k-state-disabled):hover > .k-i-seek-n, .k-state-hover > .k-i-seek-n, .k-state-hover > * > .k-i-seek-n, .k-button:not(.k-state-disabled):hover .k-i-seek-n, .k-textbox:hover .k-i-seek-n, .k-button:active .k-i-seek-n { background-position: -16px -64px; } .k-i-seek-e { background-position: 0px -80px; } .k-link:not(.k-state-disabled):hover > .k-i-seek-e, .k-state-hover > .k-i-seek-e, .k-state-hover > * > .k-i-seek-e, .k-button:not(.k-state-disabled):hover .k-i-seek-e, .k-textbox:hover .k-i-seek-e, .k-button:active .k-i-seek-e { background-position: -16px -80px; } .k-rtl .k-i-seek-w { background-position: 0px -80px; } .k-rtl .k-link:not(.k-state-disabled):hover > .k-i-seek-w, .k-rtl .k-state-hover > .k-i-seek-w, .k-rtl .k-state-hover > * > .k-i-seek-w, .k-rtl .k-button:not(.k-state-disabled):hover .k-i-seek-w, .k-rtl .k-textbox:hover .k-i-seek-w, .k-rtl .k-button:active .k-i-seek-w { background-position: -16px -80px; } .k-i-seek-s { background-position: 0px -96px; } .k-link:not(.k-state-disabled):hover > .k-i-seek-s, .k-state-hover > .k-i-seek-s, .k-state-hover > * > .k-i-seek-s, .k-button:not(.k-state-disabled):hover .k-i-seek-s, .k-textbox:hover .k-i-seek-s, .k-button:active .k-i-seek-s { background-position: -16px -96px; } .k-i-seek-w { background-position: 0px -112px; } .k-link:not(.k-state-disabled):hover > .k-i-seek-w, .k-state-hover > .k-i-seek-w, .k-state-hover > * > .k-i-seek-w, .k-button:not(.k-state-disabled):hover .k-i-seek-w, .k-textbox:hover .k-i-seek-w, .k-button:active .k-i-seek-w { background-position: -16px -112px; } .k-rtl .k-i-seek-e { background-position: 0px -112px; } .k-rtl .k-link:not(.k-state-disabled):hover > .k-i-seek-e, .k-rtl .k-state-hover > .k-i-seek-e, .k-rtl .k-state-hover > * > .k-i-seek-e, .k-rtl .k-button:not(.k-state-disabled):hover .k-i-seek-e, .k-rtl .k-textbox:hover .k-i-seek-e, .k-rtl .k-button:active .k-i-seek-e { background-position: -16px -112px; } .k-si-arrow-n { background-position: 0 -129px; } .k-link:not(.k-state-disabled):hover > .k-si-arrow-n, .k-state-hover > .k-si-arrow-n, .k-state-hover > * > .k-si-arrow-n, .k-button:not(.k-state-disabled):hover .k-si-arrow-n, .k-textbox:hover .k-si-arrow-n, .k-button:active .k-si-arrow-n { background-position: -16px -129px; } .k-si-arrow-e { background-position: 0px -144px; } .k-link:not(.k-state-disabled):hover > .k-si-arrow-e, .k-state-hover > .k-si-arrow-e, .k-state-hover > * > .k-si-arrow-e, .k-button:not(.k-state-disabled):hover .k-si-arrow-e, .k-textbox:hover .k-si-arrow-e, .k-button:active .k-si-arrow-e { background-position: -16px -144px; } .k-si-arrow-s { background-position: 0 -159px; } .k-link:not(.k-state-disabled):hover > .k-si-arrow-s, .k-state-hover > .k-si-arrow-s, .k-state-hover > * > .k-si-arrow-s, .k-button:not(.k-state-disabled):hover .k-si-arrow-s, .k-textbox:hover .k-si-arrow-s, .k-button:active .k-si-arrow-s { background-position: -16px -159px; } .k-si-arrow-w { background-position: 0px -176px; } .k-link:not(.k-state-disabled):hover > .k-si-arrow-w, .k-state-hover > .k-si-arrow-w, .k-state-hover > * > .k-si-arrow-w, .k-button:not(.k-state-disabled):hover .k-si-arrow-w, .k-textbox:hover .k-si-arrow-w, .k-button:active .k-si-arrow-w { background-position: -16px -176px; } .k-i-arrowhead-n { background-position: 0px -256px; } .k-link:not(.k-state-disabled):hover > .k-i-arrowhead-n, .k-state-hover > .k-i-arrowhead-n, .k-state-hover > * > .k-i-arrowhead-n, .k-button:not(.k-state-disabled):hover .k-i-arrowhead-n, .k-textbox:hover .k-i-arrowhead-n, .k-button:active .k-i-arrowhead-n { background-position: -16px -256px; } .k-i-arrowhead-e { background-position: 0px -272px; } .k-link:not(.k-state-disabled):hover > .k-i-arrowhead-e, .k-state-hover > .k-i-arrowhead-e, .k-state-hover > * > .k-i-arrowhead-e, .k-button:not(.k-state-disabled):hover .k-i-arrowhead-e, .k-textbox:hover .k-i-arrowhead-e, .k-button:active .k-i-arrowhead-e { background-position: -16px -272px; } .k-i-arrowhead-s { background-position: 0px -288px; } .k-link:not(.k-state-disabled):hover > .k-i-arrowhead-s, .k-state-hover > .k-i-arrowhead-s, .k-state-hover > * > .k-i-arrowhead-s, .k-button:not(.k-state-disabled):hover .k-i-arrowhead-s, .k-textbox:hover .k-i-arrowhead-s, .k-button:active .k-i-arrowhead-s { background-position: -16px -288px; } .k-i-arrowhead-w { background-position: 0px -304px; } .k-link:not(.k-state-disabled):hover > .k-i-arrowhead-w, .k-state-hover > .k-i-arrowhead-w, .k-state-hover > * > .k-i-arrowhead-w, .k-button:not(.k-state-disabled):hover .k-i-arrowhead-w, .k-textbox:hover .k-i-arrowhead-w, .k-button:active .k-i-arrowhead-w { background-position: -16px -304px; } .k-i-expand, .k-plus, .k-plus-disabled { background-position: 0px -192px; } .k-link:not(.k-state-disabled):hover > .k-i-expand, .k-link:not(.k-state-disabled):hover > .k-plus, .k-link:not(.k-state-disabled):hover > .k-plus-disabled, .k-state-hover > .k-i-expand, .k-state-hover > .k-plus, .k-state-hover > .k-plus-disabled, .k-state-hover > * > .k-i-expand, .k-state-hover > * > .k-plus, .k-state-hover > * > .k-plus-disabled, .k-button:not(.k-state-disabled):hover .k-i-expand, .k-button:not(.k-state-disabled):hover .k-plus, .k-button:not(.k-state-disabled):hover .k-plus-disabled, .k-textbox:hover .k-i-expand, .k-textbox:hover .k-plus, .k-textbox:hover .k-plus-disabled, .k-button:active .k-i-expand, .k-button:active .k-plus, .k-button:active .k-plus-disabled { background-position: -16px -192px; } .k-i-expand-w, .k-rtl .k-i-expand, .k-rtl .k-plus, .k-rtl .k-plus-disabled { background-position: 0px -208px; } .k-link:not(.k-state-disabled):hover > .k-i-expand-w, .k-link:not(.k-state-disabled):hover > .k-rtl .k-i-expand, .k-link:not(.k-state-disabled):hover > .k-rtl .k-plus, .k-link:not(.k-state-disabled):hover > .k-rtl .k-plus-disabled, .k-state-hover > .k-i-expand-w, .k-state-hover > .k-rtl .k-i-expand, .k-state-hover > .k-rtl .k-plus, .k-state-hover > .k-rtl .k-plus-disabled, .k-state-hover > * > .k-i-expand-w, .k-state-hover > * > .k-rtl .k-i-expand, .k-state-hover > * > .k-rtl .k-plus, .k-state-hover > * > .k-rtl .k-plus-disabled, .k-button:not(.k-state-disabled):hover .k-i-expand-w, .k-button:not(.k-state-disabled):hover .k-rtl .k-i-expand, .k-button:not(.k-state-disabled):hover .k-rtl .k-plus, .k-button:not(.k-state-disabled):hover .k-rtl .k-plus-disabled, .k-textbox:hover .k-i-expand-w, .k-textbox:hover .k-rtl .k-i-expand, .k-textbox:hover .k-rtl .k-plus, .k-textbox:hover .k-rtl .k-plus-disabled, .k-button:active .k-i-expand-w, .k-button:active .k-rtl .k-i-expand, .k-button:active .k-rtl .k-plus, .k-button:active .k-rtl .k-plus-disabled { background-position: -16px -208px; } .k-i-collapse, .k-minus, .k-minus-disabled { background-position: 0px -224px; } .k-link:not(.k-state-disabled):hover > .k-i-collapse, .k-link:not(.k-state-disabled):hover > .k-minus, .k-link:not(.k-state-disabled):hover > .k-minus-disabled, .k-state-hover > .k-i-collapse, .k-state-hover > .k-minus, .k-state-hover > .k-minus-disabled, .k-state-hover > * > .k-i-collapse, .k-state-hover > * > .k-minus, .k-state-hover > * > .k-minus-disabled, .k-button:not(.k-state-disabled):hover .k-i-collapse, .k-button:not(.k-state-disabled):hover .k-minus, .k-button:not(.k-state-disabled):hover .k-minus-disabled, .k-textbox:hover .k-i-collapse, .k-textbox:hover .k-minus, .k-textbox:hover .k-minus-disabled, .k-button:active .k-i-collapse, .k-button:active .k-minus, .k-button:active .k-minus-disabled { background-position: -16px -224px; } .k-i-collapse-w, .k-rtl .k-i-collapse, .k-rtl .k-minus, .k-rtl .k-minus-disabled { background-position: 0px -240px; } .k-link:not(.k-state-disabled):hover > .k-i-collapse-w, .k-link:not(.k-state-disabled):hover > .k-rtl .k-i-collapse, .k-link:not(.k-state-disabled):hover > .k-rtl .k-minus, .k-link:not(.k-state-disabled):hover > .k-rtl .k-minus-disabled, .k-state-hover > .k-i-collapse-w, .k-state-hover > .k-rtl .k-i-collapse, .k-state-hover > .k-rtl .k-minus, .k-state-hover > .k-rtl .k-minus-disabled, .k-state-hover > * > .k-i-collapse-w, .k-state-hover > * > .k-rtl .k-i-collapse, .k-state-hover > * > .k-rtl .k-minus, .k-state-hover > * > .k-rtl .k-minus-disabled, .k-button:not(.k-state-disabled):hover .k-i-collapse-w, .k-button:not(.k-state-disabled):hover .k-rtl .k-i-collapse, .k-button:not(.k-state-disabled):hover .k-rtl .k-minus, .k-button:not(.k-state-disabled):hover .k-rtl .k-minus-disabled, .k-textbox:hover .k-i-collapse-w, .k-textbox:hover .k-rtl .k-i-collapse, .k-textbox:hover .k-rtl .k-minus, .k-textbox:hover .k-rtl .k-minus-disabled, .k-button:active .k-i-collapse-w, .k-button:active .k-rtl .k-i-collapse, .k-button:active .k-rtl .k-minus, .k-button:active .k-rtl .k-minus-disabled { background-position: -16px -240px; } .k-i-pencil, .k-edit { background-position: -32px 0px; } .k-link:not(.k-state-disabled):hover > .k-i-pencil, .k-link:not(.k-state-disabled):hover > .k-edit, .k-state-hover > .k-i-pencil, .k-state-hover > .k-edit, .k-state-hover > * > .k-i-pencil, .k-state-hover > * > .k-edit, .k-button:not(.k-state-disabled):hover .k-i-pencil, .k-button:not(.k-state-disabled):hover .k-edit, .k-textbox:hover .k-i-pencil, .k-textbox:hover .k-edit, .k-button:active .k-i-pencil, .k-button:active .k-edit { background-position: -48px 0px; } .k-i-close, .k-delete, .k-group-delete { background-position: -32px -16px; } .k-link:not(.k-state-disabled):hover > .k-i-close, .k-link:not(.k-state-disabled):hover > .k-delete, .k-link:not(.k-state-disabled):hover > .k-group-delete, .k-state-hover > .k-i-close, .k-state-hover > .k-delete, .k-state-hover > .k-group-delete, .k-state-hover > * > .k-i-close, .k-state-hover > * > .k-delete, .k-state-hover > * > .k-group-delete, .k-button:not(.k-state-disabled):hover .k-i-close, .k-button:not(.k-state-disabled):hover .k-delete, .k-button:not(.k-state-disabled):hover .k-group-delete, .k-textbox:hover .k-i-close, .k-textbox:hover .k-delete, .k-textbox:hover .k-group-delete, .k-button:active .k-i-close, .k-button:active .k-delete, .k-button:active .k-group-delete { background-position: -48px -16px; } .k-si-close { background-position: -160px -80px; } .k-link:not(.k-state-disabled):hover > .k-si-close, .k-state-hover > .k-si-close, .k-state-hover > * > .k-si-close, .k-button:not(.k-state-disabled):hover .k-si-close, .k-textbox:hover .k-si-close, .k-button:active .k-si-close { background-position: -176px -80px; } .k-multiselect .k-delete { background-position: -160px -80px; } .k-multiselect .k-state-hover .k-delete { background-position: -176px -80px; } .k-i-tick, .k-insert, .k-update { background-position: -32px -32px; } .k-link:not(.k-state-disabled):hover > .k-i-tick, .k-link:not(.k-state-disabled):hover > .k-insert, .k-link:not(.k-state-disabled):hover > .k-update, .k-state-hover > .k-i-tick, .k-state-hover > .k-insert, .k-state-hover > .k-update, .k-state-hover > * > .k-i-tick, .k-state-hover > * > .k-insert, .k-state-hover > * > .k-update, .k-button:not(.k-state-disabled):hover .k-i-tick, .k-button:not(.k-state-disabled):hover .k-insert, .k-button:not(.k-state-disabled):hover .k-update, .k-textbox:hover .k-i-tick, .k-textbox:hover .k-insert, .k-textbox:hover .k-update, .k-button:active .k-i-tick, .k-button:active .k-insert, .k-button:active .k-update { background-position: -48px -32px; } .k-check:checked, .k-mobile-list .k-edit-field [type=checkbox], .k-mobile-list .k-edit-field [type=radio] { background-position: -32px -32px; } .k-link:not(.k-state-disabled):hover > .k-check:checked, .k-link:not(.k-state-disabled):hover > .k-mobile-list .k-edit-field [type=checkbox], .k-link:not(.k-state-disabled):hover > .k-mobile-list .k-edit-field [type=radio], .k-state-hover > .k-check:checked, .k-state-hover > .k-mobile-list .k-edit-field [type=checkbox], .k-state-hover > .k-mobile-list .k-edit-field [type=radio], .k-state-hover > * > .k-check:checked, .k-state-hover > * > .k-mobile-list .k-edit-field [type=checkbox], .k-state-hover > * > .k-mobile-list .k-edit-field [type=radio], .k-button:not(.k-state-disabled):hover .k-check:checked, .k-button:not(.k-state-disabled):hover .k-mobile-list .k-edit-field [type=checkbox], .k-button:not(.k-state-disabled):hover .k-mobile-list .k-edit-field [type=radio], .k-textbox:hover .k-check:checked, .k-textbox:hover .k-mobile-list .k-edit-field [type=checkbox], .k-textbox:hover .k-mobile-list .k-edit-field [type=radio], .k-button:active .k-check:checked, .k-button:active .k-mobile-list .k-edit-field [type=checkbox], .k-button:active .k-mobile-list .k-edit-field [type=radio] { background-position: -48px -32px; } .k-i-cancel, .k-cancel, .k-denied { background-position: -32px -48px; } .k-link:not(.k-state-disabled):hover > .k-i-cancel, .k-link:not(.k-state-disabled):hover > .k-cancel, .k-link:not(.k-state-disabled):hover > .k-denied, .k-state-hover > .k-i-cancel, .k-state-hover > .k-cancel, .k-state-hover > .k-denied, .k-state-hover > * > .k-i-cancel, .k-state-hover > * > .k-cancel, .k-state-hover > * > .k-denied, .k-button:not(.k-state-disabled):hover .k-i-cancel, .k-button:not(.k-state-disabled):hover .k-cancel, .k-button:not(.k-state-disabled):hover .k-denied, .k-textbox:hover .k-i-cancel, .k-textbox:hover .k-cancel, .k-textbox:hover .k-denied, .k-button:active .k-i-cancel, .k-button:active .k-cancel, .k-button:active .k-denied { background-position: -48px -48px; } .k-i-plus, .k-add { background-position: -32px -64px; } .k-link:not(.k-state-disabled):hover > .k-i-plus, .k-link:not(.k-state-disabled):hover > .k-add, .k-state-hover > .k-i-plus, .k-state-hover > .k-add, .k-state-hover > * > .k-i-plus, .k-state-hover > * > .k-add, .k-button:not(.k-state-disabled):hover .k-i-plus, .k-button:not(.k-state-disabled):hover .k-add, .k-textbox:hover .k-i-plus, .k-textbox:hover .k-add, .k-button:active .k-i-plus, .k-button:active .k-add { background-position: -48px -64px; } .k-i-funnel, .k-filter { background-position: -32px -80px; } .k-link:not(.k-state-disabled):hover > .k-i-funnel, .k-link:not(.k-state-disabled):hover > .k-filter, .k-state-hover > .k-i-funnel, .k-state-hover > .k-filter, .k-state-hover > * > .k-i-funnel, .k-state-hover > * > .k-filter, .k-button:not(.k-state-disabled):hover .k-i-funnel, .k-button:not(.k-state-disabled):hover .k-filter, .k-textbox:hover .k-i-funnel, .k-textbox:hover .k-filter, .k-button:active .k-i-funnel, .k-button:active .k-filter { background-position: -48px -80px; } .k-i-funnel-clear, .k-clear-filter { background-position: -32px -96px; } .k-link:not(.k-state-disabled):hover > .k-i-funnel-clear, .k-link:not(.k-state-disabled):hover > .k-clear-filter, .k-state-hover > .k-i-funnel-clear, .k-state-hover > .k-clear-filter, .k-state-hover > * > .k-i-funnel-clear, .k-state-hover > * > .k-clear-filter, .k-button:not(.k-state-disabled):hover .k-i-funnel-clear, .k-button:not(.k-state-disabled):hover .k-clear-filter, .k-textbox:hover .k-i-funnel-clear, .k-textbox:hover .k-clear-filter, .k-button:active .k-i-funnel-clear, .k-button:active .k-clear-filter { background-position: -48px -96px; } .k-i-lock { background-position: -64px 0px; } .k-link:not(.k-state-disabled):hover > .k-i-lock, .k-state-hover > .k-i-lock, .k-state-hover > * > .k-i-lock, .k-button:not(.k-state-disabled):hover .k-i-lock, .k-textbox:hover .k-i-lock, .k-button:active .k-i-lock { background-position: -80px 0px; } .k-i-unlock { background-position: -64px -16px; } .k-link:not(.k-state-disabled):hover > .k-i-unlock, .k-state-hover > .k-i-unlock, .k-state-hover > * > .k-i-unlock, .k-button:not(.k-state-disabled):hover .k-i-unlock, .k-textbox:hover .k-i-unlock, .k-button:active .k-i-unlock { background-position: -80px -16px; } .k-i-refresh { background-position: -32px -112px; } .k-link:not(.k-state-disabled):hover > .k-i-refresh, .k-state-hover > .k-i-refresh, .k-state-hover > * > .k-i-refresh, .k-button:not(.k-state-disabled):hover .k-i-refresh, .k-textbox:hover .k-i-refresh, .k-button:active .k-i-refresh { background-position: -48px -112px; } .k-i-exception { background-position: -160px -304px; } .k-link:not(.k-state-disabled):hover > .k-i-exception, .k-state-hover > .k-i-exception, .k-state-hover > * > .k-i-exception, .k-button:not(.k-state-disabled):hover .k-i-exception, .k-textbox:hover .k-i-exception, .k-button:active .k-i-exception { background-position: -176px -304px; } .k-i-restore { background-position: -32px -128px; } .k-link:not(.k-state-disabled):hover > .k-i-restore, .k-state-hover > .k-i-restore, .k-state-hover > * > .k-i-restore, .k-button:not(.k-state-disabled):hover .k-i-restore, .k-textbox:hover .k-i-restore, .k-button:active .k-i-restore { background-position: -48px -128px; } .k-i-maximize { background-position: -32px -144px; } .k-link:not(.k-state-disabled):hover > .k-i-maximize, .k-state-hover > .k-i-maximize, .k-state-hover > * > .k-i-maximize, .k-button:not(.k-state-disabled):hover .k-i-maximize, .k-textbox:hover .k-i-maximize, .k-button:active .k-i-maximize { background-position: -48px -144px; } .k-i-minimize { background-position: -64px -288px; } .k-link:not(.k-state-disabled):hover > .k-i-minimize, .k-state-hover > .k-i-minimize, .k-state-hover > * > .k-i-minimize, .k-button:not(.k-state-disabled):hover .k-i-minimize, .k-textbox:hover .k-i-minimize, .k-button:active .k-i-minimize { background-position: -80px -288px; } .k-i-pin { background-position: -160px -256px; } .k-link:not(.k-state-disabled):hover > .k-i-pin, .k-state-hover > .k-i-pin, .k-state-hover > * > .k-i-pin, .k-button:not(.k-state-disabled):hover .k-i-pin, .k-textbox:hover .k-i-pin, .k-button:active .k-i-pin { background-position: -176px -256px; } .k-i-unpin { background-position: -160px -272px; } .k-link:not(.k-state-disabled):hover > .k-i-unpin, .k-state-hover > .k-i-unpin, .k-state-hover > * > .k-i-unpin, .k-button:not(.k-state-disabled):hover .k-i-unpin, .k-textbox:hover .k-i-unpin, .k-button:active .k-i-unpin { background-position: -176px -272px; } .k-resize-se { background-position: -32px -160px; } .k-link:not(.k-state-disabled):hover > .k-resize-se, .k-state-hover > .k-resize-se, .k-state-hover > * > .k-resize-se, .k-button:not(.k-state-disabled):hover .k-resize-se, .k-textbox:hover .k-resize-se, .k-button:active .k-resize-se { background-position: -48px -160px; } .k-i-calendar { background-position: -32px -176px; } .k-link:not(.k-state-disabled):hover > .k-i-calendar, .k-state-hover > .k-i-calendar, .k-state-hover > * > .k-i-calendar, .k-button:not(.k-state-disabled):hover .k-i-calendar, .k-textbox:hover .k-i-calendar, .k-button:active .k-i-calendar { background-position: -48px -176px; } .k-i-clock { background-position: -32px -192px; } .k-link:not(.k-state-disabled):hover > .k-i-clock, .k-state-hover > .k-i-clock, .k-state-hover > * > .k-i-clock, .k-button:not(.k-state-disabled):hover .k-i-clock, .k-textbox:hover .k-i-clock, .k-button:active .k-i-clock { background-position: -48px -192px; } .k-si-plus { background-position: -32px -208px; } .k-link:not(.k-state-disabled):hover > .k-si-plus, .k-state-hover > .k-si-plus, .k-state-hover > * > .k-si-plus, .k-button:not(.k-state-disabled):hover .k-si-plus, .k-textbox:hover .k-si-plus, .k-button:active .k-si-plus { background-position: -48px -208px; } .k-si-minus { background-position: -32px -224px; } .k-link:not(.k-state-disabled):hover > .k-si-minus, .k-state-hover > .k-si-minus, .k-state-hover > * > .k-si-minus, .k-button:not(.k-state-disabled):hover .k-si-minus, .k-textbox:hover .k-si-minus, .k-button:active .k-si-minus { background-position: -48px -224px; } .k-i-search { background-position: -32px -240px; } .k-link:not(.k-state-disabled):hover > .k-i-search, .k-state-hover > .k-i-search, .k-state-hover > * > .k-i-search, .k-button:not(.k-state-disabled):hover .k-i-search, .k-textbox:hover .k-i-search, .k-button:active .k-i-search { background-position: -48px -240px; } .k-i-custom { background-position: -115px -113px; } .k-link:not(.k-state-disabled):hover > .k-i-custom, .k-state-hover > .k-i-custom, .k-state-hover > * > .k-i-custom, .k-button:not(.k-state-disabled):hover .k-i-custom, .k-textbox:hover .k-i-custom, .k-button:active .k-i-custom { background-position: -141px -113px; } .k-editor .k-i-custom { background-position: -111px -109px; } .k-viewHtml { background-position: -288px -120px; } .k-i-insert-n, .k-insert-top { background-position: -160px -32px; } .k-link:not(.k-state-disabled):hover > .k-i-insert-n, .k-link:not(.k-state-disabled):hover > .k-insert-top, .k-state-hover > .k-i-insert-n, .k-state-hover > .k-insert-top, .k-state-hover > * > .k-i-insert-n, .k-state-hover > * > .k-insert-top, .k-button:not(.k-state-disabled):hover .k-i-insert-n, .k-button:not(.k-state-disabled):hover .k-insert-top, .k-textbox:hover .k-i-insert-n, .k-textbox:hover .k-insert-top, .k-button:active .k-i-insert-n, .k-button:active .k-insert-top { background-position: -176px -32px; } .k-i-insert-m, .k-insert-middle { background-position: -160px -48px; } .k-link:not(.k-state-disabled):hover > .k-i-insert-m, .k-link:not(.k-state-disabled):hover > .k-insert-middle, .k-state-hover > .k-i-insert-m, .k-state-hover > .k-insert-middle, .k-state-hover > * > .k-i-insert-m, .k-state-hover > * > .k-insert-middle, .k-button:not(.k-state-disabled):hover .k-i-insert-m, .k-button:not(.k-state-disabled):hover .k-insert-middle, .k-textbox:hover .k-i-insert-m, .k-textbox:hover .k-insert-middle, .k-button:active .k-i-insert-m, .k-button:active .k-insert-middle { background-position: -176px -48px; } .k-i-insert-s, .k-insert-bottom { background-position: -160px -64px; } .k-link:not(.k-state-disabled):hover > .k-i-insert-s, .k-link:not(.k-state-disabled):hover > .k-insert-bottom, .k-state-hover > .k-i-insert-s, .k-state-hover > .k-insert-bottom, .k-state-hover > * > .k-i-insert-s, .k-state-hover > * > .k-insert-bottom, .k-button:not(.k-state-disabled):hover .k-i-insert-s, .k-button:not(.k-state-disabled):hover .k-insert-bottom, .k-textbox:hover .k-i-insert-s, .k-textbox:hover .k-insert-bottom, .k-button:active .k-i-insert-s, .k-button:active .k-insert-bottom { background-position: -176px -64px; } .k-drop-hint { background-position: 0 -326px; } .k-i-note, .k-warning { background-position: -160px -240px; } .k-link:not(.k-state-disabled):hover > .k-i-note, .k-link:not(.k-state-disabled):hover > .k-warning, .k-state-hover > .k-i-note, .k-state-hover > .k-warning, .k-state-hover > * > .k-i-note, .k-state-hover > * > .k-warning, .k-button:not(.k-state-disabled):hover .k-i-note, .k-button:not(.k-state-disabled):hover .k-warning, .k-textbox:hover .k-i-note, .k-textbox:hover .k-warning, .k-button:active .k-i-note, .k-button:active .k-warning { background-position: -176px -240px; } .k-i-sort-asc { background-position: -112px -240px; } .k-link:not(.k-state-disabled):hover > .k-i-sort-asc, .k-state-hover > .k-i-sort-asc, .k-state-hover > * > .k-i-sort-asc, .k-button:not(.k-state-disabled):hover .k-i-sort-asc, .k-textbox:hover .k-i-sort-asc, .k-button:active .k-i-sort-asc { background-position: -128px -240px; } .k-i-sort-desc { background-position: -112px -256px; } .k-link:not(.k-state-disabled):hover > .k-i-sort-desc, .k-state-hover > .k-i-sort-desc, .k-state-hover > * > .k-i-sort-desc, .k-button:not(.k-state-disabled):hover .k-i-sort-desc, .k-textbox:hover .k-i-sort-desc, .k-button:active .k-i-sort-desc { background-position: -128px -256px; } .k-i-group { background-position: -112px -272px; } .k-link:not(.k-state-disabled):hover > .k-i-group, .k-state-hover > .k-i-group, .k-state-hover > * > .k-i-group, .k-button:not(.k-state-disabled):hover .k-i-group, .k-textbox:hover .k-i-group, .k-button:active .k-i-group { background-position: -128px -272px; } .k-i-ungroup { background-position: -112px -288px; } .k-link:not(.k-state-disabled):hover > .k-i-ungroup, .k-state-hover > .k-i-ungroup, .k-state-hover > * > .k-i-ungroup, .k-button:not(.k-state-disabled):hover .k-i-ungroup, .k-textbox:hover .k-i-ungroup, .k-button:active .k-i-ungroup { background-position: -128px -288px; } .k-i-columns { background-position: -112px -304px; } .k-link:not(.k-state-disabled):hover > .k-i-columns, .k-state-hover > .k-i-columns, .k-state-hover > * > .k-i-columns, .k-button:not(.k-state-disabled):hover .k-i-columns, .k-textbox:hover .k-i-columns, .k-button:active .k-i-columns { background-position: -128px -304px; } .k-i-hbars { background-position: -64px -32px; } .k-link:not(.k-state-disabled):hover > .k-i-hbars, .k-state-hover > .k-i-hbars, .k-state-hover > * > .k-i-hbars, .k-button:not(.k-state-disabled):hover .k-i-hbars, .k-textbox:hover .k-i-hbars, .k-button:active .k-i-hbars { background-position: -80px -32px; } .k-i-vbars { background-position: -64px -48px; } .k-link:not(.k-state-disabled):hover > .k-i-vbars, .k-state-hover > .k-i-vbars, .k-state-hover > * > .k-i-vbars, .k-button:not(.k-state-disabled):hover .k-i-vbars, .k-textbox:hover .k-i-vbars, .k-button:active .k-i-vbars { background-position: -80px -48px; } .k-i-sum { background-position: -64px -64px; } .k-link:not(.k-state-disabled):hover > .k-i-sum, .k-state-hover > .k-i-sum, .k-state-hover > * > .k-i-sum, .k-button:not(.k-state-disabled):hover .k-i-sum, .k-textbox:hover .k-i-sum, .k-button:active .k-i-sum { background-position: -80px -64px; } .k-i-pdf { background-position: -64px -80px; } .k-link:not(.k-state-disabled):hover > .k-i-pdf, .k-state-hover > .k-i-pdf, .k-state-hover > * > .k-i-pdf, .k-button:not(.k-state-disabled):hover .k-i-pdf, .k-textbox:hover .k-i-pdf, .k-button:active .k-i-pdf { background-position: -80px -80px; } .k-i-excel { background-position: -64px -96px; } .k-link:not(.k-state-disabled):hover > .k-i-excel, .k-state-hover > .k-i-excel, .k-state-hover > * > .k-i-excel, .k-button:not(.k-state-disabled):hover .k-i-excel, .k-textbox:hover .k-i-excel, .k-button:active .k-i-excel { background-position: -80px -96px; } .k-i-rotatecw { background-position: -64px -112px; } .k-link:not(.k-state-disabled):hover > .k-i-rotatecw, .k-state-hover > .k-i-rotatecw, .k-state-hover > * > .k-i-rotatecw, .k-button:not(.k-state-disabled):hover .k-i-rotatecw, .k-textbox:hover .k-i-rotatecw, .k-button:active .k-i-rotatecw { background-position: -80px -112px; } .k-i-rotateccw { background-position: -64px -128px; } .k-link:not(.k-state-disabled):hover > .k-i-rotateccw, .k-state-hover > .k-i-rotateccw, .k-state-hover > * > .k-i-rotateccw, .k-button:not(.k-state-disabled):hover .k-i-rotateccw, .k-textbox:hover .k-i-rotateccw, .k-button:active .k-i-rotateccw { background-position: -80px -128px; } .k-i-undo { background-position: -64px -160px; } .k-link:not(.k-state-disabled):hover > .k-i-undo, .k-state-hover > .k-i-undo, .k-state-hover > * > .k-i-undo, .k-button:not(.k-state-disabled):hover .k-i-undo, .k-textbox:hover .k-i-undo, .k-button:active .k-i-undo { background-position: -80px -160px; } .k-i-redo { background-position: -64px -144px; } .k-link:not(.k-state-disabled):hover > .k-i-redo, .k-state-hover > .k-i-redo, .k-state-hover > * > .k-i-redo, .k-button:not(.k-state-disabled):hover .k-i-redo, .k-textbox:hover .k-i-redo, .k-button:active .k-i-redo { background-position: -80px -144px; } .k-i-shape { background-position: -64px -176px; } .k-link:not(.k-state-disabled):hover > .k-i-shape, .k-state-hover > .k-i-shape, .k-state-hover > * > .k-i-shape, .k-button:not(.k-state-disabled):hover .k-i-shape, .k-textbox:hover .k-i-shape, .k-button:active .k-i-shape { background-position: -80px -176px; } .k-i-connector { background-position: -64px -192px; } .k-link:not(.k-state-disabled):hover > .k-i-connector, .k-state-hover > .k-i-connector, .k-state-hover > * > .k-i-connector, .k-button:not(.k-state-disabled):hover .k-i-connector, .k-textbox:hover .k-i-connector, .k-button:active .k-i-connector { background-position: -80px -192px; } .k-i-kpi { background-position: -64px -208px; } .k-link:not(.k-state-disabled):hover > .k-i-kpi, .k-state-hover > .k-i-kpi, .k-state-hover > * > .k-i-kpi, .k-button:not(.k-state-disabled):hover .k-i-kpi, .k-textbox:hover .k-i-kpi, .k-button:active .k-i-kpi { background-position: -80px -208px; } .k-i-dimension { background-position: -64px -224px; } .k-link:not(.k-state-disabled):hover > .k-i-dimension, .k-state-hover > .k-i-dimension, .k-state-hover > * > .k-i-dimension, .k-button:not(.k-state-disabled):hover .k-i-dimension, .k-textbox:hover .k-i-dimension, .k-button:active .k-i-dimension { background-position: -80px -224px; } .k-file { background-position: 0px 0px; } .k-link:not(.k-state-disabled):hover > .k-file, .k-state-hover > .k-file, .k-state-hover > * > .k-file, .k-button:not(.k-state-disabled):hover .k-file, .k-textbox:hover .k-file, .k-button:active .k-file { background-position: -16px 0px; } .k-i-folder-add, .k-addfolder { background-position: -32px -272px; } .k-link:not(.k-state-disabled):hover > .k-i-folder-add, .k-link:not(.k-state-disabled):hover > .k-addfolder, .k-state-hover > .k-i-folder-add, .k-state-hover > .k-addfolder, .k-state-hover > * > .k-i-folder-add, .k-state-hover > * > .k-addfolder, .k-button:not(.k-state-disabled):hover .k-i-folder-add, .k-button:not(.k-state-disabled):hover .k-addfolder, .k-textbox:hover .k-i-folder-add, .k-textbox:hover .k-addfolder, .k-button:active .k-i-folder-add, .k-button:active .k-addfolder { background-position: -48px -272px; } .k-i-folder-up, .k-goup { background-position: -32px -288px; } .k-link:not(.k-state-disabled):hover > .k-i-folder-up, .k-link:not(.k-state-disabled):hover > .k-goup, .k-state-hover > .k-i-folder-up, .k-state-hover > .k-goup, .k-state-hover > * > .k-i-folder-up, .k-state-hover > * > .k-goup, .k-button:not(.k-state-disabled):hover .k-i-folder-up, .k-button:not(.k-state-disabled):hover .k-goup, .k-textbox:hover .k-i-folder-up, .k-textbox:hover .k-goup, .k-button:active .k-i-folder-up, .k-button:active .k-goup { background-position: -48px -288px; } .k-i-more { background-position: -64px -32px; } .k-link:not(.k-state-disabled):hover > .k-i-more, .k-state-hover > .k-i-more, .k-state-hover > * > .k-i-more, .k-button:not(.k-state-disabled):hover .k-i-more, .k-textbox:hover .k-i-more, .k-button:active .k-i-more { background-position: -80px -32px; } .k-file > .k-icon { background-position: -115px -91px; } .k-image { border: 0; } .k-breadcrumbs:hover .k-i-arrow-n { background-position: 0 0; } .k-breadcrumbs:hover .k-i-arrow-e { background-position: 0 -16px; } /* Colors */ html .k-success-colored { color: #507f50; border-color: #d0dfd0; background-color: #f0fff0; } html .k-info-colored { color: #50607f; border-color: #d0d9df; background-color: #f0f9ff; } html .k-error-colored { color: #7f5050; border-color: #dfd0d0; background-color: #fff0f0; } .k-inline-block { padding: 0 2px; } /* loading */ .k-loading, .k-loading-image { background-color: transparent; background-repeat: no-repeat; background-position: center center; } .k-loading-mask, .k-loading-image, .k-loading-text { position: absolute; } .k-loading-text { text-indent: -4000px; text-align: center; /*rtl*/ } .k-loading-image, .k-loading-color { width: 100%; height: 100%; } .k-loading-image { top: 0; left: 0; z-index: 2; } .k-loading-color { filter: alpha(opacity=30); opacity: .3; } .k-content-frame { border: 0; width: 100%; height: 100%; } .k-pane > .k-splitter-overlay { filter: alpha(opacity=0); opacity: 0; position: absolute; } /* drag n drop */ .k-drag-clue { position: absolute; z-index: 10003; border-style: solid; border-width: 1px; font-size: .9em; padding: .2em .4em; white-space: nowrap; cursor: default; } .k-drag-status { margin-top: -3px; margin-right: 4px; vertical-align: middle; } .k-reorder-cue { position: absolute; width: 1px; overflow: visible; } .k-reorder-cue .k-icon { position: absolute; left: -4px; width: 8px; height: 4px; } .k-reorder-cue .k-i-arrow-s { top: -4px; background-position: -4px -166px; } .k-reorder-cue .k-i-arrow-n { bottom: -4px; background-position: -4px -134px; } /* virtual scrollbar */ .k-scrollbar { position: absolute; overflow: scroll; } .k-scrollbar-vertical { top: 0; right: 0; width: 17px; /* scrollbar width */ height: 100%; overflow-x: hidden; } .k-touch-scrollbar { display: none; position: absolute; z-index: 200000; height: 8px; width: 8px; border: 1px solid #8a8a8a; background-color: #858585; } @media only screen and (-webkit-min-device-pixel-ratio: 2) { body .k-touch-scrollbar { height: 12px; width: 12px; border-radius: 7px; } } .k-virtual-scrollable-wrap { overflow-x: auto; /*needed by IE8*/ } /* current time indicator */ .k-current-time { background: #f00; position: absolute; } /* override box sizing for grid layout framework integration (Bootstrap 3, Foundation 4) */ .k-animation-container, .k-widget, .k-widget *, .k-animation-container *, .k-widget *:before, .k-animation-container *:after, .k-block .k-header, .k-list-container { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } .k-button, .k-textbox, .k-autocomplete, div.k-window-content, .k-tabstrip > .k-content > .km-scroll-container, .k-block, .k-edit-cell .k-widget, .k-grid-edit-row .k-widget, .k-grid-edit-row .text-box, .km-actionsheet > li, .km-shim { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } /* Fix for Bootstrap 3 */ .input-group .form-control { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .form-control.k-widget { padding: 0; } a.k-button:hover { text-decoration: none; } /* override iOS styles in mobile Kendo */ .k-widget, .k-widget * { -moz-background-clip: border-box; -webkit-background-clip: border-box; background-clip: border-box; } input.k-checkbox, .k-radio { display: inline; opacity: 0; width: 0; margin: 0; } .k-checkbox-label { position: relative; padding-left: 1.5em; vertical-align: middle; line-height: 0.875em; cursor: pointer; } .k-checkbox-label:before { content: ""; position: absolute; top: 0; left: 0; width: 1em; height: 1em; border-width: 1px; border-style: solid; } .k-checkbox-label:after { content: ""; position: absolute; top: 0; left: 0; width: 1em; height: 1em; border-width: 1px; border-style: solid; } .k-checkbox:checked + .k-checkbox-label:after { content: "\2713"; width: 1em; height: 1em; position: absolute; top: 0; left: 0; border-width: 1px; border-style: solid; text-align: center; } .k-checkbox:disabled + .k-checkbox-label { cursor: auto; } .k-radio-label { position: relative; padding-left: 1.5em; vertical-align: middle; line-height: 0.875em; cursor: pointer; } .k-radio-label:before { content: ""; position: absolute; top: 0; left: 0; width: 14px; height: 14px; border-style: solid; } .k-radio:checked + .k-radio-label:after { content: ""; width: 10px; height: 10px; position: absolute; top: 3px; left: 3px; } .k-radio:disabled + .k-radio-label { cursor: auto; } .k-ie8 .k-checkbox, .k-ie8 .k-radio { display: inline-block; } .k-ie8 .k-checkbox-label, .k-ie8 .k-radio-label { padding-left: 0; } .k-ie8 .k-checkbox-label:before, .k-ie8 .k-checkbox-label:after, .k-ie8 .k-radio-label:before, .k-ie8 .k-radio-label:after { display: none; } /* RTL for checkboxes and radio buttons */ .k-rtl .k-checkbox-label, .k-rtl .k-radio-label { padding-right: 1.5em; } .k-rtl .k-checkbox-label:before, .k-rtl .k-checkbox-label:after, .k-rtl .k-radio-label:before { right: 0; } .k-rtl .k-radio:checked + .k-radio-label:after { right: 3px; } input.k-checkbox + label { -webkit-user-select: none; user-select: none; } .k-edit-form { margin: 0; padding: 0; } .k-window > div.k-popup-edit-form { padding: 1em 0; } .k-grid-edit-row .k-edit-form td { border-bottom-width: 0; } .k-edit-form-container { position: relative; width: 400px; } .k-edit-label, .k-edit-form-container .editor-label { float: left; clear: both; width: 30%; padding: .4em 0 1em; margin-left: 2%; text-align: right; } .k-edit-field, .k-edit-form-container .editor-field { float: right; clear: right; width: 60%; margin-right: 2%; padding: 0 0 .6em; } .k-edit-field > input[type="checkbox"], .k-edit-field > input[type="radio"] { margin-top: .4em; } .k-edit-form-container .k-button { margin: 0 .16em; } .k-edit-field > input[type="checkbox"]:first-child, .k-edit-field > input[type="radio"]:first-child, .k-edit-field > label:first-child > input[type="checkbox"], .k-edit-field > .k-button:first-child { margin-left: 0; } .k-edit-form-container .k-edit-buttons { clear: both; text-align: right; border-width: 1px 0 0; border-style: solid; position: relative; bottom: -1em; padding: .6em; } /* Window */ div.k-window { display: inline-block; position: absolute; z-index: 10001; border-style: solid; border-width: 1px; padding-top: 2em; } .k-block > .k-header, .k-window-titlebar { position: absolute; width: 100%; height: 1.1em; border-bottom-style: solid; border-bottom-width: 1px; margin-top: -2em; padding: .4em 0; font-size: 1.2em; white-space: nowrap; min-height: 16px; /* icon size */ } .k-block > .k-header { position: relative; margin: -2px 0 10px -2px; padding: .3em 2px; } .k-window-title { position: absolute; left: .44em; right: .44em; overflow: hidden; cursor: default; text-overflow: ellipsis; } .k-window-title .k-image { margin: 0 5px 0 0; vertical-align: middle; } div.k-window-titleless { padding-top: 0; } div.k-window-content { position: relative; height: 100%; padding: .58em; overflow: auto; outline: 0; } div.k-window-iframecontent { padding: 0; overflow: visible; } .k-window-content > .km-scroll-container { height: 100%; } /* Compensate for content padding in IE7 */ .k-ie7 .k-window { padding-bottom: 1.16em; } .k-ie7 .k-window-titleless { padding-bottom: 0; } .k-window-titlebar .k-window-actions { position: absolute; top: 0; right: .3em; padding-top: .3em; white-space: nowrap; } .k-window-titlebar .k-window-action { display: inline-block; width: 16px; height: 16px; padding: 2px; text-decoration: none; vertical-align: middle; opacity: .7; } .k-window-titlebar .k-state-hover { border-style: solid; border-width: 1px; padding: 1px; opacity: 1; } .k-window-action .k-icon { margin: 0; vertical-align: top; } .k-window > .k-resize-handle { position: absolute; z-index: 1; background-color: #fff; font-size: 0; line-height: 6px; filter: alpha(opacity=0); opacity: 0; zoom: 1; } .k-resize-n { top: -3px; left: 0; width: 100%; height: 6px; cursor: n-resize; } .k-resize-e { top: 0; right: -3px; width: 6px; height: 100%; cursor: e-resize; } .k-resize-s { bottom: -3px; left: 0; width: 100%; height: 6px; cursor: s-resize; } .k-resize-w { top: 0; left: -3px; width: 6px; height: 100%; cursor: w-resize; } .k-resize-se { bottom: -3px; right: -3px; width: 16px; height: 16px; cursor: se-resize; } .k-resize-sw { bottom: -3px; left: -3px; width: 6px; height: 6px; cursor: sw-resize; } .k-resize-ne { top: -3px; right: -3px; width: 6px; height: 6px; cursor: ne-resize; } .k-resize-nw { top: -3px; left: -3px; width: 6px; height: 6px; cursor: nw-resize; } .k-overlay { position: fixed; top: 0; left: 0; z-index: 10001; width: 100%; height: 100%; background-color: #000; filter: alpha(opacity=50); opacity: .5; } .k-window .k-overlay { position: absolute; width: 100%; height: 100%; background-color: #fff; filter: alpha(opacity=0); opacity: 0; } /* TabStrip */ .k-tabstrip { margin: 0; padding: 0; zoom: 1; } .k-tabstrip .k-tabstrip-items { padding: 0.3em 0.3em 0; } .k-tabstrip-items .k-item, .k-panelbar .k-tabstrip-items .k-item { list-style-type: none; display: inline-block; position: relative; border-style: solid; border-width: 1px 1px 0; margin: 0 -1px 0 0; padding: 0; vertical-align: top; } .k-tabstrip-items .k-tab-on-top, .k-tabstrip-items .k-state-active, .k-panelbar .k-tabstrip-items .k-state-active { margin-bottom: -1px; padding-bottom: 1px; } .k-tabstrip-items .k-tab-on-top { z-index: 1; } .k-tabstrip-items .k-link, .k-panelbar .k-tabstrip-items .k-link { display: inline-block; border-bottom-width: 0; padding: .5em .92em; } .k-tabstrip-items .k-icon, .k-panelbar .k-tabstrip-items .k-icon { margin: -1px 4px 0 -3px; vertical-align: top; } .k-tabstrip-items .k-item .k-image, .k-tabstrip-items .k-item .k-sprite, .k-panelbar .k-tabstrip-items .k-item .k-image, .k-panelbar .k-tabstrip-items .k-item .k-sprite { margin: -3px 3px 0 -6px; vertical-align: middle; } .k-ie7 .k-tabstrip-items .k-item .k-image, .k-ie7 .k-tabstrip-items .k-item .k-sprite { margin-top: -1px; vertical-align: top; } /* TabStrip Loading Progress */ .k-tabstrip-items .k-loading { top: 0; left: 0; height: 0; width: 20%; position: absolute; background: transparent; border-top: 1px solid transparent; border-color: inherit; -webkit-transition: width 200ms linear; -moz-transition: width 200ms linear; -o-transition: width 200ms linear; transition: width 200ms linear; -webkit-transition: "width 200ms linear"; -moz-transition: "width 200ms linear"; -ms-transition: "width 200ms linear"; -o-transition: "width 200ms linear"; transition: "width 200ms linear"; animation: k-tab-loader 1s ease-in-out infinite; -moz-animation: k-tab-loader 1s ease-in-out infinite; -webkit-animation: k-tab-loader 1s ease-in-out infinite; } .k-tabstrip-items .k-progress { animation: none; -moz-animation: none; -webkit-animation: none; } .k-tabstrip-items .k-loading.k-complete { width: 100%; animation: none; -moz-animation: none; -webkit-animation: none; } .k-tabstrip > .k-content, .k-panelbar .k-tabstrip > .k-content { position: static; border-style: solid; border-width: 1px; margin: 0 .286em .3em; padding: .3em .92em; zoom: 1; } .k-tabstrip > .k-content { display: none; } .k-tabstrip > .k-content.km-scroll-wrapper { padding: 0; } .k-tabstrip > .k-content > .km-scroll-container { padding: .3em .92em; } @-webkit-keyframes k-tab-loader { 0% { left: 0; } 50% { left: 80%; } 100% { left: 0; } } @-moz-keyframes k-tab-loader { 0% { left: 0; } 50% { left: 80%; } 100% { left: 0; } } @keyframes k-tab-loader { 0% { left: 0; } 50% { left: 80%; } 100% { left: 0; } } /* PanelBar */ .k-panelbar { zoom: 1; } .k-panelbar > .k-item, .k-panel > .k-item { list-style-type: none; display: block; border-width: 0; margin: 0; zoom: 1; border-radius: 0; } .k-panelbar .k-image, .k-panelbar .k-sprite { float: left; margin-top: 4px; margin-right: 5px; vertical-align: middle; } .k-panelbar > .k-item > .k-link, .k-panel > .k-item > .k-link { display: block; position: relative; border-bottom-style: solid; border-bottom-width: 1px; padding: 0 1em; line-height: 2.34em; text-decoration: none; zoom: 1; } .k-panelbar-expand, .k-panelbar-collapse { position: absolute; top: 50%; right: 4px; margin-top: -8px; } .k-panelbar .k-panel, .k-panelbar .k-content { position: relative; border-bottom-style: solid; border-bottom-width: 1px; margin: 0; padding: 0; zoom: 1; } .k-panel > .k-item > .k-link { border-bottom: 0; font-size: .95em; line-height: 2.2; } .k-panel .k-panel > .k-item > .k-link { padding-left: 2em; } .k-panelbar .k-i-seek-e .k-link { border-bottom: 0; } .k-panel .k-panel { border-bottom: 0; } /* Menu */ .k-menu { cursor: default; } .k-menu, .k-menu .k-menu-group { list-style: none; margin: 0; padding: 0; zoom: 1; } .k-menu:after { content: ''; display: block; width: 99%; height: 0; float: inherit; overflow: hidden; } .k-menu .k-item { -webkit-user-select: none; -moz-user-select: -moz-none; user-select: none; } .k-menu .k-item div { -webkit-user-select: default; -moz-user-select: default; user-select: default; } .k-menu .k-item .k-item, ul.k-menu-vertical > .k-item { display: block; float: none; border-width: 0; } .k-ie7 .k-menu .k-item .k-item { zoom: normal; } .k-menu .k-item > .k-link > .k-icon, .k-menu .k-image, .k-menu .k-sprite { margin: -2px 4px 0 -4px; vertical-align: middle; } .k-menu .k-item > .k-link > .k-icon { margin: -2px 0 0; } .k-ie7 .k-menu .k-item > .k-link > .k-i-arrow-s, .k-ie7 .k-menu .k-image, .k-ie7 .k-menu .k-sprite { margin-top: 0; } .k-menu .k-item > .k-link { display: block; padding: 0.5em 1.1em 0.4em; line-height: 1.34em; -khtml-user-select: none; -webkit-user-select: none; -moz-user-select: -moz-none; -ms-user-select: none; user-select: none; } .k-menu .k-menu-group { display: none; border-style: solid; border-width: 1px; overflow: visible; white-space: nowrap; } .k-menu .k-menu-group > .k-item { display: block; border-width: 0; } .k-menu .k-item, .k-widget.k-menu-horizontal > .k-item { position: relative; float: left; border-style: solid; border-width: 0 1px 0 0; vertical-align: top; zoom: 1; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } .k-context-menu.k-menu-vertical > .k-item > .k-link, .k-menu .k-menu-group .k-item > .k-link { padding: .28em 1.8em .38em .9em; } .k-context-menu.k-menu-horizontal > .k-separator { display: none; } .k-context-menu.k-menu-horizontal > .k-item { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .k-context-menu.k-menu-horizontal > .k-last { border: 0; } .k-ie7 .k-menu .k-menu-group .k-link { width: 100%; } .k-menu .k-item > .k-link > .k-i-arrow-s { margin-right: -8px; } .k-menu .k-item > .k-link > .k-i-arrow-e { position: absolute; top: 50%; margin-top: -8px; right: 2px; right: .2rem; } .k-menu .k-animation-container { border: 0; } .k-menu .k-animation-container, .k-menu .k-menu-group { position: absolute; left: 0; } .k-menu .k-animation-container .k-animation-container, .k-menu .k-menu-group .k-menu-group, .k-menu-vertical .k-animation-container, .k-menu-vertical .k-menu-group { top: 0; left: 0; } .k-menu .k-animation-container .k-menu-group { top: auto; left: auto; margin-left: -1px; } .k-menu .k-animation-container, .k-popup .k-animation-container { margin-top: -1px; padding-left: 1px; } .k-ie .k-menu .k-animation-container, .k-ie .k-popup .k-animation-container { margin-top: -2px; } .k-popup .k-animation-container .k-popup { margin-left: -1px; } ul.k-menu .k-separator { padding: 0.25em 0; height: 100%; width: 1px; font-size: 0; line-height: 0; border-width: 0 1px 0 0; } ul.k-menu-vertical .k-separator, .k-menu .k-menu-group .k-separator { padding: 0; height: 1px; width: 100%; border-width: 1px 0 0; } /* Context Menu */ .k-context-menu { border: 0; -webkit-user-select: none; -moz-user-select: -moz-none; user-select: none; } /* Grid */ .k-grid, .k-listview { position: relative; zoom: 1; } .k-grid table { width: 100%; margin: 0; /* override CSS libraries */ max-width: none; border-collapse: separate; border-spacing: 0; empty-cells: show; border-width: 0; outline: none; } .k-header.k-drag-clue { overflow: hidden; } .k-grid-header th.k-header, .k-filter-row th { overflow: hidden; border-style: solid; border-width: 0 0 1px 1px; padding: .5em .6em .4em .6em; font-weight: normal; white-space: nowrap; text-overflow: ellipsis; text-align: left; } .k-grid-header th.k-header { vertical-align: bottom; } .k-filtercell, .k-filtercell > span, .k-filtercell .k-widget { display: block; width: auto; } .k-filtercell > span { padding-right: 4.8em; position: relative; min-height: 2em; line-height: 2em; } .k-filtercell > .k-operator-hidden { padding-right: 2.3em; } .k-filtercell > span > .k-button, .k-filter-row .k-dropdown-operator { position: absolute; top: 0; right: 0; } .k-filter-row .k-dropdown-operator { width: 2.1em; right: 2.5em; } .k-filtercell > span > label { vertical-align: middle; } .k-filter-row label > input[type="radio"] { vertical-align: middle; position: relative; bottom: 2px; } .k-ie10 .k-grid-header a:active { background-color: transparent; /*remove gray background*/ } .k-grid-header th.k-header > .k-link { display: block; min-height: 18px; line-height: 18px; /* due to sorting icons*/ margin: -0.5em -0.6em -0.4em -0.6em; padding: .5em .6em .4em .6em; overflow: hidden; text-overflow: ellipsis; } .k-grid-header th.k-with-icon .k-link { margin-right: 18px; } .k-grid-header th.k-header .k-icon { position: static; } .k-grid-header th > .k-link > .k-icon { vertical-align: text-top; } .k-grid .k-state-hover { cursor: pointer; } /*fixes Chrome 38+ column resizing glitches*/ .k-grid-column-resizing th, .k-grid-column-resizing td { -webkit-transform: translateZ(0); } .k-grid td { border-style: solid; border-width: 0 0 0 1px; padding: .4em .6em; overflow: hidden; line-height: 1.6em; vertical-align: middle; text-overflow: ellipsis; } .k-grid .k-grouping-row td, .k-grid .k-hierarchy-cell { overflow: visible; } .k-grid-edit-row td { text-overflow: clip; } .k-grid-edit-row .k-textbox, .k-grid-edit-row .text-box { /*reset default webkit styles*/ margin-top: 0; margin-bottom: 0; } .k-grid-header-wrap, .k-grid-footer-wrap { position: relative; width: 100%; overflow: hidden; border-style: solid; border-width: 0 1px 0 0; zoom: 1; } div.k-grid-header, div.k-grid-footer { padding-right: 17px; /* scrollbar width; may vary; can be calculated */ border-bottom-style: solid; border-bottom-width: 1px; zoom: 1; } .k-grid-header-wrap > table, .k-grid-header-locked > table { margin-bottom: -1px; } .k-grid-content { position: relative; width: 100%; overflow: auto; overflow-x: auto; overflow-y: scroll; zoom: 1; } .k-mobile .k-grid tbody { -webkit-backface-visibility: hidden; } .k-mobile .k-grid-backface tbody { -webkit-backface-visibility: visible; } .k-grid-content-expander { position: absolute; visibility: hidden; height: 1px; } @media print { .k-grid { height: auto !important; } .k-grid-header { padding: 0 !important; } .k-grid-header-wrap, .k-grid-content { overflow: visible; height: auto !important; } } .k-virtual-scrollable-wrap { height: 100%; overflow-y: hidden; position: relative; } .k-grid-header table, .k-grid-content table, .k-grid-footer table, .k-grid-content-locked > table { table-layout: fixed; } .k-ie7 .k-grid-content table { width: auto; } /* Grid :: locked columns */ .k-grid-lockedcolumns { white-space: nowrap; } .k-grid-content-locked, .k-grid-content, .k-pager-wrap { white-space: normal; } .k-grid-header-locked, .k-grid-content-locked, .k-grid-footer-locked { display: inline-block; vertical-align: top; overflow: hidden; /* generally uneeded */ position: relative; border-style: solid; border-width: 0 1px 0 0; } .k-grid-header-locked + .k-grid-header-wrap, .k-grid-content-locked + .k-grid-content, .k-grid-footer-locked + .k-grid-footer-wrap { display: inline-block; vertical-align: top; } .k-grid-toolbar { border-style: solid; border-width: 1px 0 0; } .k-grid-header th.k-header:first-child, .k-grid tbody td:first-child, .k-grid tfoot td:first-child, .k-filter-row > th:first-child { border-left-width: 0; } .k-grid-header th.k-header.k-first { border-left-width: 1px; } .k-grid-toolbar:first-child, .k-grouping-header + .k-grid-toolbar { border-width: 0 0 1px; } /* Grid :: footer */ .k-footer-template td { border-style: solid; border-width: 1px 0 0 1px; } .k-group-footer td { border-style: solid; border-width: 1px 0; } .k-group-footer .k-group-cell + td { border-left-width: 1px; } .k-grid-footer { border-style: solid; border-width: 1px 0 0; } .k-grid-footer td { border-top-width: 0; } .k-grid-footer > td { border-top-width: 1px; } /* Grid :: paging */ .k-pager-wrap { clear: both; overflow: hidden; border-style: solid; border-width: 1px; line-height: 2.0em; padding: 0.333em 0 0.333em 0.250em; } .k-grid-pager { border-width: 1px 0 0; } .k-grid .k-pager-numbers, .k-pager-numbers .k-link, .k-pager-numbers .k-state-selected { display: inline-block; vertical-align: top; margin-right: 1px; } .k-pager-numbers { margin: 0 2px; } .k-pager-numbers .k-state-selected { vertical-align: top; } .k-pager-numbers li, .k-pager-input { float: left; } .k-grid .k-pager-numbers { float: left; cursor: default; } .k-pager-info { float: right; padding: 0 1.333em; } .k-pager-numbers .k-link { text-decoration: none; } .k-pager-wrap > .k-link, .k-pager-numbers .k-link, .k-pager-numbers .k-state-selected { min-width: 2em; } .k-pager-wrap > .k-link { float: left; margin: 0 0.08333em; height: 2em; /*IE7*/ line-height: 2em; /*IE7*/ border-radius: 1.0833em; cursor: pointer; text-align: center; } .k-pager-wrap > a.k-state-disabled:hover { background: none; cursor: default; } .k-pager-numbers .k-link { text-align: center; line-height: 2em; border-style: solid; border-width: 1px; border-radius: 1.0833em; } .k-pager-wrap > .k-link { border-style: solid; border-width: 1px; } .k-pager-wrap .k-pager-refresh { float: right; margin-right: 0.5em; border-width: 0; border-radius: 0; } .k-pager-numbers .k-state-selected { border-style: solid; border-width: 1px; text-align: center; border-radius: 1.0833em; } .k-pager-wrap .k-textbox { width: 3.333em; } .k-ie7 .k-pager-wrap .k-textbox { height: 1.3333em; margin-top: 0.16666em; display: inline; } .k-pager-wrap .k-dropdown { width: 4.500em; } .k-pager-refresh { float: right; } .k-pager-input, .k-pager-sizes { padding: 0 1.4166em; } .k-pager-sizes { display: inline-block; padding-top: 1px; } .k-pager-sizes .k-widget.k-dropdown { margin-top: -2px; } .k-ie7 .k-pager-sizes { float: left; } .k-pager-wrap .k-textbox, .k-pager-wrap .k-widget { margin: 0 .4em 0; } /* Grid :: filtering */ .k-header > .k-grid-filter, .k-header > .k-header-column-menu { float: right; margin: -0.5em -0.6em -0.4em; padding: .5em .2em .4em; position: relative; z-index: 1; /*mvc site.css*/ } .k-grid .k-animation-container { position: absolute; } .k-filter-menu { padding: .5em; } form.k-filter-menu .k-widget, form.k-filter-menu .k-textbox { display: block; } .k-filter-help-text, .k-filter-menu .k-widget, .k-filter-menu .k-textbox { margin: .19em 0 0; } .k-filter-menu span.k-filter-and { width: 6em; margin: .5em 0 .5em; } .k-filter-menu .k-button { width: 48%; margin: .5em 4% 0 0; } .k-filter-menu .k-button + .k-button { margin-right: 0; } /* Grid :: grouping */ .k-grouping-row .k-icon { margin: -3px 4px 0 2px; } .k-grouping-row p { display: inline-block; vertical-align: middle; margin-left: -0.6em; padding: 0 .6em; } .k-grouping-row + tr td { border-top-width: 1px; } .k-grouping-row .k-group-cell, .k-grouping-row + tr .k-group-cell { border-top-width: 0; text-overflow: none; } .k-grid .k-hierarchy-cell + td { border-left-width: 0; } .k-grid .k-group-col, .k-grid .k-hierarchy-col { width: 27px; } .k-grouping-header { border-bottom-style: solid; border-bottom-width: 1px; } .k-grouping-header { line-height: 2; } .k-grouping-dropclue { position: absolute; width: 6px; height: 25px; background-repeat: no-repeat; background-position: -165px -148px; } .k-grouping-header .k-group-indicator { display: inline-block; border-style: solid; border-width: 1px; margin: 0 3px; padding: .15em .15em .15em .4em; line-height: 1.5em; } .k-grouping-header .k-link { display: inline-block; border-width: 0; padding: 0; line-height: normal; text-decoration: none; } .k-grouping-header .k-button { border: 0; padding: 0; background: transparent; line-height: 1; } .k-grouping-header .k-link .k-icon { margin: 0 0 0 -3px; } .k-grouping-header .k-button .k-icon { margin: 0 0 0 3px; } .k-grouping-header a, .k-grouping-header .k-button { display: inline-block; vertical-align: middle; } /* Grid :: editing */ .k-dirty-cell:before { content: "\a0"; display: inline-block; width: 0; float: left; } .k-ie7 .k-dirty-cell { position: relative; } .k-ie7 .k-dirty { top: 5px; } .k-dirty { position: absolute; width: 0; height: 0; border-style: solid; border-width: 3px; border-color: #f00 transparent transparent #f00; margin: -0.45em 0 0 -0.6em; padding: 0; overflow: hidden; vertical-align: top; } .k-grouping-header, .k-grid-toolbar { margin: 0; padding: 0.22em 0.2em 0.28em; cursor: default; } .k-grid .k-edit-container { padding: 0; } .k-grid .field-validation-error { display: block; } .k-grid .input-validation-error { border-style: ridge; border-color: #f00; background-color: #ffc0cb; } .k-grid-toolbar .k-button { vertical-align: middle; } .k-grid-actions { display: inline-block; } .k-ie7 .k-grid-actions { vertical-align: bottom; } .k-grid .k-button { margin: 0 .16em; } .k-grid tbody .k-button, .k-ie8 .k-grid tbody button.k-button { min-width: 64px; } .k-grid tbody button.k-button { min-width: 78px; /* for all except IE8 */ } .k-ie7 .k-grid tbody a.k-button { min-width: 62px; /* for IE7 link buttons */ } html body .k-grid tbody .k-button-icon { width: auto; min-width: 0; } .k-detail-row { position: relative; } .k-grid .k-detail-cell { overflow: visible; } .k-grid .k-edit-cell { padding: 0 .3em; white-space: nowrap; } .k-grid .k-edit-cell .k-tooltip { white-space: normal; } .k-edit-cell > .k-textbox, .k-edit-cell > .k-widget, .k-grid-edit-row > td > .k-textbox, .k-grid-edit-row > td > .k-widget, .k-grid-edit-row > td > .text-box { width: 100%; } .k-ie7 .k-edit-cell > .text-box, .k-ie7 .k-edit-cell > .k-textbox, .k-ie7 .k-edit-cell > .k-widget, .k-ie7 .k-grid-edit-row > td > .k-textbox, .k-ie7 .k-grid-edit-row > td > .k-widget, .k-ie7 .k-grid-edit-row > td > .text-box { display: block; width: 90%; } html .k-edit-cell .k-tooltip, html .k-grid-edit-row .k-tooltip { width: auto; max-width: 300px; } .k-edit-cell input[type="checkbox"] { margin-left: .6em; } .k-grid tbody td > .k-grid-delete { margin-top: -0.2em; margin-bottom: -0.2em; } /* Grid :: resizing */ .k-grid-resize-indicator { position: absolute; width: 2px; background-color: #aaa; } .k-grid-header .k-resize-handle, .k-grid > .k-resize-handle { position: absolute; height: 25px; cursor: col-resize; z-index: 2; } .k-marquee { position: absolute; z-index: 100000; } .k-marquee-color, .k-marquee-text { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .k-marquee-color { filter: alpha(opacity=60); opacity: .6; } .k-ie9 .k-column-menu { width: 160px; /*fix flicker on item hover*/ } .k-ie8 .k-grid-filter, .k-ie8 .k-header-column-menu { font-size: 100%; /* Fix small menus in IE8 */ } .k-column-menu { min-width: 160px; } .k-column-menu .k-sprite { margin-right: 10px; } .k-column-menu > .k-menu { border-width: 0; } .k-columns-item .k-group { max-height: 200px; overflow: auto; } .k-treelist .k-status { padding: .4em .6em; line-height: 1.6em; } .k-treelist .k-status .k-loading { vertical-align: baseline; margin-right: 5px; } .k-treelist tr.k-hidden { display: none; } /* Gantt Chart start */ /* Gantt Main Layout */ .k-gantt { white-space: nowrap; position: relative; } .k-gantt-layout { display: inline-block; white-space: normal; vertical-align: top; } .k-gantt .k-splitbar { position: relative; cursor: e-resize; width: 5px; border-width: 0 1px; background-repeat: repeat-y; } .k-gantt .k-gantt-layout th { vertical-align: bottom; } .k-gantt td { overflow: hidden; white-space: nowrap; vertical-align: top; } .k-gantt .k-grid .k-edit-cell { vertical-align: middle; } .k-gantt-treelist > .k-treelist, .k-gantt-timeline > .k-timeline { border-width: 0; height: 100%; } /* Gantt Toolbar, footer */ .k-gantt-toolbar { border-style: solid; border-width: 0 0 1px; line-height: 2.4em; padding: .5em; } .k-gantt-layout + .k-gantt-toolbar { border-width: 1px 0 0; } .k-gantt-actions, .k-gantt-toolbar > ul { float: left; margin-right: .6em; } .k-gantt-toolbar > .k-gantt-views { float: right; margin-right: 0; } .k-gantt-toolbar > ul > li { display: inline-block; border-style: solid; border-width: 1px 1px 1px 0; } .k-gantt-toolbar > ul > li:first-child { border-left-width: 1px; } .k-gantt-toolbar .k-link { display: inline-block; padding: 0 1.1em; } .k-gantt-toolbar li:first-child, .k-gantt-toolbar li:first-child > .k-link { border-top-left-radius: 4px; border-bottom-left-radius: 4px; } .k-gantt-toolbar li:last-child, .k-gantt-toolbar li:last-child > .k-link { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .k-gantt-toolbar li.k-button { line-height: inherit; padding-top: 0; padding-bottom: 0; } /* Gantt TreeList */ .k-gantt-treelist .k-grid-header tr { height: 5em; } .k-gantt .k-treelist .k-grid-header { padding: 0 !important; } .k-gantt .k-treelist .k-grid-content { overflow-y: hidden; overflow-x: scroll; } .k-treelist-group > tr > span { font-weight: bold; } .k-treelist-group .k-widget { font-weight: normal; } /* Gantt TimeLine */ .k-gantt-timeline .k-grid-header tr { height: 2.5em; } .k-gantt-rows tr, .k-gantt-tasks tr, .k-gantt .k-grid-content tr { height: 2.3em; } .k-gantt .k-gantt-tasks td:after { content: "\a0"; } .k-gantt-timeline { background: transparent; } .k-gantt-rows, .k-gantt-columns, .k-gantt-dependencies { position: absolute; top: 0; left: 0; } .k-gantt-tables { position: relative; } .k-gantt .k-gantt-timeline th { text-align: center; } .k-gantt .k-gantt-timeline tr:first-child th { border-bottom-width: 1px; } /* Gantt TimeLine objects */ /* Summary */ .k-task-summary { height: 10px; display: inline-block; vertical-align: top; margin-top: 3px; } .k-task-summary-complete { height: 10px; position: relative; z-index: 2; } .k-task-summary-progress { height: 15px; overflow: hidden; } .k-task-summary:before, .k-task-summary-complete:before, .k-task-summary:after, .k-task-summary-complete:after { content: ""; position: absolute; top: 0; width: 0; height: 0; border-style: solid; border-width: 8px; border-color: transparent; } .k-task-summary:before, .k-task-summary-complete:before { left: 0; border-left-color: inherit; } .k-task-summary:after, .k-task-summary-complete:after { right: 0; border-right-color: inherit; } /* Lines */ .k-line-h, .k-line-v { position: absolute; } .k-line-h { height: 2px; } .k-line-v { width: 2px; } .k-arrow-e, .k-arrow-w { position: absolute; top: -4px; width: 0; height: 0; border-style: solid; border-width: 5px; } .k-arrow-e { right: -6px; border-top-color: transparent; border-bottom-color: transparent; border-right-color: transparent; } .k-arrow-w { left: -6px; border-top-color: transparent; border-bottom-color: transparent; border-left-color: transparent; } /* Milestone */ .k-task-milestone { width: 13px; height: 13px; margin-top: 3px; border-style: solid; border-width: 1px; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .k-ie8 .k-task-milestone, .k-ie7 .k-task-milestone { margin-left: 1px; } /* Button */ .k-gantt .k-gantt-treelist .k-button, .k-gantt .k-gantt-tasks .k-button-icon { padding-top: 0; padding-bottom: 0; } .k-gantt .k-gantt-tasks .k-button-icon { margin-top: 4px; } .k-gantt .k-gantt-treelist .k-button { margin-top: -4px; margin-bottom: -2px; } .k-gantt .k-gantt-tasks .k-button-icon { padding-left: 2px; padding-right: 2px; } .k-gantt .k-gantt-treelist .k-button .k-icon, .k-gantt .k-gantt-tasks .k-button .k-icon { vertical-align: text-top; } .k-rel .k-button-icon { position: absolute; left: 200px; } /* Tasks */ .k-rel { position: relative; height: 0; top: -0.3em; } .k-task-wrap { position: absolute; padding: 0 23px 5px; margin: -1px -23px 0; z-index: 2; } .k-task-wrap:hover, .k-line.k-state-selected { z-index: 3; } .k-milestone-wrap { margin: 0 -13px 0 -27px; } .k-task-content { position: relative; z-index: 2; } .k-task-complete { position: absolute; top: 0; bottom: 0; left: 0; width: 20%; z-index: 1; } .k-task-dot { position: absolute; top: 0; width: 16px; height: 16px; line-height: 16px; display: none; cursor: pointer; } .k-task-dot.k-state-hover { background-color: transparent; } .k-task-single + .k-task-dot, .k-task-single + .k-task-dot + .k-task-dot { top: .2em; } .k-task-wrap:hover .k-task-dot, .k-task-wrap-active .k-task-dot { display: block; } .k-task-dot:before { content: "\a0"; display: inline-block; width: 0; height: 16px; } .k-task-dot:after { content: ""; display: inline-block; vertical-align: middle; width: 8px; height: 8px; border-radius: 4px; margin-left: 4px; } .k-task-dot:hover:after, .k-task-dot.k-state-hover:after, .k-task-wrap-active .k-task-dot:after { border-style: solid; border-width: 1px; margin-left: 3px; } .k-task-start { left: 0; } .k-task-end { right: 0; } .k-task-single { border-style: solid; border-width: 1px; text-align: left; overflow: hidden; cursor: default; min-height: 1.3em; white-space: nowrap; } .k-task-template { padding: .2em 1.4em .2em .6em; line-height: normal; } .k-task-actions, .k-task-content > .k-link { position: absolute; top: 0; right: 4px; white-space: nowrap; } .k-task-actions { z-index: 1; } .k-task-actions:first-child { position: static; float: left; margin: 4px 2px 0 4px; } .k-webkit .k-task-actions:first-child { margin-top: 3px; } .k-task-actions:first-child > .k-link { display: inline-block; } .k-task-delete { display: none; } .k-task-wrap:hover .k-task-delete, .k-task-wrap-active .k-task-delete { display: inline-block; } .k-task-single .k-resize-handle { position: absolute; visibility: hidden; z-index: 2; height: auto; } .k-task-single:hover .k-resize-handle, .k-task-wrap-active .k-resize-handle { visibility: visible; } .k-task-single .k-resize-handle:after { content: ""; position: absolute; filter: alpha(opacity=50); opacity: .5; } .k-task-content > .k-resize-e { right: 0; top: 0; bottom: 0; width: .4em; } .k-task-content > .k-resize-w { left: 0; top: 0; bottom: 0; width: .4em; } .k-task-content > .k-resize-e:after, .k-task-content > .k-resize-w:after { left: 1px; top: 50%; margin-top: -0.7em; height: 1.4em; width: 1px; } .k-task-content > .k-resize-e:after { left: auto; right: 1px; } .k-task-draghandle { position: absolute; bottom: 0; width: 0; height: 0; margin-left: 16px; border-width: 5px; border-style: solid; border-top-color: transparent; border-left-color: transparent; border-right-color: transparent; display: none; cursor: e-resize; } .k-task-wrap:hover .k-task-draghandle, .k-task-wrap-active .k-task-draghandle { display: block; } .k-dependency-hint { z-index: 4; } /*Task Hover Tooltip*/ .k-task-details { padding: .4em; text-align: left; white-space: nowrap; } .k-task-details > strong { font-size: 120%; display: block; } .k-task-pct { margin: .5em 0 .1em; font-size: 170%; } .k-task-details > ul { line-height: 1.2; } /*Resources*/ .k-resources-wrap { position: absolute; z-index: 2; zoom: 1; margin-left: 20px; margin-top: -2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .k-resources-wrap .k-resource { margin: 0px 5px; } /* Gantt Edit form */ .k-gantt-edit-form > .k-edit-form-container { width: 430px; } .k-gantt-edit-form > .k-resources-form-container { width: 506px; } .k-resources-form-container > .k-grid { margin: 0 .9em; } .k-gantt-edit-form > .k-edit-form-container .k-textbox, .k-gantt-edit-form > .k-edit-form-container .k-numerictextbox { width: 15em; } .k-gantt-edit-form .k-edit-buttons .k-gantt-delete { float: left; } /* Gantt Chart end */ /* Pivot start */ .k-pivot-toolbar { padding: .2em; border-bottom-width: 1px; border-bottom-style: solid; } .k-pivot .k-pivot-toolbar { padding: .6em; } .k-pivot-toolbar .k-button { margin-right: .4em; line-height: 1.2em; font-size: .9em; text-align: left; position: relative; padding: .3em 5em .3em .3em; } .k-field-actions { position: absolute; right: 2px; top: 3px; } /*IE7 requires the following style to be applied to cells directly*/ .k-pivot .k-grid td { white-space: nowrap; } .k-pivot-layout { border-spacing: 0; table-layout: auto; } .k-pivot-layout > tbody > tr > td { vertical-align: top; padding: 0; } .k-pivot td { vertical-align: top; } .k-pivot-rowheaders > .k-grid, .k-pivot-table > .k-grid { border-width: 0; } .k-pivot-rowheaders > .k-grid td:first-child, .k-pivot-table .k-grid-header .k-header.k-first { border-left-width: 1px; } .k-pivot-rowheaders > .k-grid td.k-first { border-left-width: 0; } .k-pivot-rowheaders > .k-grid { overflow: hidden; } .k-pivot-table { border-left-width: 1px; border-left-style: solid; } .k-pivot-table .k-grid-header-wrap > table { height: 100%; } .k-pivot .k-grid-header .k-header { vertical-align: top; } .k-header.k-alt, td.k-alt { font-weight: bold; } .k-header.k-alt { background-image: none; } .k-pivot-layout .k-grid td { border-bottom-width: 1px; } .k-pivot-layout .k-grid-footer > td { border-top-width: 0; } .k-pivot-filter-window .k-treeview { max-height: 600px; } /* selector */ .k-fieldselector .k-edit-buttons { bottom: auto; } .k-fieldselector .k-edit-label { width: 16%; } .k-fieldselector .k-edit-field { width: 77%; } .k-fieldselector .k-edit-field > .k-widget, .k-fieldselector .k-edit-field > .k-textbox { width: 99%; } .k-fieldselector .k-edit-buttons > input, .k-fieldselector .k-edit-buttons > label { float: left; margin-top: .4em; } .k-fieldselector p { margin: 0 0 .2em .5em; text-transform: uppercase; } .k-fieldselector p .k-icon { margin: 0 5px 0 0; } .k-fieldselector .k-columns { border-style: solid; border-width: 0; } .k-fieldselector .k-columns > div { overflow: auto; padding: .6em; border-style: solid; border-width: 0 0 0 1px; float: left; width: 45%; } .k-fieldselector .k-columns > div:first-child { border-width: 0; margin-right: -1px; } .k-fieldselector .k-columns > div + div { float: right; border-width: 0; } .k-fieldselector div.k-treeview { border-width: 0; margin-right: -1px; padding-left: 4px; overflow: visible; } .k-fieldselector .k-list-container { margin-left: .5em; margin-bottom: 1em; padding: .2em 0 0; border-style: solid; border-width: 1px; } .k-fieldselector .k-list { padding-bottom: 2em; } .k-fieldselector .k-list li.k-item { padding: .3em 3.3em .3em .3em; margin: 0 .2em.2em; position: relative; font-size: .9em; line-height: 1.2em; min-height: 1em; } /* KPI icons */ .k-i-kpi-decrease { background-position: 0 0; } .k-i-kpi-denied { background-position: -16px 0; } .k-i-kpi-equal { background-position: -32px 0; } .k-i-kpi-hold { background-position: -48px 0; } .k-i-kpi-increase { background-position: -64px 0; } .k-i-kpi-open { background-position: -80px 0; } /* Pivot end */ /* Calendar */ .k-calendar { position: relative; display: inline-block; width: 16.917em; overflow: hidden; } .k-calendar td, .k-calendar .k-link { text-decoration: none; } .k-calendar .k-action-link { text-decoration: underline; } .k-calendar .k-header, .k-calendar .k-footer { position: relative; text-align: center; zoom: 1; } .k-widget.k-calendar .k-nav-prev, .k-widget.k-calendar .k-nav-next { position: absolute; top: 0.16666em; line-height: 1.8333em; height: 1.8333em; } .k-widget.k-calendar .k-nav-prev { left: 1%; } .k-widget.k-calendar .k-nav-next { right: 1%; } .k-calendar .k-content { float: left; border-spacing: 0; width: 100%; height: 14.167em; border-width: 0; margin: 0; table-layout: fixed; outline: 0; } .k-calendar .k-content, .k-calendar .k-content th { text-align: right; } .k-calendar .k-animation-container .k-content { height: 100%; } .k-widget.k-calendar .k-nav-fast { display: inline-block; width: 75%; height: 1.8333em; line-height: 1.8333em; margin: 0.16666em -0.08333em 0.3333em 0; } .k-calendar .k-header .k-icon { vertical-align: middle; } .k-calendar .k-header .k-link.k-nav-prev, .k-calendar .k-header .k-link.k-nav-next { height: 1.8333em; width: 1.8333em; } .k-calendar th { border-bottom-style: solid; border-bottom-width: 1px; padding: .4em .45em .4em .1em; font-weight: normal; cursor: default; } .k-calendar td { padding: 0.08333em; cursor: pointer; } .k-calendar .k-state-focus { border-style: dotted; border-width: 0.08333em; padding: 0; } .k-calendar .k-content .k-link { display: block; overflow: hidden; min-height: 1.8333em; line-height: 1.8333em; padding: 0 .45em 0 .1em; } .k-calendar .k-meta-view .k-link { padding: .25em 0 .3em; text-align: center; } .k-calendar .k-footer { clear: both; } .k-calendar .k-footer .k-nav-today, .k-calendar .k-footer > .k-state-disabled { display: block; height: 100%; padding: .5em 0; } .k-calendar .k-nav-today:hover { text-decoration: underline; } /* TreeView */ div.k-treeview { /* due to k-widget */ border-width: 0; background: none; overflow: auto; white-space: nowrap; } .k-treeview .k-item { display: block; border-width: 0; margin: 0; padding: 0 0 0 16px; } .k-treeview > .k-group, .k-treeview .k-item > .k-group, .k-treeview .k-content { margin: 0; padding: 0; background: none; list-style-type: none; position: relative; } .k-treeview .k-icon, .k-treeview .k-image, .k-treeview .k-sprite, .k-treeview .k-checkbox, .k-treeview .k-in { display: inline-block; vertical-align: top; } .k-treeview .k-checkbox { margin-top: .2em; } .k-treeview .k-icon, .k-treeview .k-in { vertical-align: middle; } .k-treeview .k-request-retry { vertical-align: baseline; } .k-treeview .k-plus, .k-treeview .k-minus, .k-treeview .k-plus-disabled, .k-treeview .k-minus-disabled { margin-top: 0.25em; margin-left: -16px; cursor: pointer; } .k-treeview .k-plus-disabled, .k-treeview .k-minus-disabled { cursor: default; } .k-treeview .k-sprite, .k-treeview .k-image { margin-right: 3px; } .k-treeview .k-in { margin: 1px 0 1px 0.16666em; padding: 1px 0.3333em 1px 0.25em; line-height: 1.3333em; text-decoration: none; border-style: solid; border-width: 1px; } .k-treeview span.k-in { cursor: default; } .k-treeview .k-drop-hint { position: absolute; z-index: 10000; visibility: hidden; width: 80px; height: 5px; margin-top: -3px; background-color: transparent; background-repeat: no-repeat; } /* ComboBox & DropDownList */ span.k-datepicker, span.k-timepicker, span.k-datetimepicker, span.k-colorpicker, span.k-numerictextbox, span.k-combobox, span.k-dropdown, .k-toolbar .k-split-button { background-image: none; } .k-autocomplete, .k-combobox, .k-datepicker, .k-timepicker, .k-datetimepicker, .k-colorpicker, .k-numerictextbox, .k-dropdown, .k-selectbox, .k-textbox, .k-toolbar .k-split-button { position: relative; display: inline-block; width: 12.4em; overflow: visible; border-width: 0; vertical-align: middle; } .k-filter-menu .k-combobox, .k-filter-menu .k-datepicker, .k-filter-menu .k-timepicker, .k-filter-menu .k-datetimepicker, .k-filter-menu .k-numerictextbox, .k-filter-menu .k-dropdown, .k-filter-menu .k-textbox { width: 13.2em; } .k-autocomplete, .k-combobox, .k-datepicker, .k-timepicker, .k-datetimepicker, .k-colorpicker, .k-numerictextbox, .k-dropdown, .k-selectbox, .k-toolbar .k-split-button { white-space: nowrap; } .k-colorpicker, .k-toolbar .k-split-button { width: auto; } .k-datetimepicker { width: 15em; } .k-autocomplete, .k-picker-wrap, .k-numeric-wrap { position: relative; cursor: default; } .k-dropdown-wrap { position: relative; } .k-dropdown-wrap, .k-picker-wrap, .k-numeric-wrap { display: block; } .k-block, .k-widget, .k-grid, .k-slider, .k-splitter, .k-treeview, .k-panelbar, .k-content, .k-header-column-menu { outline: 0; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .k-block, .k-slider, .k-splitbar, .k-calendar, .k-treeview, .k-pager-wrap, .k-grid-header .k-link, .k-header-column-menu { -webkit-touch-callout: none; } .k-popup.k-list-container, .k-popup.k-calendar-container { -webkit-touch-callout: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 2px; border-width: 1px; border-style: solid; } .k-list-container.k-state-border-down, .k-autocomplete.k-state-border-down, .k-dropdown-wrap.k-state-border-down, .k-picker-wrap.k-state-border-down, .k-numeric-wrap.k-state-border-down { border-bottom-width: 0; padding-bottom: 1px; } .k-list-container .km-scroll-container { padding-bottom: 6px; } .k-textbox, .k-autocomplete, .k-dropdown-wrap, .k-picker-wrap, .k-numeric-wrap { border-width: 1px; border-style: solid; padding: 0 1.9em 0 0; } .k-numeric-wrap.k-expand-padding { padding-right: 0; } .k-textbox, .k-autocomplete { padding: 0; } .k-textbox.k-space-left { padding-left: 1.9em; } .k-textbox.k-space-right { padding-right: 1.9em; } .k-textbox .k-icon { top: 50%; margin: -8px 0 0; position: absolute; } .k-space-left .k-icon { left: 3px; } .k-space-right .k-icon { right: 3px; } .k-autocomplete, .k-dropdown-wrap.k-state-focused, .k-dropdown-wrap.k-state-hover, .k-picker-wrap.k-state-focused, .k-picker-wrap.k-state-hover, .k-numeric-wrap.k-state-focused, .k-numeric-wrap.k-state-hover { -webkit-transition: box-shadow .15s ease-out; -moz-transition: box-shadow .15s ease-out; -o-transition: box-shadow .15s ease-out; transition: box-shadow .15s ease-out; -webkit-transition: "box-shadow .15s ease-out"; -moz-transition: "box-shadow .15s ease-out"; -ms-transition: "box-shadow .15s ease-out"; -o-transition: "box-shadow .15s ease-out"; transition: "box-shadow .15s ease-out"; } .k-textbox > input, .k-picker-wrap .k-input, .k-numeric-wrap .k-input, .k-combobox .k-input { width: 100%; vertical-align: top; } .k-picker-wrap .k-input, .k-numeric-wrap .k-input, .k-dropdown-wrap .k-input, .k-selectbox .k-input { font-family: inherit; border-width: 0; outline: 0; } .k-dropdown .k-input, .k-selectbox .k-input { background: transparent; } .k-ie7 .k-picker-wrap .k-input, .k-ie7 .k-numeric-wrap .k-input, .k-ie7 .k-combobox .k-input { margin: -1px 0; } /* removes excessive spacing */ .k-picker-wrap .k-select, .k-numeric-wrap .k-select, .k-dropdown-wrap .k-select { position: absolute; /* icon positioning */ top: 0; right: 0; display: inline-block; vertical-align: top; text-decoration: none; } .k-combobox .k-select, .k-picker-wrap .k-select, .k-numeric-wrap .k-select { border-style: solid; border-width: 0 0 0 1px; border-color: inherit; /* skin-related, inherit does not work in ie7- */ } span.k-datetimepicker .k-select, span.k-datetimepicker .k-select + .k-select { right: 0; } .k-textbox > input, .k-autocomplete .k-input { display: block; } .k-combobox .k-icon { /*margin-top: 1px;*/ } .k-dropdown .k-select, .k-selectbox .k-select { overflow: hidden; border: 0; text-decoration: none; font: inherit; color: inherit; } .k-dropdown .k-input, .k-selectbox .k-input { display: block; overflow: hidden; text-overflow: ellipsis; } .k-textbox > input, .k-autocomplete .k-input, .k-picker-wrap .k-input, .k-numeric-wrap .k-input, .k-dropdown-wrap .k-input, .k-selectbox .k-input { height: 1.65em; line-height: 1.65em; padding: 0.177em 0; text-indent: 0.33em; border: 0; margin: 0; } /* fix missing bottom border on browser zoom in Chrome */ .k-webkit .k-combobox .k-dropdown-wrap:before, .k-webkit .k-picker-wrap:before, .k-webkit .k-numeric-wrap:before { content: "\a0"; display: inline-block; width: 0; height: 1.65em; padding-bottom: 0.4em; } /* above style breaks NumericTextBox layout due display:block style applied to the input */ .km.root .k-combobox .k-dropdown-wrap:before, .km.root .k-picker-wrap:before, .km.root .k-numeric-wrap:before { content: none; } .k-combobox .k-input, .k-picker-wrap .k-input, .k-numeric-wrap .k-input { display: inline; } .k-ie7 .k-autocomplete .k-input, .k-ie7 .k-picker-wrap .k-input, .k-ie7 .k-numeric-wrap .k-input, .k-ie7 .k-dropdown-wrap .k-input, .k-ie7 .k-selectbox .k-input { text-indent: 0; } .k-picker-wrap .k-select, .k-numeric-wrap .k-select, .k-dropdown-wrap .k-select { min-height: 1.65em; line-height: 2em; vertical-align: middle; -moz-box-sizing: border-box; text-align: center; width: 1.9em; height: 100%; } .k-numeric-wrap .k-select { padding: 0; } body .k-datetimepicker .k-select { border-radius: 0; } .k-ie7 .k-picker-wrap .k-icon, .k-ie7 .k-dropdown-wrap .k-icon { line-height: 2em; font-size: 1em; padding-top: 16px; height: 0; } .k-combobox .k-icon, .k-dropdown, .k-selectbox .k-icon { cursor: pointer; } .k-popup { border-style: solid; border-width: 1px; } .k-popup .k-item { cursor: default; } .k-popup .k-calendar { border: 0; } .k-list { height: 100%; } .k-popup .k-list .k-item, .k-fieldselector .k-list .k-item { padding: 1px 5px 1px 5px; line-height: 1.8em; min-height: 1.8em; } .k-overflow-container .k-item { padding: 1px; } .k-overflow-container > .k-state-disabled .k-button, .k-overflow-container .k-button.k-state-disabled, .k-overflow-container .k-button.k-state-disabled:hover { border: 0 ; background: none; } .k-popup .k-list .k-state-hover, .k-popup .k-list .k-state-focused, .k-popup .k-list .k-state-selected, .k-overflow-container .k-state-hover, .k-overflow-container .k-state-focused, .k-overflow-container .k-state-selected, .k-fieldselector .k-list .k-item { padding: 0 4px; border-width: 1px; border-style: solid; } .k-list-filter { position: relative; } .k-list-filter > .k-textbox { padding-right: 20px; width: 100%; } .k-list-filter > .k-icon { position: absolute; right: 4px; top: 3px; } /* MultiSelect */ .k-multiselect-wrap { position: relative; border-width: 0px; border-style: solid; border-radius: 4px; border-color: #C5C5C5; background-color: #FFF; min-height: 2.04em; } .k-multiselect-wrap .k-input { background-color: transparent; height: 1.31em; line-height: 1.31em; padding: 0.18em 0; text-indent: 0.33em; border: 0; margin: 1px 0 0; float: left; } .k-multiselect-wrap li { margin: 1px 0 1px 1px; padding: .1em .15em .1em .4em; line-height: 1.5em; float: left; } .k-autocomplete .k-loading, .k-multiselect .k-loading { position: absolute; right: 3px; bottom: 4px; } .k-multiselect .k-loading-hidden { visibility: hidden; } /* Date/Time Pickers */ .k-datetimepicker .k-picker-wrap { padding-right: 3.8em; } .k-datetimepicker .k-select { width: 3.8em; } .k-datetimepicker .k-picker-wrap .k-icon { margin: 0 2px; } .k-picker-wrap .k-icon { cursor: pointer; } .k-button, .k-textbox, .k-timepicker, .k-datepicker, .k-datetimepicker { display: inline-block; vertical-align: middle; } .k-picker-wrap .k-input { margin: 0; } .k-time-popup .k-item { padding: 1px 3px; } /* inputs */ .k-input { padding: 0.25em 0; } .k-input, .k-textbox > input { outline: 0; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .k-textbox { outline: 0; padding: 2px .3em; line-height: 1.6em; } input.k-textbox { height: 2.13em; text-indent: 0.33em; } .k-ie input.k-textbox { text-indent: 0.165em; } .k-ff input.k-textbox { height: 2.17em; } .k-ie7 input.k-textbox { line-height: 1.72em; height: 1.72em; text-indent: 0.33em; } textarea.k-textbox { height: auto; } .k-ie7 .k-textbox { padding: 1px 0; text-indent: 0; } /* NumericTextBox */ span.k-numerictextbox { background-color: transparent; } .k-numerictextbox .k-input { margin: 0; } .k-numerictextbox .k-link { display: block; height: 1em; line-height: 1em; vertical-align: middle; border-width: 0; padding: 0; } .k-numerictextbox .k-icon { height: 11px; } .k-numeric-wrap .k-input::-webkit-inner-spin-button { -webkit-appearance: none; } /* ColorPicker */ .k-colorpicker .k-picker-wrap { line-height: 2em; } .k-colorpicker .k-selected-color { vertical-align: top; line-height: 0; display: inline-block; height: 2em; width: 2em; } .k-colorpicker .k-tool-icon { position: relative; top: -2px; display: inline-block; padding: 3px 3px 2px; font-size: 0; line-height: 0; margin-right: 3px; margin-left: 2px; margin-bottom: 3px; background-repeat: no-repeat; vertical-align: middle; width: 16px; height: 16px; -ms-high-contrast-adjust: none; } .k-colorpicker .k-tool-icon .k-selected-color { display: block; height: 3px; width: 16px; position: absolute; left: 3px; bottom: -3px; border-radius: 0 !important; } .k-colorpicker .k-icon { cursor: pointer; } .k-disabled-overlay { position: absolute; left: 0; top: 0; width: 100%; height: 100%; background-color: #fff; opacity: 0.5; filter: alpha(opacity=50); } .k-colorpalette { position: relative; line-height: 0; border-width: 0; display: inline-block; } .k-colorpalette .k-palette { border-collapse: collapse; position: relative; width: 100%; height: 100%; } .k-colorpalette .k-item { width: 14px; height: 14px; overflow: hidden; -ms-high-contrast-adjust: none; } .k-colorpalette .k-item.k-state-selected { z-index: 100; background: transparent; box-shadow: 0 1px 4px #000, inset 0 0 3px #fff; position: relative; } .k-flatcolorpicker { position: relative; display: inline-block; width: 250px; padding-bottom: 5px; } div.k-flatcolorpicker { background-color: transparent; background-image: none; } .k-flatcolorpicker .k-selected-color { background-image: url("textures/transtexture.png"); background-position: 50% 50%; text-align: right; } .k-flatcolorpicker .k-selected-color input.k-color-value { font-family: Consolas, "Ubuntu Mono", "Lucida Console", "Courier New", monospace; padding: .75em .3em .65em 1em; border: 0; margin: 0; width: 70%; } .k-flatcolorpicker .k-hsv-rectangle { position: relative; -khtml-user-select: none; -webkit-user-select: none; -moz-user-select: -moz-none; -ms-user-select: none; user-select: none; -ms-touch-action: pinch-zoom double-tap-zoom; } .k-flatcolorpicker .k-hsv-rectangle .k-draghandle { cursor: pointer; position: absolute; z-index: 10; left: 50%; top: 50%; width: 8px; height: 8px; border: 1px solid #eee; margin-left: -5px; margin-top: -5px; border-radius: 6px; -webkit-box-shadow: 0 1px 2px #444444; box-shadow: 0 1px 2px #444444; background: transparent; } .k-flatcolorpicker .k-hsv-rectangle .k-draghandle:hover, .k-flatcolorpicker .k-hsv-rectangle .k-draghandle:focus { background: transparent; border-color: #fff; -webkit-box-shadow: 0 1px 5px #000000; box-shadow: 0 1px 5px #000000; } .k-flatcolorpicker .k-hsv-rectangle.k-dragging, .k-flatcolorpicker .k-hsv-rectangle.k-dragging * { cursor: none; } .k-flatcolorpicker .k-slider-horizontal { height: 20px; width: 90%; margin: 0 5%; } .k-flatcolorpicker .k-slider-horizontal .k-slider-track { -webkit-box-shadow: 0 1px 0 #fff, 0 -1px 0 #999; box-shadow: 0 1px 0 #fff, 0 -1px 0 #999; } .k-flatcolorpicker .k-hue-slider, .k-flatcolorpicker .k-transparency-slider { display: block; } .k-flatcolorpicker .k-hue-slider .k-slider-selection, .k-flatcolorpicker .k-transparency-slider .k-slider-selection { background: transparent; } .k-flatcolorpicker .k-hue-slider .k-draghandle, .k-flatcolorpicker .k-transparency-slider .k-draghandle { background: transparent; border: 3px solid #eee; margin-top: 1px; height: 8px; width: 8px; -webkit-box-shadow: 0 1px 4px #444444; box-shadow: 0 1px 4px #444444; } .k-flatcolorpicker .k-hue-slider .k-draghandle:hover, .k-flatcolorpicker .k-transparency-slider .k-draghandle:hover, .k-flatcolorpicker .k-hue-slider .k-draghandle:focus, .k-flatcolorpicker .k-transparency-slider .k-draghandle:focus { background: transparent; border-color: #fff; -webkit-box-shadow: 0 1px 5px #000000; box-shadow: 0 1px 5px #000000; border-width: 2px; padding: 1px; } .k-flatcolorpicker .k-hue-slider .k-slider-track { background: -moz-linear-gradient(left, #ff0000 0%, #ffff00 16%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 84%, #ff0004 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, right top, color-stop(0%, #ff0000), color-stop(16%, #ffff00), color-stop(33%, #00ff00), color-stop(50%, #00ffff), color-stop(67%, #0000ff), color-stop(84%, #ff00ff), color-stop(100%, #ff0004)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(left, #ff0000 0%, #ffff00 16%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 84%, #ff0004 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(left, #ff0000 0%, #ffff00 16%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 84%, #ff0004 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(left, #ff0000 0%, #ffff00 16%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 84%, #ff0004 100%); /* IE10+ */ background: -left-linear-gradient(left,#ff0000 0%,#ffff00 16%,#00ff00 33%,#00ffff 50%,#0000ff 67%,#ff00ff 84%,#ff0004 100%); /* W3C */ } .k-flatcolorpicker .k-transparency-slider .k-slider-track { background-image: url("textures/transparency.png"); background-size: 100% auto; background-position: 100% 50%; background-repeat: no-repeat; } .k-flatcolorpicker .k-controls { margin-top: 10px; margin-bottom: 5px; text-align: center; font-size: 90%; } .k-flatcolorpicker .k-controls .k-button { width: 6em; } .k-flatcolorpicker .k-hsv-gradient { background: -moz-linear-gradient(top, rgba(0, 0, 0, 0) 0%, #000000 100%), /* FF3.6+ */ -moz-linear-gradient(left, #ffffff 0%, rgba(255, 255, 255, 0) 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, #000000)), /* Chrome,Safari4+ */ -webkit-gradient(linear, left top, right top, color-stop(0%, #ffffff), color-stop(100%, rgba(255, 255, 255, 0))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0) 0%, #000000 100%), /* Chrome10+,Safari5.1+ */ -webkit-linear-gradient(left, #ffffff 0%, rgba(255, 255, 255, 0) 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, rgba(0, 0, 0, 0) 0%, #000000 100%), /* Opera 11.10+ */ -o-linear-gradient(left, #ffffff 0%, rgba(255, 255, 255, 0) 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, rgba(0, 0, 0, 0) 0%, #000000 100%), /* IE10+ */ -ms-linear-gradient(left, #ffffff 0%, rgba(255, 255, 255, 0) 100%); /* IE10+ */ background: -top-linear-gradient(top,rgba(0,0,0,0) 0%,#000000 100%), /* W3C */ -left-linear-gradient(left,#ffffff 0%,rgba(255,255,255,0) 100%); /* W3C */ height: 180px; margin-bottom: 5px; } .k-ie9 .k-flatcolorpicker .k-hue-slider .k-slider-track { background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmMDAwMCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjE2JSIgc3RvcC1jb2xvcj0iI2ZmZmYwMCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjMzJSIgc3RvcC1jb2xvcj0iIzAwZmYwMCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzAwZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjY3JSIgc3RvcC1jb2xvcj0iIzAwMDBmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ijg0JSIgc3RvcC1jb2xvcj0iI2ZmMDBmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZjAwMDQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); } .k-ie9 .k-flatcolorpicker .k-hsv-gradient { background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); } .k-ie7 .k-flatcolorpicker .k-hue-slider .k-slider-track, .k-ie8 .k-flatcolorpicker .k-hue-slider .k-slider-track { background: url("textures/hue.png") repeat 0 50%; } .k-ie7 .k-flatcolorpicker .k-transparency-slider .k-slider-track, .k-ie8 .k-flatcolorpicker .k-transparency-slider .k-slider-track { background: url("textures/transparency.png") repeat 0 50%; } .k-ie7 .k-flatcolorpicker .k-hsv-gradient, .k-ie8 .k-flatcolorpicker .k-hsv-gradient { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#00ffffff',GradientType=1) progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#ff000000',GradientType=0); } /* Editor */ table.k-editor { width: 100%; height: 250px; table-layout: fixed; border-style: solid; border-width: 1px; border-collapse: separate; border-spacing: 4px; font-size: 100%; vertical-align: top; } .k-editor-inline { border-width: 2px; padding: .3em .5em; word-wrap: break-word; } .k-editortoolbar-dragHandle { cursor: move; padding-left: 0; padding-right: 3px; box-shadow: none !important; } .k-editor .k-editor-toolbar-wrap { border: 0; padding: 0; } .k-editor-toolbar { margin: 0; padding: .1em 0; list-style-type: none; line-height: 1.3em; cursor: default; } .k-editor-toolbar li { display: inline-block; vertical-align: middle; } .k-ie7 .k-editor-toolbar li { display: inline; /* mandatory for IE7. Floats and the inline-block hack break it */ } .k-webkit .k-editor-toolbar, .k-ff .k-editor-toolbar, .k-ie9 .k-editor-toolbar { padding: 0; } .k-webkit .k-editor-toolbar li, .k-safari .k-editor-toolbar li, .k-ff .k-editor-toolbar li, .k-ie9 .k-editor-toolbar li, .k-ie10 .k-editor-toolbar li { display: inline-block; padding: .1em 0; } .k-editor-toolbar .k-editor-widget, .k-editor-toolbar > li { margin-right: 6px; } .k-group-start.k-group-end .k-editor-widget { margin-right: 0; } .k-editor-toolbar .k-editor-dropdown { position: relative; } .k-select-overlay { -webkit-appearance: none; opacity: 0; z-index: 11000; top: 0; left: 0; position: absolute; height: 26px; width: 100%; margin: -4px 0 0; } .k-editor-toolbar .k-separator { position: relative; top: 1px; border-style: solid; border-width: 0 1px 0 0; margin: 0 .3em 0 .1em; padding: 0 0 0 1px; font-size: 1.3em; } .k-editor-toolbar .k-break { display: block; height: 1px; font-size: 0; line-height: 0; } .k-editor-toolbar .k-dropdown, .k-editor-toolbar .k-combobox, .k-editor-toolbar .k-selectbox, .k-editor-toolbar .k-colorpicker { vertical-align: middle; } .k-button-group { white-space: nowrap; } .k-button-group .k-tool { display: inline-block; vertical-align: middle; margin: 1px 0; width: 2em; height: 2em; line-height: 2em; } .k-button-group .k-tool-icon { width: 24px; height: 24px; vertical-align: middle; -ms-high-contrast-adjust: none; } .k-i-move { background-position: -160px -288px; } .k-bold { background-position: -240px 0; } .k-state-hover .k-bold, .k-state-selected .k-bold { background-position: -264px 0; } .k-italic { background-position: -240px -24px; } .k-state-hover .k-italic, .k-state-selected .k-italic { background-position: -264px -24px; } .k-underline { background-position: -240px -48px; } .k-state-hover .k-underline, .k-state-selected .k-underline { background-position: -264px -48px; } .k-strikethrough { background-position: -240px -72px; } .k-state-hover .k-strikethrough, .k-state-selected .k-strikethrough { background-position: -264px -72px; } .k-foreColor { background-position: -240px -96px; } .k-state-hover .k-foreColor, .k-state-selected .k-foreColor { background-position: -264px -96px; } .k-backColor { background-position: -240px -120px; } .k-state-hover .k-backColor, .k-state-selected .k-backColor { background-position: -264px -120px; } .k-colorpicker .k-foreColor { background-position: -240px -96px; } .k-colorpicker .k-backColor { background-position: -240px -120px; } .k-justifyLeft { background-position: -240px -144px; } .k-state-hover .k-justifyLeft, .k-state-selected .k-justifyLeft { background-position: -264px -144px; } .k-justifyCenter { background-position: -240px -168px; } .k-state-hover .k-justifyCenter, .k-state-selected .k-justifyCenter { background-position: -264px -168px; } .k-justifyRight { background-position: -240px -192px; } .k-state-hover .k-justifyRight, .k-state-selected .k-justifyRight { background-position: -264px -192px; } .k-justifyFull { background-position: -240px -216px; } .k-state-hover .k-justifyFull, .k-state-selected .k-justifyFull { background-position: -264px -216px; } .k-insertUnorderedList { background-position: -240px -264px; } .k-state-hover .k-insertUnorderedList, .k-state-selected .k-insertUnorderedList { background-position: -264px -264px; } .k-insertOrderedList { background-position: -240px -288px; } .k-state-hover .k-insertOrderedList, .k-state-selected .k-insertOrderedList { background-position: -264px -288px; } .k-indent, .k-rtl .k-outdent { background-position: -288px 0; } .k-state-hover .k-indent, .k-state-hover .k-rtl .k-outdent, .k-state-selected .k-indent, .k-state-selected .k-rtl .k-outdent { background-position: -312px 0; } .k-outdent, .k-rtl .k-indent { background-position: -288px -24px; } .k-state-hover .k-outdent, .k-state-hover .k-rtl .k-indent, .k-state-selected .k-outdent, .k-state-selected .k-rtl .k-indent { background-position: -312px -24px; } .k-createLink { background-position: -288px -48px; } .k-state-hover .k-createLink, .k-state-selected .k-createLink { background-position: -312px -48px; } .k-unlink { background-position: -288px -72px; } .k-state-hover .k-unlink, .k-state-selected .k-unlink { background-position: -312px -72px; } .k-insertImage { background-position: -288px -96px; } .k-state-hover .k-insertImage, .k-state-selected .k-insertImage { background-position: -312px -96px; } .k-insertFile { background-position: -288px -216px; } .k-state-hover .k-insertFile, .k-state-selected .k-insertFile { background-position: -312px -216px; } .k-subscript { background-position: -288px -144px; } .k-state-hover .k-subscript, .k-state-selected .k-subscript { background-position: -312px -144px; } .k-superscript { background-position: -288px -168px; } .k-state-hover .k-superscript, .k-state-selected .k-superscript { background-position: -312px -168px; } .k-cleanFormatting { background-position: -288px -192px; } .k-state-hover .k-cleanFormatting, .k-state-selected .k-cleanFormatting { background-position: -312px -192px; } .k-createTable { background-position: -192px 0; } .k-state-hover .k-createTable, .k-state-selected .k-createTable { background-position: -216px 0; } .k-addColumnLeft { background-position: -192px -24px; } .k-state-hover .k-addColumnLeft, .k-state-selected .k-addColumnLeft { background-position: -216px -24px; } .k-addColumnRight { background-position: -192px -48px; } .k-state-hover .k-addColumnRight, .k-state-selected .k-addColumnRight { background-position: -216px -48px; } .k-addRowAbove { background-position: -192px -72px; } .k-state-hover .k-addRowAbove, .k-state-selected .k-addRowAbove { background-position: -216px -72px; } .k-addRowBelow { background-position: -192px -96px; } .k-state-hover .k-addRowBelow, .k-state-selected .k-addRowBelow { background-position: -216px -96px; } .k-deleteRow { background-position: -192px -120px; } .k-state-hover .k-deleteRow, .k-state-selected .k-deleteRow { background-position: -216px -120px; } .k-deleteColumn { background-position: -192px -144px; } .k-state-hover .k-deleteColumn, .k-state-selected .k-deleteColumn { background-position: -216px -144px; } .k-mergeCells { background-position: -192px -168px; } .k-state-hover .k-mergeCells, .k-state-selected .k-mergeCells { background-position: -216px -168px; } /* default tool widths */ .k-fontName { width: 110px; } .k-fontSize { width: 124px; } .k-formatBlock { width: 147px; } .k-editortoolbar-dragHandle { float: left; margin: 1px 0 0; } .k-editor-toolbar .k-button-group { padding: 1px; } .k-editor .k-editor-toolbar .k-row-break { display: block; height: 0; font-size: 0; line-height: 0; } .k-button-group .k-tool { border-style: solid; border-width: 1px; margin-right: -1px; } .k-button-group .k-tool.k-state-hover, .k-button-group .k-tool:focus { position: relative; z-index: 1; } .k-rtl .k-button-group .k-tool { border-style: solid; border-width: 1px; } .k-button-group .k-tool.k-group-end { border-right-width: 1px; } .k-rtl .k-button-group .k-tool.k-group-end { border-left-width: 1px; } .k-button-group .k-state-disabled { display: none; } .k-button-group .k-state-hover, .k-button-group .k-state-active { vertical-align: middle; } .k-button-group .k-state-disabled { filter: alpha(opacity=30); opacity: .3; } .k-editor .k-editable-area { width: 100%; height: 100%; border-style: solid; border-width: 1px; outline: 0; } .k-editor .k-content { display: block; width: 100%; height: 100%; border: 0; margin: 0; padding: 0; background: #fff; } .k-editor .k-tool { outline: 0; } .k-editor iframe.k-content { display: inline; vertical-align: top; /*fixes missing top border caused by the inline display*/ } .k-editor .k-raw-content { border: 0; margin: 0; padding: 0; } .k-editor .k-raw-content, .k-editor-dialog .k-editor-textarea { font-size: inherit; font-family: consolas, "courier new", monospace; } .k-editor-dialog { padding: 1em; width: 400px; } .k-editor-dialog .k-edit-label { width: 25%; } .k-editor-dialog .k-edit-field { width: 66%; } .k-editor-dialog .k-edit-field .k-textbox { width: 96%; } .k-viewhtml-dialog { width: auto; } .k-filebrowser-dialog { width: auto; min-width: 350px; } .k-filebrowser-dialog .k-filebrowser { margin: 0 1em 0; } .k-filebrowser-dialog .k-edit-label { width: 18%; } .k-filebrowser-dialog .k-edit-field { width: 75%; } .k-filebrowser-dialog .k-edit-field .k-textbox { width: 70%; } #k-editor-image-width, #k-editor-image-height { width: 5em; } .k-editor-dialog .k-button { display: inline-block; } .k-editor-dialog .k-editor-textarea { width: 600px; height: 350px; padding: .2em .2em .2em .4em; border-width: 1px; border-style: solid; overflow: auto; } .k-button-wrapper .k-link:hover { text-decoration: underline; } .k-ct-popup { width: 180.39999999999998px; padding: .65em .5em .5em; } .k-ct-popup .k-status { margin: .3em 0; } .k-ct-cell { border-width: 1px; border-style: solid; width: 18px; height: 18px; margin: 1px; vertical-align: top; display: inline-block; overflow: hidden; -ms-high-contrast-adjust: none; } /* Notification */ .k-notification-wrap { padding: .6em .5em; cursor: default; position: relative; white-space: nowrap; } .k-notification-button .k-notification-wrap { padding-right: 20px; } .k-notification-wrap > .k-i-note { vertical-align: text-bottom; margin-right: 4px; } .k-notification-wrap > .k-i-close { position: absolute; top: 7px; right: 4px; display: none; } .k-notification-button .k-notification-wrap > .k-i-close { display: block; } /* Progressbar */ .k-progressbar { display: inline-block; position: relative; vertical-align: middle; } .k-progressbar { border-radius: 4px; } .k-progressbar-horizontal { width: 27em; height: 1.9em; } .k-progressbar-vertical { width: 1.9em; height: 27em; } .k-progressbar > .k-state-selected { position: absolute; border-style: solid; border-width: 1px; overflow: hidden; } .k-progressbar-horizontal > .k-state-selected, .k-rtl .k-progressbar-horizontal.k-progressbar-reverse > .k-state-selected { left: -1px; right: auto; top: -1px; height: 100%; border-radius: 4px 0 0 4px; } .k-progressbar-horizontal.k-progressbar-reverse > .k-state-selected, .k-rtl .k-progressbar-horizontal > .k-state-selected { left: auto; right: -1px; border-radius: 0 4px 4px 0; } .k-progressbar-vertical > .k-state-selected { left: -1px; bottom: -1px; width: 100%; border-radius: 0 0 4px 4px; } .k-progressbar-vertical.k-progressbar-reverse > .k-state-selected { bottom: auto; top: -1px; border-radius: 4px 4px 0 0; } .k-progressbar > .k-state-selected.k-complete, .k-rtl .k-progressbar > .k-state-selected.k-complete { border-radius: 4px; } .k-progressbar > .k-reset { list-style: none; margin: 0; padding: 0; position: absolute; left: -1px; top: -1px; width: 100%; height: 100%; border-radius: 4px; white-space: nowrap; } .k-progressbar-horizontal .k-item { display: inline-block; height: 100%; border-style: solid; margin-left: -1px; } .k-progressbar-horizontal .k-item.k-first { margin-left: 0; } .k-progressbar-horizontal .k-item.k-last { border-right-width: 0; } .k-progressbar-horizontal .k-item, .k-rtl .k-progressbar-horizontal.k-progressbar-reverse .k-item { border-width: 1px 1px 1px 0; } .k-progressbar-horizontal.k-progressbar-reverse .k-item, .k-rtl .k-progressbar-horizontal .k-item { border-width: 1px 0 1px 1px; } .k-progressbar-horizontal .k-first, .k-rtl .k-progressbar-horizontal .k-last, .k-rtl .k-progressbar-horizontal.k-progressbar-reverse .k-last { border-radius: 4px 0 0 4px; border-left-width: 1px; } .k-progressbar-horizontal .k-last, .k-rtl .k-progressbar-horizontal .k-first { border-radius: 0 4px 4px 0; } .k-progressbar-horizontal.k-progressbar-reverse .k-last, .k-rtl .k-progressbar-horizontal .k-first { border-right-width: 1px; } .k-progressbar-vertical .k-item { width: 100%; border-style: solid; border-width: 1px 1px 0 1px; margin-top: -1px; } .k-progressbar-vertical .k-item.k-first { margin-top: 0; } .k-progressbar-vertical li.k-item.k-last { border-bottom-width: 0; } .k-progressbar-vertical .k-first { border-radius: 4px 4px 0 0; } .k-progressbar-vertical .k-last { border-radius: 0 0 4px 4px; border-bottom-width: 1px; } .k-progressbar-vertical.k-progressbar-reverse .k-item { border-width: 0 1px 1px 1px; } .k-progressbar-vertical.k-progressbar-reverse .k-first { border-top-width: 1px; } .k-progress-status-wrap { position: absolute; top: -1px; border: 1px solid transparent; line-height: 2em; width: 100%; height: 100%; } .k-progress-status-wrap, .k-rtl .k-progressbar-horizontal.k-progressbar-reverse .k-progress-status-wrap { left: -1px; right: auto; text-align: right; } .k-progressbar-horizontal.k-progressbar-reverse .k-progress-status-wrap, .k-rtl .k-progressbar-horizontal .k-progress-status-wrap { left: auto; right: -1px; text-align: left; } .k-progressbar-vertical .k-progress-status-wrap { top: auto; bottom: -1px; } .k-progressbar-vertical.k-progressbar-reverse .k-progress-status-wrap { bottom: auto; top: -1px; } .k-progress-status { display: inline-block; padding: 0 .5em; min-width: 10px; white-space: nowrap; } .k-progressbar-vertical.k-progressbar-reverse .k-progress-status { position: absolute; bottom: 0; left: 0; } .k-progressbar-vertical .k-progress-status { -webkit-transform: rotate(-90deg) translateX(-100%); -moz-transform: rotate(-90deg) translateX(-100%); -ms-transform: rotate(-90deg) translateX(-100%); -o-transform: rotate(-90deg) translateX(-100%); transform: rotate(-90deg) translateX(-100%); -webkit-transform-origin: 0 0; -moz-transform-origin: 0 0; -ms-transform-origin: 0 0; -o-transform-origin: 0 0; transform-origin: 0 0; } .k-progressbar-vertical.k-progressbar-reverse .k-progress-status { -webkit-transform: rotate(90deg) translateX(-100%); -moz-transform: rotate(90deg) translateX(-100%); -ms-transform: rotate(90deg) translateX(-100%); -o-transform: rotate(90deg) translateX(-100%); transform: rotate(90deg) translateX(-100%); -webkit-transform-origin: 0 100%; -moz-transform-origin: 0 100%; -ms-transform-origin: 0 100%; -o-transform-origin: 0 100%; transform-origin: 0 100%; } .k-ie7 .k-progressbar-vertical .k-progress-status { writing-mode: tb-rl; padding: .5em 0; } .k-ie8 .k-progressbar-vertical .k-progress-status { writing-mode: bt-lr; padding: .5em 0; } /* Slider */ div.k-slider { position: relative; border-width: 0; background-color: transparent; -khtml-user-select: none; -webkit-user-select: none; -moz-user-select: -moz-none; -ms-user-select: none; user-select: none; } .k-slider-vertical { width: 26px; height: 200px; /* default height */ } .k-slider-horizontal { display: inline-block; width: 200px; /* default width */ height: 26px; } .k-slider-wrap { width: 100%; height: 100%; } .k-slider .k-button, .k-grid .k-slider .k-button { position: absolute; top: 0; width: 24px; min-width: 0; height: 24px; margin: 0; padding: 0; outline: 0; } .k-slider .k-button .k-icon { margin-top: 3px; vertical-align: top; } .k-state-disabled .k-slider-wrap { filter: alpha(opacity=60); opacity: .6; } .k-state-disabled .k-slider-wrap .k-slider-items { color: #333; } .k-slider .k-button-decrease { left: 0; } .k-slider-vertical .k-button-decrease, .k-grid .k-slider-vertical .k-button-decrease { top: auto; bottom: 0; } .k-slider .k-button-increase { right: 0; } .k-slider .k-icon, .k-slider-track, .k-slider .k-tick { cursor: pointer; } .k-ie7 .k-slider .k-icon { margin-top: 2px; } .k-slider-track, .k-slider-selection { position: absolute; margin: 0; padding: 0; } .k-slider-horizontal .k-slider-track, .k-slider-horizontal .k-slider-selection { top: 50%; left: 0; height: 8px; margin-top: -4px; background-repeat: repeat-x; } .k-slider-horizontal .k-slider-buttons .k-slider-track { left: 34px; } .k-slider-vertical .k-slider-track, .k-slider-vertical .k-slider-selection { left: 50%; bottom: 0; width: 8px; margin-left: -4px; background-repeat: repeat-y; } .k-slider-vertical .k-slider-buttons .k-slider-track { bottom: 34px; } .k-draghandle { position: absolute; background-repeat: no-repeat; background-color: transparent; text-indent: -3333px; overflow: hidden; text-decoration: none; text-align: center; outline: 0; } .k-slider-horizontal .k-draghandle { top: -4px; width: 13px; height: 14px; } .k-slider-vertical .k-draghandle { left: -4px; width: 14px; height: 13px; } .k-slider-buttons .k-slider-items { margin-left: 34px; } .k-slider-horizontal .k-slider-items { height: 100%; } .k-slider-vertical .k-slider-items { padding-top: 1px; } .k-slider-vertical .k-slider-buttons .k-slider-items { padding-top: 0; } .k-slider-vertical .k-slider-buttons .k-slider-items { margin: 0; padding-top: 35px; } .k-slider .k-tick { position: relative; margin: 0; padding: 0; background-color: transparent; background-repeat: no-repeat; background-position: center center; } .k-slider-horizontal .k-tick { float: left; height: 100%; text-align: center; } /* fixes ticks position and removes spacing between them in IE7 */ .k-ie7 .k-slider-vertical .k-tick { float: left; clear: left; width: 100%; } .k-slider-horizontal .k-tick { background-position: center -92px; } .k-slider-horizontal .k-slider-topleft .k-tick { background-position: center -122px; } .k-slider-horizontal .k-slider-bottomright .k-tick { background-position: center -152px; } .k-slider-horizontal .k-tick-large { background-position: center -2px; } .k-slider-horizontal .k-slider-topleft .k-tick-large { background-position: center -32px; } .k-slider-horizontal .k-slider-bottomright .k-tick-large { background-position: center -62px; } .k-slider-vertical .k-tick { background-position: -92px center; } .k-slider-vertical .k-slider-topleft .k-tick { background-position: -122px center; } .k-slider-vertical .k-slider-bottomright .k-tick { background-position: -152px center; } .k-slider-vertical .k-tick-large { background-position: -2px center; } .k-slider-vertical .k-slider-topleft .k-tick-large { background-position: -32px center; } .k-slider-vertical .k-slider-bottomright .k-tick-large { background-position: -62px center; } .k-slider-horizontal .k-first { background-position: 0 -92px; } .k-slider-horizontal .k-tick-large.k-first { background-position: 0 -2px; } .k-slider-horizontal .k-slider-topleft .k-first { background-position: 0 -122px; } .k-slider-horizontal .k-slider-topleft .k-tick-large.k-first { background-position: 0 -32px; } .k-slider-horizontal .k-slider-bottomright .k-first { background-position: 0 -152px; } .k-slider-horizontal .k-slider-bottomright .k-tick-large.k-first { background-position: 0 -62px; } .k-slider-horizontal .k-last { background-position: 100% -92px; } .k-slider-horizontal .k-tick-large.k-last { background-position: 100% -2px; } .k-slider-horizontal .k-slider-topleft .k-last { background-position: 100% -122px; } .k-slider-horizontal .k-slider-topleft .k-tick-large.k-last { background-position: 100% -32px; } .k-slider-horizontal .k-slider-bottomright .k-last { background-position: 100% -152px; } .k-slider-horizontal .k-slider-bottomright .k-tick-large.k-last { background-position: 100% -62px; } .k-slider-vertical .k-first { background-position: -92px 100%; } .k-slider-vertical .k-tick-large.k-first { background-position: -2px 100%; } .k-slider-vertical .k-slider-topleft .k-first { background-position: -122px 100%; } .k-slider-vertical .k-slider-topleft .k-tick-large.k-first { background-position: -32px 100%; } .k-slider-vertical .k-slider-bottomright .k-first { background-position: -152px 100%; } .k-slider-vertical .k-slider-bottomright .k-tick-large.k-first { background-position: -62px 100%; } .k-slider-vertical .k-last { background-position: -92px 0; } .k-slider-vertical .k-tick-large.k-last { background-position: -2px 0; } .k-slider-vertical .k-slider-topleft .k-last { background-position: -122px 0; } .k-slider-vertical .k-slider-topleft .k-tick-large.k-last { background-position: -32px 0; } .k-slider-vertical .k-slider-bottomright .k-last { background-position: -152px 0; } .k-slider-vertical .k-slider-bottomright .k-tick-large.k-last { background-position: -62px 0; } .k-slider-vertical .k-tick { text-align: right; } .k-slider-vertical .k-slider-topleft .k-tick { text-align: left; } .k-slider .k-label { position: absolute; white-space: nowrap; font-size: .92em; } .k-slider-horizontal .k-label { left: 0; width: 100%; line-height: 1; } .k-slider-horizontal .k-first .k-label { left: -50%; } .k-slider-horizontal .k-last .k-label { left: auto; right: -50%; } .k-slider-horizontal .k-label { bottom: -1.2em; } .k-slider-horizontal .k-slider-topleft .k-label { top: -1.2em; } .k-slider-vertical .k-label { left: 120%; display: block; text-align: left; } .k-slider-vertical .k-last .k-label { top: -0.5em; } .k-slider-vertical .k-first .k-label { bottom: -0.5em; } .k-slider-vertical .k-slider-topleft .k-label { left: auto; right: 120%; } .k-slider-tooltip { top: -4444px; /*prevent window resize in IE8 when appending*/ } /* Scheduler */ .k-scheduler-toolbar, .k-scheduler-footer { border-style: solid; } .k-scheduler-toolbar, .k-scheduler-footer { line-height: 28px; padding: 6px; } .k-scheduler-toolbar { border-width: 0 0 1px; } .k-edit-field.k-scheduler-toolbar { border-width: 0; padding-top: 0; padding-left: 0; padding-right: 0; } .k-scheduler-header { text-align: center; } .k-scheduler-footer { border-width: 1px 0 0; } .k-scheduler-toolbar > ul { float: right; } .k-scheduler-toolbar > ul:first-child { float: left; } .k-scheduler-toolbar > .k-scheduler-tools { float: left; margin-bottom: .5em; } .k-scheduler-tools + .k-scheduler-navigation { float: left; clear: left; } .k-scheduler-toolbar > ul > li, .k-scheduler-footer > ul > li { display: inline-block; border-style: solid; border-width: 1px 1px 1px 0; } .k-scheduler .k-scheduler-toolbar .k-nav-current, .k-scheduler .k-scheduler-toolbar .k-scheduler-tools > li { border-width: 0; } .k-scheduler-toolbar > ul > li:first-child { border-left-width: 1px; } .k-scheduler div.k-scheduler-footer ul li { margin-right: .6em; border-width: 1px; } .k-scheduler-toolbar .k-link, .k-scheduler-footer .k-link { display: inline-block; padding: 0 1.1em; } .k-scheduler-toolbar .k-nav-prev .k-link, .k-scheduler-toolbar .k-nav-next .k-link { padding-left: .6em; padding-right: .6em; } .k-ie7 .k-scheduler-toolbar .k-nav-prev .k-link, .k-ie7 .k-scheduler-toolbar .k-nav-next .k-link { height: 2.3em; margin-top: -1px; vertical-align: middle; } .k-ie7 .k-scheduler-toolbar .k-nav-prev .k-link .k-icon, .k-ie7 .k-scheduler-toolbar .k-nav-next .k-link .k-icon { margin-top: .5em; } .k-scheduler-toolbar .k-nav-current .k-link { padding: 0; } .k-scheduler-toolbar .k-nav-current { margin: 0 1.1em; } .k-scheduler div.k-scheduler-toolbar > ul > li.k-nav-current, .k-scheduler .k-nav-current > .k-state-active { background: none; } .k-scheduler-phone .k-scheduler-toolbar + .k-scheduler-toolbar .k-scheduler-navigation { width: 100%; text-align: center; } .k-scheduler-phone .k-scheduler-toolbar + .k-scheduler-toolbar .k-scheduler-navigation > li { background: none; border: 0; } .k-scheduler-phone .k-toolbar .k-nav-next { float: right; } .k-scheduler-phone .k-toolbar .k-nav-prev { float: left; } .k-scheduler-toolbar .k-i-calendar, .k-scheduler-footer .k-icon { margin: -2px 6px 0 0; } .k-scheduler-header, .k-scheduler-header-wrap { overflow: hidden; } .k-scheduler-header-wrap { position: relative; border-style: solid; border-width: 0; } .k-scheduler .k-scrollbar-v .k-scheduler-header-wrap { border-right-width: 1px; } .k-scheduler-times, .k-scheduler-content { position: relative; } .k-scheduler-times { overflow: hidden; border-style: solid; border-width: 0; } .k-scheduler-content { overflow: auto; } .k-scheduler-layout, .k-scheduler-table { border-spacing: 0; width: 100%; margin: 0; border-collapse: separate; } .k-ie7 .k-scheduler-content .k-scheduler-table { width: auto; } .k-scheduler-layout > tbody > tr > td { padding: 0; vertical-align: top; } /* fix smashed second layout column in iPad */ .k-safari .k-scheduler-layout > tbody > tr > td + td { width: 100%; } .k-scheduler-table { table-layout: fixed; } .k-scheduler-times .k-scheduler-table { table-layout: auto; } .k-scheduler-monthview .k-scheduler-content .k-scheduler-table { height: 100%; } .k-scheduler-table td, .k-scheduler-table th { height: 1.5em; padding: .334em .5em; font-size: 100%; } .k-scheduler .k-scheduler-table td, .k-scheduler .k-scheduler-table th { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } .k-scheduler-monthview .k-hidden, .k-scheduler-monthview .k-hidden > div { width: 0 !important; overflow: hidden !important; } .k-scheduler-monthview .k-hidden { padding-left: 0 !important; padding-right: 0 !important; border-right-width: 0 !important; } .k-scheduler-monthview > tbody > tr:first-child .k-scheduler-times { margin-right: 1px; } .k-scheduler-monthview > tbody > tr:first-child .k-scheduler-times .k-hidden { height: auto; } .k-scheduler-monthview .k-scheduler-table td, .k-scheduler-monthview .k-hidden { height: 80px; text-align: right; } .k-scheduler-phone .k-scheduler-monthview .k-scheduler-table td, .k-scheduler-phone .k-scheduler-monthview .k-hidden { height: 40px; } .k-scheduler-table td, .k-slot-cell { vertical-align: top; } /* separate due to old IEs */ .k-scheduler-layout tr + tr .k-scheduler-times th:last-child { vertical-align: top; } .k-scheduler-phone .k-scheduler-monthview .k-scheduler-table td { text-align: center; vertical-align: middle; } .k-scheduler-phone .k-scheduler-monthview .k-scheduler-table td span { font-size: 1.5em; } .k-scheduler-header th { overflow: hidden; text-overflow: ellipsis; } .k-scheduler-table td, .k-scheduler-header th { border-style: solid; border-width: 0 0 1px 1px; } .k-scheduler-table td:first-child, .k-scheduler-header th:first-child { border-left-width: 0; } .k-scheduler-agendaview .k-scheduler-table td:first-child { border-left-width: 1px; } .k-scheduler-agendaview .k-scheduler-table td.k-first { border-left-width: 0; } .k-scheduler-layout tr + tr .k-scheduler-times tr:last-child > th, .k-scheduler-layout tr + tr .k-scheduler-table > tbody > tr:last-child > td, .k-scheduler-table > tbody > tr > .k-last { border-bottom-width: 0; } .k-scrollbar-h tr + tr .k-scheduler-times, .k-scrollbar-h .k-scheduler-content .k-scheduler-table > tbody > tr:last-child > td, .k-scheduler-agendaview.k-scrollbar-h .k-scheduler-table > tbody > tr > td.k-last { border-bottom-width: 1px; } .k-scheduler-times th { text-align: right; padding-right: .6em; border-style: solid; border-width: 0 1px 1px 0; border-color: transparent; white-space: nowrap; } .k-scheduler-layout tr + tr .k-scheduler-times th { border-bottom-color: transparent; } .k-scheduler-layout tr + tr .k-scheduler-times th.k-slot-cell, .k-scheduler-layout tr + tr .k-scheduler-times th.k-scheduler-times-all-day { border-bottom-color: inherit; } .k-scheduler .k-middle-row td { border-bottom-style: dotted; } .k-scheduler-now-arrow, .k-scheduler-now-line { position: absolute; } .k-scheduler-now-arrow { width: 0; height: 0; border: solid 5px transparent; left: 0; } .k-scheduler-now-line { left: 5px; right: 0; height: 1px; } .k-task { position: relative; } div.k-more-events { text-align: center; font-size: 18px; line-height: 1.2; padding: 0; } .k-more-events > span { display: block; margin-top: -0.6em; } .k-event, .k-more-events { position: absolute; border-style: solid; border-width: 1px; text-align: left; overflow: hidden; } .k-event { cursor: default; min-height: 1.3em; } .k-event-drag-hint { filter: alpha(opacity=60); opacity: .6; cursor: -webkit-grabbing; cursor: -moz-grabbing; } .k-scheduler-header .k-event { white-space: nowrap; } .k-event-template { padding: .3em 1.4em .3em .6em; } .k-event-time { display: none; padding-bottom: 0; font-size: .9em; } .k-event-drag-hint .k-event-time { display: block; } .k-event-actions, .k-event > .k-link, .k-task > .k-link { position: absolute; top: 3px; right: 4px; white-space: nowrap; } .k-event-actions { z-index: 1; } .k-scheduler-agendaview .k-task > .k-link { top: 0; right: 0; } .k-event-actions:first-child { position: static; float: left; margin: 4px 2px 0 4px; } .k-webkit .k-event-actions:first-child { margin-top: 3px; } .k-event-actions:first-child > .k-link { display: inline-block; } .k-event-delete { display: none; } .k-event:hover .k-event-delete, tr:hover > td > .k-task .k-event-delete { display: inline-block; } .k-event .k-event-top-actions, .k-event .k-event-bottom-actions { position: absolute; top: 0; left: 0; width: 100%; text-align: center; } .k-event .k-event-bottom-actions { top: auto; bottom: 0; } .k-event .k-resize-handle, .k-scheduler-mobile .k-event:hover .k-resize-handle { position: absolute; visibility: hidden; z-index: 2; } .k-event:hover .k-resize-handle, .k-event-active .k-resize-handle, .k-scheduler-mobile .k-event-active:hover .k-resize-handle { visibility: visible; } .k-event .k-resize-handle:after { content: ""; position: absolute; filter: alpha(opacity=50); opacity: .5; } .k-scheduler-mobile .k-event .k-resize-handle:after { filter: none; opacity: 1; } .k-event > .k-resize-n { top: 0; left: 0; right: 0; height: .4em; } .k-event > .k-resize-s { bottom: 0; left: 0; right: 0; height: .4em; } .k-event > .k-resize-e { right: 0; top: 0; bottom: 0; width: .4em; } .k-event > .k-resize-w { left: 0; top: 0; bottom: 0; width: .4em; } .k-event > .k-resize-n:after, .k-event > .k-resize-s:after { top: 1px; left: 50%; margin-left: -1em; width: 2em; height: 1px; } .k-event > .k-resize-s:after { top: auto; bottom: 1px; } .k-event > .k-resize-e:after, .k-event > .k-resize-w:after { left: 1px; top: 50%; margin-top: -0.7em; height: 1.4em; width: 1px; } .k-event > .k-resize-e:after { left: auto; right: 1px; } .k-scheduler-mobile .k-event > .k-resize-n, .k-scheduler-mobile .k-event > .k-resize-s { height: .6em; } .k-scheduler-mobile .k-event > .k-resize-e, .k-scheduler-mobile .k-event > .k-resize-w { width: .6em; } .k-scheduler-mobile .k-event > .k-resize-n:after, .k-scheduler-mobile .k-event > .k-resize-s:after { top: 0; margin-left: -3em; width: 4em; height: .6em; } .k-scheduler-mobile .k-event > .k-resize-s:after { bottom: 0; } .k-scheduler-mobile .k-event > .k-resize-e:after, .k-scheduler-mobile .k-event > .k-resize-w:after { left: 0; margin-top: -0.7em; height: 1.4em; width: .6em; } .k-scheduler-mobile .k-event > .k-resize-e:after { right: 0; } .k-scheduler-mobile .k-event > .k-resize-n:after { border-radius: 0 0 4px 4px; } .k-scheduler-mobile .k-event > .k-resize-s:after { border-radius: 4px 4px 0 0; } .k-scheduler-mobile .k-event > .k-resize-w:after { border-radius: 0 4px 4px 0; } .k-scheduler-mobile .k-event > .k-resize-e:after { border-radius: 4px 0 0 4px; } .k-scheduler-phone .k-scheduler-monthview .k-events-container { position: absolute; text-align: center; height: 6px; line-height: 6px; } .k-scheduler-phone .k-scheduler-monthview .k-event { position: static; display: inline-block; width: 4px; height: 4px; min-height: 0; margin: 1px; } .k-scheduler-marquee { border-style: solid; border-width: 0; } .k-scheduler-marquee.k-first:before, .k-scheduler-marquee.k-last:after { content: ""; position: absolute; width: 0; height: 0; border-style: solid; border-width: 3px; } div.k-scheduler-marquee:before { top: 0; left: 0; border-right-color: transparent; border-bottom-color: transparent; } div.k-scheduler-marquee:after { bottom: 0; right: 0; border-top-color: transparent; border-left-color: transparent; } .k-scheduler-marquee .k-label-top { position: absolute; top: .3em; left: .8em; font-size: .8em; } .k-scheduler-marquee .k-label-bottom { position: absolute; bottom: .3em; right: .81em; font-size: .8em; } .k-scheduler-quickedit .k-textbox { width: 200px; } .k-tooltip-bottom { text-align: left; } .k-tooltip-bottom .k-button { float: left; margin-right: .3em; } .k-tooltip-bottom .k-quickedit-details { float: right; margin-right: 0; } .k-scheduler-agendaview .k-scheduler-table th, .k-scheduler-agendaview .k-scheduler-table td { text-align: left; } .k-scheduler-times .k-slot-cell, .k-scheduler-groupcolumn { width: 6em; } .k-scheduler-datecolumn { width: 12em; } .k-scheduler-timecolumn { width: 11em; } .k-scheduler-timecolumn > div { position: relative; vertical-align: top; } .k-webkit .k-scheduler-timecolumn > div > .k-icon { vertical-align: top; } .k-scheduler-timecolumn > div > .k-i-arrow-e { position: absolute; right: -4px; } .k-scheduler-timecolumn .k-i-arrow-w { margin-left: -4px; } .k-scheduler-mark { display: inline-block; width: 1em; height: 1em; vertical-align: middle; margin-right: .5em; } .k-scheduler-agendaday { float: left; margin: 0 .2em 0 0; font-size: 3em; font-weight: normal; } .k-scheduler-agendaweek { display: block; margin: .4em 0 0; font-size: 1.1em; font-style: normal; } .k-scheduler-agendadate { font-size: .8em; } .k-scheduler-timecolumn { white-space: nowrap; } .k-scheduler-edit-form .k-edit-form-container, .k-scheduler-timezones .k-edit-form-container { width: 520px; } .k-scheduler-edit-form .k-edit-label { width: 17%; } .k-scheduler-edit-form .k-edit-field { width: 77%; } .k-scheduler-edit-form .k-textbox[name="title"], .k-scheduler-edit-form textarea.k-textbox { width: 100%; } .k-scheduler-edit-form textarea.k-textbox { min-height: 4em; resize: vertical; } .k-scheduler-edit-form > .k-edit-box:first-child .k-datetimepicker { margin-right: 1em; } .km-pane-wrapper .k-scheduler-edit-form .k-edit-buttons { clear: right; margin-right: 2%; margin-left: 2%; padding: 0 0 .6em; } .k-edit-box { float: left; } .k-edit-box + .k-edit-box { float: right; } .k-scheduler-edit-form label + input { margin-left: 1em; } .k-edit-field > ul.k-reset > li { margin: .2em 0 .4em; line-height: 2.4; } .k-edit-field > ul.k-reset.k-toolbar > li { margin: 0; } .k-edit-field > ul.k-reset .k-widget { margin-left: .8em; } .k-edit-field > ul.k-reset .k-numerictextbox, .k-edit-field span.k-recur-interval { width: 5em; } .k-edit-field > ul.k-reset .k-dropdown, .k-edit-field > ul.k-reset .k-datepicker, div[name="recurrenceRule"] > .k-dropdown { width: 9em; } .k-scheduler-edit-form .k-edit-buttons .k-scheduler-delete { float: left; } .k-popup-message { margin: 0; padding: 1em 0 2em; text-align: center; } .k-scheduler-timezones .k-dropdown:first-child { width: 100%; } .k-scheduler-timezones .k-dropdown + .k-dropdown { margin: .5em 0 .7em; } /* Tooltip */ .k-tooltip { position: absolute; z-index: 12000; border-style: solid; border-width: 1px; padding: 4px 5px 4px 6px; background-repeat: repeat-x; min-width: 20px; /*slider tooltip only*/ text-align: center; /*slider tooltip only*/ } .k-tooltip-button { text-align: right; height: 0; } .k-tooltip-content { height: 100%; } .k-tooltip-closable .k-tooltip-content { padding-right: 20px; } span.k-tooltip { position: static; display: inline-block; border-width: 1px; padding: 2px 5px 1px 6px; } .k-invalid-msg { display: none; } .k-callout { position: absolute; width: 0; height: 0; border-style: solid; border-width: 6px; border-color: transparent; } .k-callout-n { top: -13px; left: 50%; } .k-callout-w { top: 50%; left: -13px; } .k-callout-s { left: 50%; bottom: -13px; } .k-callout-e { top: 50%; right: -13px; } .k-slider-tooltip .k-callout-n, .k-slider-tooltip .k-callout-s { margin-left: -6px; } .k-slider-tooltip .k-callout-w, .k-slider-tooltip .k-callout-e { margin-top: -6px; } .k-tooltip-validation .k-warning { vertical-align: text-top; margin-right: 3px; } .k-tooltip-validation { z-index: 9999; } /* Toolbar */ .k-toolbar { position: relative; display: block; vertical-align: middle; line-height: 2.9em; } .k-toolbar .k-button .k-icon, .k-toolbar .k-button .k-sprite, .k-overflow-container .k-button .k-icon, .k-overflow-container .k-button .k-sprite { vertical-align: middle; margin-top: -7px; margin-bottom: -5px; } .k-toolbar .k-input { line-height: inherit; height: inherit; padding-top: 2px; padding-bottom: 2px; } .k-toolbar .k-input:before { content: "\a0"; display: inline-block; width: 0; } .k-ie .k-toolbar .k-input { height: 1.65em; } .k-toolbar .k-combobox .k-dropdown-wrap:before, .k-toolbar .k-picker-wrap:before, .k-toolbar .k-numeric-wrap:before { display: none; } .k-overflow-container .k-sprite { margin-left: -4px; } .k-toolbar-resizable { overflow: hidden; white-space: nowrap; } .k-toolbar > .k-align-left { float: none; } .k-toolbar > .k-align-right { float: right; } .k-toolbar > *, .k-toolbar .k-button { display: inline-block; vertical-align: middle; line-height: 1.72em; } .k-toolbar .k-separator { border-width: 0 0 0 1px; border-style: solid; width: 1px; line-height: inherit; } .k-toolbar .k-button-group { list-style-type: none; } .k-toolbar .k-button-group > li { display: inline-block; } .k-toolbar .k-button-group .k-button { margin: 0 0 0 -1px; border-radius: 0; } .k-toolbar .k-button, .k-toolbar .k-split-button, .k-toolbar .k-button-group, .k-toolbar .k-widget, .k-toolbar .k-textbox, .k-toolbar label, .k-toolbar .k-separator { margin: 0 .2em; line-height: 1.72em; vertical-align: middle; } .k-toolbar .k-split-button { padding-left: 0; } .k-toolbar .k-split-button .k-button, .k-toolbar .k-button-group .k-group-start { margin: 0; } .k-toolbar .k-split-button .k-split-button-arrow { margin: 0 0 0 -1px; } .k-toolbar .k-overflow-anchor { border-width: 0 0 0 1px; border-style: solid; height: 3em; width: 3em; line-height: inherit; padding: 0 .5em; margin: 0; position: relative; float: right; border-radius: 0; } .k-overflow-container .k-item { float: none; border: 0; } .k-overflow-container .k-separator { border-width: 0 0 1px; border-style: solid; height: 1px; line-height: 0; font-size: 0; padding: 0; } .k-overflow-container .k-overflow-button, .k-split-container .k-button { text-align: left; display: block; background: none; border-color: transparent; white-space: nowrap; } .k-split-container { margin-top: -1px; } .k-overflow-container .k-button-group { padding: 0; } .k-overflow-container .k-button-group > li { display: block; } .k-overflow-container .k-overflow-group { border-width: 1px 0; border-style: solid; border-radius: 0; padding: 2px 0; margin: 1px 0; } .k-overflow-container .k-overflow-hidden { display: none; } .k-overflow-container .k-toolbar-first-visible, .k-overflow-container .k-overflow-group + .k-overflow-group, .k-overflow-container .k-separator + .k-overflow-group { border-top: 0; margin-top: 0; padding-top: 1px; } .k-overflow-container .k-overflow-group + .k-separator { display: none; } .k-overflow-container .k-toolbar-last-visible { border-bottom: 0; margin-bottom: 0; padding-bottom: 1px; } /* Splitter */ .k-splitter { position: relative; height: 300px; } .k-pane > .k-splitter { border-width: 0; overflow: hidden; } .k-splitter .k-pane { overflow: hidden; } .k-splitter .k-scrollable { overflow: auto; } .k-splitter .k-pane-loading { position: absolute; top: 50%; left: 50%; margin: -8px 0 0 -8px; } .k-ghost-splitbar, .k-splitbar { position: absolute; border-style: solid; font-size: 0; outline: 0; -khtml-user-select: none; -webkit-user-select: none; -moz-user-select: -moz-none; -ms-user-select: none; user-select: none; } .k-splitter .k-ghost-splitbar-horizontal, .k-splitter .k-splitbar-horizontal { top: 0; width: 5px; border-width: 0 1px; background-repeat: repeat-y; } .k-ghost-splitbar-vertical, .k-splitbar-vertical { left: 0; height: 5px; border-width: 1px 0; background-repeat: repeat-x; } .k-splitbar-draggable-horizontal { cursor: w-resize; } .k-splitbar-draggable-vertical { cursor: n-resize; } .k-splitbar .k-resize-handle { display: none; } .k-restricted-size-horizontal, .k-restricted-size-vertical { background-color: #f00; } .k-splitbar-horizontal .k-icon { position: absolute; top: 50%; width: 5px; height: 20px; margin-top: -10px; } .k-collapse-prev, .k-collapse-next, .k-expand-prev, .k-expand-next { cursor: pointer; } .k-splitbar-horizontal .k-collapse-prev { margin-top: -31px; } .k-splitbar-horizontal .k-collapse-next { margin-top: 11px; } .k-splitbar-static-horizontal { width: 1px; } .k-splitbar-static-vertical { height: 1px; } .k-splitbar-vertical .k-icon { position: absolute; left: 50%; width: 20px; height: 5px; margin-left: -10px; } .k-splitbar-vertical .k-collapse-prev { margin-left: -31px; } .k-splitbar-vertical .k-collapse-next { margin-left: 11px; } .k-splitbar-draggable-vertical .k-resize-handle, .k-splitbar-draggable-horizontal .k-resize-handle { display: inline-block; } .k-splitbar-horizontal .k-resize-handle { background-position: -165px -6px; } .k-splitbar-horizontal-hover > .k-resize-handle { background-position: -181px -6px; } .k-splitbar-horizontal .k-collapse-prev, .k-splitbar-horizontal .k-expand-next { background-position: -6px -174px; } .k-splitbar-horizontal-hover > .k-collapse-prev, .k-splitbar-horizontal-hover > .k-expand-next { background-position: -22px -174px; } .k-splitbar-horizontal .k-collapse-next, .k-splitbar-horizontal .k-expand-prev { background-position: -5px -142px; } .k-splitbar-horizontal-hover > .k-collapse-next, .k-splitbar-horizontal-hover > .k-expand-prev { background-position: -21px -142px; } .k-splitbar-vertical .k-resize-handle { background-position: -38px -309px; } .k-splitbar-vertical-hover > .k-resize-handle { background-position: -70px -309px; } .k-splitbar-vertical .k-collapse-prev, .k-splitbar-vertical .k-expand-next { background-position: 2px -134px; } .k-splitbar-vertical-hover > .k-collapse-prev, .k-splitbar-vertical-hover > .k-expand-next { background-position: -14px -134px; } .k-splitbar-vertical .k-collapse-next, .k-splitbar-vertical .k-expand-prev { background-position: 2px -165px; } .k-splitbar-vertical-hover > .k-collapse-next, .k-splitbar-vertical-hover > .k-expand-prev { background-position: -14px -165px; } /* Upload */ html .k-upload { position: relative; } html .k-upload-empty { border-width: 0; background: none; } .k-dropzone em, .k-upload-button { vertical-align: middle; } .k-ie7 .k-dropzone em, .k-ie7 .k-upload-button { vertical-align: baseline; } .k-dropzone, .k-file { position: relative; } .k-dropzone { border-style: solid; border-width: 0; padding: .8em; background-color: transparent; } .k-dropzone em { visibility: hidden; margin-left: .6em; } .k-dropzone-active em { visibility: visible; } .k-upload-button { position: relative; min-width: 7.167em; overflow: hidden !important; /* important required by IE7 */ direction: ltr; } .k-upload-sync .k-upload-button, .k-ie7 .k-upload-button, .k-ie8 .k-upload-button, .k-ie9 .k-upload-button { margin: .8em; } .k-upload-button input { position: absolute; top: 0; right: 0; z-index: 1; font: 170px monospace !important; /* critical for correct operation; larger values lead to ignoring or text layout problems in IE */ filter: alpha(opacity=0); opacity: 0; margin: 0; padding: 0; cursor: pointer; } .k-upload-files { margin: 0 0 .6em; line-height: 2.66; border-style: solid; border-width: 1px 0 0; } .k-upload-files .k-button { padding: 0; } .k-upload-files .k-button, .k-upload-status-total .k-icon { margin-left: 8px; } .k-ie7 .k-upload-files .k-button { line-height: 1; } /*IE7*/ .k-upload .k-fail { background-position: -161px -111px; } .k-si-refresh { background-position: -160px -128px; } .k-link:not(.k-state-disabled):hover > .k-si-refresh, .k-state-hover > .k-si-refresh, .k-state-hover > * > .k-si-refresh, .k-button:not(.k-state-disabled):hover .k-si-refresh, .k-textbox:hover .k-si-refresh, .k-button:active .k-si-refresh { background-position: -176px -128px; } .k-si-tick, .k-success { background-position: -160px -96px; } .k-link:not(.k-state-disabled):hover > .k-si-tick, .k-link:not(.k-state-disabled):hover > .k-success, .k-state-hover > .k-si-tick, .k-state-hover > .k-success, .k-state-hover > * > .k-si-tick, .k-state-hover > * > .k-success, .k-button:not(.k-state-disabled):hover .k-si-tick, .k-button:not(.k-state-disabled):hover .k-success, .k-textbox:hover .k-si-tick, .k-textbox:hover .k-success, .k-button:active .k-si-tick, .k-button:active .k-success { background-position: -176px -96px; } .k-si-cancel { background-position: -160px -112px; } .k-link:not(.k-state-disabled):hover > .k-si-cancel, .k-state-hover > .k-si-cancel, .k-state-hover > * > .k-si-cancel, .k-button:not(.k-state-disabled):hover .k-si-cancel, .k-textbox:hover .k-si-cancel, .k-button:active .k-si-cancel { background-position: -176px -112px; } .k-file { border-style: solid; border-width: 0 0 1px; padding: .167em .167em .167em .8em; } .k-file .k-icon { position: relative; } .k-file > .k-icon { background-position: -112px -288px; } .k-link:not(.k-state-disabled):hover > .k-file > .k-icon, .k-state-hover > .k-file > .k-icon, .k-state-hover > * > .k-file > .k-icon, .k-button:not(.k-state-disabled):hover .k-file > .k-icon, .k-textbox:hover .k-file > .k-icon, .k-button:active .k-file > .k-icon { background-position: -128px -288px; } .k-filename { position: relative; display: inline-block; min-width: 10em; max-width: 16.667em; vertical-align: middle; margin-left: 1em; padding-bottom: 0.167em; overflow: hidden; text-overflow: ellipsis; -o-text-overflow: ellipsis; white-space: nowrap; } .k-upload-status { position: absolute; right: 12px; top: .6em; line-height: .7em; } .k-upload-status .k-button, .k-upload-status .k-warning { vertical-align: text-bottom; } .k-dropzone .k-upload-status { line-height: 2.4; } .k-upload-pct { line-height: 20px; } .k-ie8 .k-upload-status-total { line-height: 29px; } .k-progress { position: absolute; top: 0; bottom: 0; left: 0; } .k-upload-selected { min-width: 7.167em; margin: 0.25em 0 0; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } .k-ie7 .k-upload-selected { min-width: 100px; } .k-upload-selected, .k-upload-cancel { margin-bottom: .8em; } .k-upload-selected { margin-left: .8em; margin-right: .2em; } /* ImageBrowser */ .k-toolbar-wrap .k-dropzone em, .k-toolbar-wrap .k-upload-files { display: none; } .k-toolbar-wrap .k-dropzone { border: 0; padding: 0; } .k-toolbar-wrap .k-dropzone-active { text-align: center; } .k-toolbar-wrap .k-dropzone-active em { display: inline; margin: 0; font-size: 5em; font-style: normal; } .k-toolbar-wrap .k-dropzone-active .k-upload-button { display: none; } .k-filebrowser-dropzone { z-index: 10010; filter: alpha(opacity=40); opacity: .4; position: fixed; } .k-search-wrap { position: relative; float: right; width: 20%; padding: 0; } .k-search-wrap label { position: absolute; top: 0; left: 4px; line-height: 20px; font-style: italic; } .k-search-wrap input.k-input { padding-left: 0; padding-right: 0; } .k-search-wrap .k-search { position: absolute; top: 4px; right: 2px; margin: 0; } .k-breadcrumbs { position: relative; float: left; width: 79%; } .k-breadcrumbs-wrap { position: absolute; top: 3px; left: 0; z-index: 1; padding-left: 5px; line-height: 18px; } .k-breadcrumbs > .k-input { width: 100%; font-size: inherit; font-family: inherit; border: 0; } .k-breadcrumbs .k-link, .k-breadcrumbs-wrap .k-icon { margin-top: 0; text-decoration: none; vertical-align: middle; position: static; } .k-breadcrumbs .k-link:hover { text-decoration: underline; } .k-filebrowser .k-breadcrumbs .k-i-seek-w { text-decoration: none; cursor: default; } .k-filebrowser .k-filebrowser-toolbar { border-style: solid; border-width: 1px; margin: 8px 0 0; padding: .25em; line-height: 23px; white-space: nowrap; /*required by WebKit*/ } .k-filebrowser .k-filebrowser-toolbar .k-button.k-state-disabled { display: none; } .k-filebrowser .k-toolbar-wrap { float: left; } .k-filebrowser .k-tiles-arrange { float: right; } .k-filebrowser .k-tiles-arrange .k-dropdown { width: 75px; } .k-filebrowser .k-upload { float: left; z-index: 10010; border-width: 0; background-color: transparent; } .k-filebrowser .k-upload .k-upload-status { display: none; } .k-filebrowser .k-upload .k-upload-button { width: auto; margin-left: 0; vertical-align: top; } .k-filebrowser .k-upload .k-icon { vertical-align: bottom; } .k-ie7 .k-filebrowser .k-upload-button, .k-ie7 .k-filebrowser .k-upload .k-icon { vertical-align: baseline; position: relative; top: 1px; } .k-ie7 .k-filebrowser .k-upload .k-icon { top: 2px; } .k-ie7 .k-filebrowser .k-filebrowser-toolbar .k-button-icon { vertical-align: middle; } .k-tiles { clear: both; height: 390px; border-style: solid; border-width: 1px; border-top-width: 0; margin: 0 0 1.4em; padding: 9px; overflow: auto; line-height: 1.2; } .k-tile { float: left; width: 223px; height: 88px; overflow: hidden; border-style: solid; border-width: 1px; margin: 1px; padding: 0 0 4px; background-position: 0 100px; background-repeat: repeat-x; cursor: pointer; } .k-tiles li.k-state-hover, .k-tiles li.k-state-selected { background-position: 0 center; } .k-filebrowser .k-thumb { float: left; display: inline; width: 80px; height: 80px; margin: 4px 10px 0 4px; -khtml-user-select: none; -webkit-user-select: none; -moz-user-select: -moz-none; -ms-user-select: none; user-select: none; } .k-filebrowser .k-file { width: 80px; height: 80px; } .k-filebrowser .k-image { margin: 2px 0 0 2px; } .k-filebrowser .k-folder { width: 80px; height: 80px; background-position: 0 -200px; background-repeat: no-repeat; } .k-filebrowser .k-loading { margin: 35px 0 0 33px; } .k-tile strong, .k-tile input { margin: 10px 0 4px; font-weight: normal; } .k-tile strong { float: left; width: 120px; overflow: hidden; text-overflow: ellipsis; } .k-tile input { width: 100px; } .k-tile strong, .k-tile input, .k-tile .k-filesize { display: block; } .k-filebrowser .k-form-text-row { text-align: right; } .k-filebrowser .k-form-text-row label { width: 14%; } .k-filebrowser .k-form-text-row input { width: 80%; } .k-tile-empty { margin: 160px 0 0; } .k-tile-empty .k-dialog-upload { font-weight: bold; font-size: 120%; } .k-tile-empty strong { display: block; margin: 0 0 0.2em; font-size: 3em; font-weight: normal; } .k-tile-empty, .k-tile-empty .k-button-wrapper { text-align: center; } /* IE7 inline-block behavior */ .k-ie7 .k-button, .k-ie7 .k-grid-filter, .k-ie7 .k-header-column-menu, .k-ie7 .k-grid .k-pager-numbers, .k-ie7 .k-grid .k-status-text, .k-ie7 .k-pager-numbers .k-link, .k-ie7 .k-pager-numbers span, .k-ie7 .k-pager-numbers input, .k-ie7 .k-grouping-row p, .k-ie7 .k-grouping-header a, .k-ie7 .k-grouping-header .k-group-indicator, .k-ie7 .k-grouping-header .k-link, .k-ie7 .k-grouping-header .k-button, .k-ie7 .k-grid-actions, .k-ie7 .k-edit-label, .k-ie7 .k-edit-field, .k-ie7 .k-edit-form-container .editor-label, .k-ie7 .k-edit-form-container .editor-field, .k-ie7 .k-combobox, .k-ie7 .k-dropdown, .k-ie7 .k-selectbox, .k-ie7 .k-picker-wrap .k-select, .k-ie7 .k-dropdown-wrap .k-select, .k-ie7 .k-numerictextbox, .k-ie7 .k-timepicker, .k-ie7 .k-datepicker, .k-ie7 .k-datetimepicker, .k-ie7 .k-colorpicker, .k-ie7 .k-calendar, .k-ie7 .k-calendar .k-nav-fast, .k-ie7 .k-treeview .k-icon, .k-ie7 .k-treeview .k-image, .k-ie7 .k-treeview .k-sprite, .k-ie7 .k-treeview .k-in, .k-ie7 .k-colorpicker, .k-ie7 .k-colorpicker .k-tool-icon, .k-ie7 .k-palette.k-reset, .k-ie7 .k-editor-dialog .k-button, .k-ie7 .k-form-text-row label, .k-ie7 .k-tabstrip-items .k-item, .k-ie7 .k-tabstrip-items .k-link, .k-ie7 .k-slider-horizontal, .k-ie7 .k-splitbar-draggable-vertical .k-resize-handle, .k-ie7 .k-splitbar-draggable-horizontal .k-resize-handle, .k-ie7 .t-filename, .k-ie7 div.k-window, .k-ie7 .k-window-titlebar .k-window-action, .k-ie7 .k-scheduler-toolbar > ul > li, .k-ie7 .k-scheduler-footer > ul > li, .k-ie7 .k-scheduler-toolbar > ul > li, .k-ie7 .k-scheduler-footer > ul > li, .k-ie7 .k-event:hover .k-event-delete, .k-ie7 tr:hover > td > .k-task .k-event-delete, .k-ie7 .k-progressbar, .k-ie7 .k-progressbar-horizontal .k-item, .k-ie7 .k-progress-status, .k-ie7 .k-grid-header-locked, .k-ie7 .k-grid-content-locked, .k-ie7 .k-grid-header-locked + .k-grid-header-wrap, .k-ie7 .k-grid-content-locked + .k-grid-content, .k-ie7 .k-grid-footer-locked, .k-ie7 .k-gantt-layout, .k-ie7 .k-gantt-toolbar > ul > li, .k-ie7 .k-gantt-toolbar .k-link, .k-ie7 .k-task-summary, .k-ie7 .k-task-actions:first-child > .k-link, .k-ie7 .k-task-wrap:hover .k-task-delete, .k-ie7 .k-task-wrap-active .k-task-delete { display: inline; zoom: 1; } .k-ie7 .k-treeview .k-item, .k-ie7 .k-treeview .k-group { zoom: 1; } .k-ie7 .k-edit-field > .k-textbox { text-indent: 0; } /* common mobile css */ .km-root, .km-pane, .km-pane-wrapper { width: 100%; height: 100%; -ms-touch-action: none; -ms-content-zooming: none; -ms-user-select: none; -webkit-user-select: none; -webkit-text-size-adjust: none; -moz-text-size-adjust: none; text-size-adjust: none; } .km-pane-wrapper { position: absolute; width: 100%; height: 100%; } .km-pane, .km-shim { font-family: sans-serif; } .km-pane { overflow-x: hidden; } .km-view { top: 0; left: 0; position: absolute; display: -moz-box; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; height: 100%; width: 100%; -moz-box-orient: vertical; -webkit-box-orient: vertical; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; -webkit-align-items: stretch; align-items: stretch; -webkit-align-content: stretch; align-content: stretch; vertical-align: top; } .k-ff .km-view, .k-ff .km-pane { overflow: hidden; } .k-ff18 .km-view, .k-ff18 .km-pane, .k-ff19 .km-view, .k-ff19 .km-pane, .k-ff20 .km-view, .k-ff20 .km-pane, .k-ff21 .km-view, .k-ff21 .km-pane { position: relative; } .k-ff .km-view { display: -moz-inline-box; display: flex; } .km-content { min-height: 1px; -moz-box-flex: 1; -webkit-box-flex: 1; -webkit-flex: 1; -ms-flex: 1; flex: 1; -moz-box-align: stretch; -webkit-box-align: stretch; -ms-flex-align: stretch; flex-align: stretch; display: block; width: auto; overflow: hidden; position: relative; } .km-actionsheet > li { list-style-type: none; padding: inherit 1em; line-height: 2em; } .km-actionsheet { padding: 0; margin: 0; } .km-shim { left: 0; bottom: 0; position: fixed; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.6); z-index: 10001; } .km-shim .k-animation-container, .km-actionsheet-wrapper { width: 100%; -webkit-box-shadow: none; box-shadow: none; border: 0; } .km-shim .k-animation-container { width: auto; } /* /common mobile css */ .km-pane-wrapper .k-grid-edit-form > .km-header, .km-pane-wrapper .k-grid-column-menu > .km-header, .km-pane-wrapper .k-grid-filter-menu > .km-header, .km-pane-wrapper .k-scheduler-edit-form > .km-header { border-style: solid; border-width: 1px; padding: .3em .6em; text-align: center; width: auto; line-height: 2em; } .k-ie .km-pane-wrapper .k-scheduler > .k-scheduler-toolbar, .k-ie .km-pane-wrapper .k-scheduler > .k-scheduler-footer { line-height: 2em; } .km-pane-wrapper .k-grid-edit-form .k-multiselect, .km-pane-wrapper .k-scheduler-edit-form .k-multiselect { width: 15em; } .km-pane-wrapper .k-grid-edit-form .k-dropdown-wrap, .km-pane-wrapper .k-scheduler-edit-form .k-dropdown-wrap { display: block; } .km-pane-wrapper .k-grid-column-menu .k-done, .km-pane-wrapper .k-grid-filter-menu .k-submit, .km-pane-wrapper .k-grid-edit-form .k-grid-update, .km-pane-wrapper .k-scheduler-edit-form .k-scheduler-update { float: right; } .km-pane-wrapper .k-grid-filter-menu .k-cancel, .km-pane-wrapper .k-grid-edit-form .k-grid-cancel, .km-pane-wrapper .k-scheduler-edit-form .k-scheduler-cancel { float: left; } /* Actiosheet Styles */ .km-pane-wrapper .k-scheduler-edit-form .k-scheduler-delete, *:not(.km-pane) > .km-shim .km-actionsheet .k-button { display: block; text-align: center; } *:not(.km-pane) > .km-shim .km-actionsheet .k-button { font-size: 1.4em; margin: .3em 1em; } *:not(.km-pane) > .km-shim .km-actionsheet-title { text-align: center; line-height: 3em; margin-bottom: -0.3em; } *:not(.km-pane) > .km-shim > .k-animation-container { margin: 0 !important; padding: 0 !important; left: 0 !important; } /* Adaptive Grid */ .km-pane-wrapper > div.km-pane { -webkit-box-shadow: none; box-shadow: none; font-weight: normal; } .km-pane-wrapper .k-popup-edit-form .km-content > .km-scroll-container, .km-pane-wrapper .k-grid-edit-form .km-content > .km-scroll-container, .km-pane-wrapper .k-grid-column-menu .km-content > .km-scroll-container, .km-pane-wrapper .k-grid-filter-menu .km-content > .km-scroll-container { position: absolute; width: 100%; min-height: 100%; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .km-pane-wrapper .k-mobile-list .k-edit-field { width: 74%; } .km-pane-wrapper .k-grid-edit-form .k-popup-edit-form, .km-pane-wrapper .k-grid-edit-form .k-edit-form-container { width: auto; } .km-pane-wrapper .k-filter-menu .k-button { width: 100%; margin: 0; } .k-grid-mobile { border-width: 0; } .k-grid-mobile .k-resize-handle-inner { position: absolute; top: 50%; margin-top: -10px; left: -7px; width: 17px; height: 17px; border-style: solid; border-width: 2px; border-radius: 10px; } .k-grid-mobile .k-resize-handle-inner:before { content: ""; position: absolute; top: 50%; margin-top: -3px; left: 1px; width: 6px; height: 6px; background-position: -5px -53px; } .k-grid-mobile .k-resize-handle-inner:after { content: ""; position: absolute; top: 50%; margin-top: -3px; right: 1px; width: 6px; height: 6px; background-position: -5px -21px; } /* Adaptive Grid & Scheduler */ .km-pane-wrapper .km-pane * { -webkit-background-clip: border-box; background-clip: border-box; } .km-pane-wrapper .km-pane .k-mobile-list, .km-pane-wrapper .k-mobile-list ul { padding: 0; margin: 0; list-style-type: none; border-radius: 0; background: none; } .km-pane-wrapper .km-switch { top: 50%; right: .8rem; position: absolute; margin-top: -1.1rem; } .km-pane-wrapper .k-mobile-list .k-state-disabled { opacity: 1; } .km-pane-wrapper .k-mobile-list .k-state-disabled > * { opacity: .7; } .km-pane-wrapper .k-mobile-list .k-item, .km-pane-wrapper .k-mobile-list .k-item > .k-link, .km-pane-wrapper .k-mobile-list .k-item > .k-label, .km-pane-wrapper .k-mobile-list .k-edit-label { display: block; position: relative; list-style-type: none; vertical-align: middle; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: .5em 0 .5em 1em; font-size: 1em; } .km-pane-wrapper .k-edit-form-container, .km-pane-wrapper .k-scheduler-edit-form .km-scroll-container { padding-top: 1em; width: 100%; } .km-pane-wrapper .k-mobile-list .k-edit-label { position: absolute; margin: 0; float: none; clear: none; width: 100%; } .km-pane-wrapper .k-mobile-list .k-edit-field, .km-pane-wrapper .k-mobile-list .k-edit-label label { display: block; text-align: left; overflow: hidden; text-overflow: ellipsis; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: .1em 0; margin: 0; } .km-pane-wrapper .k-mobile-list .k-item, .km-pane-wrapper .k-mobile-list .k-edit-field, .km-pane-wrapper .k-mobile-list .k-edit-label { font-size: 1em; line-height: 1.6em; overflow: hidden; } .km-pane-wrapper .k-mobile-list .k-edit-field, .km-pane-wrapper .k-mobile-list .k-edit-label { width: 100%; float: none; clear: none; min-height: 2.7em; } .km-pane-wrapper .km-header .k-icon, .km-pane-wrapper .k-grid-toolbar .k-icon, .km-pane-wrapper .k-grid-edit .k-icon, .km-pane-wrapper .k-grid-delete .k-icon { display: none; } .km-pane-wrapper .k-mobile-list .k-edit-field { padding: .5em 0; } .km-pane-wrapper .k-mobile-list .k-scheduler-toolbar { padding: .3em 0; } .km-pane-wrapper .k-mobile-list .k-scheduler-toolbar ul li { line-height: 2em; } .km-pane-wrapper .k-mobile-list .k-item > * { line-height: normal; } .km-pane-wrapper .k-mobile-list .k-edit-buttons, .km-pane-wrapper .k-mobile-list .k-button-container { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: .5em 1em; margin: 0; } .km-pane-wrapper .k-mobile-list > ul > li > .k-link, .km-pane-wrapper .k-mobile-list .k-filter-help-text > li > .k-link, .km-pane-wrapper .k-mobile-list .k-recur-view > .k-edit-label:nth-child(3), .km-pane-wrapper #recurrence .km-scroll-container > .k-edit-label:first-child { display: block; padding: .2em 1em; font-size: .95em; position: -webkit-sticky; margin: 0; font-weight: normal; line-height: 2em; background: transparent; border-top: 1em solid transparent; } .km-pane-wrapper .k-mobile-list .k-recur-view > .k-edit-label:nth-child(3), .km-pane-wrapper #recurrence .km-scroll-container > .k-edit-label:first-child { position: relative; } .km-pane-wrapper .k-mobile-list .k-item:first-child { border-top: 0; } .km-pane-wrapper .k-mobile-list .k-item:last-child { border-bottom: 0; } .km-pane-wrapper .k-mobile-list .k-item > .k-link, .km-pane-wrapper .k-mobile-list .k-item > .k-label { line-height: inherit; text-decoration: none; margin: -0.5em 0 -0.5em -1em; } /* Mobile list form elements */ .k-check[type=checkbox], .k-check[type=radio], .k-mobile-list .k-edit-field [type=checkbox], .k-mobile-list .k-edit-field [type=radio] { appearance: none; -moz-appearance: none; -webkit-appearance: none; background-color: transparent; } .km-pane-wrapper .k-mobile-list .k-link .k-check, .km-pane-wrapper .k-mobile-list .k-label .k-check, .k-mobile-list .k-edit-field [type=checkbox], .k-mobile-list .k-edit-field [type=radio] { border: 0; font-size: inherit; width: 13px; height: 13px; margin: .26em 1em .26em 0; } .k-ie .km-pane-wrapper .k-icon, .k-ie .km-pane-wrapper .k-mobile-list .k-link .k-check, .k-ie .km-pane-wrapper .k-mobile-list .k-label .k-check, .k-ie .k-mobile-list .k-edit-field [type=checkbox], .k-ie .k-mobile-list .k-edit-field [type=radio] { font-size: inherit; text-indent: -9999px; width: 1.01em; height: 1em; } /* IE Adaptive icons in em */ @media screen and (-ms-high-contrast: active) and (-ms-high-contrast: none) { .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-n { background-position: 0em 0em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-n, .k-state-hover > .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-n, .k-state-hover > * > .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-n, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-n, .k-textbox:hover .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-n, .k-button:active .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-n { background-position: -1em 0em; } .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-s { background-position: 0em -2em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-s, .k-state-hover > .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-s, .k-state-hover > * > .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-s, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-s, .k-textbox:hover .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-s, .k-button:active .km-pane-wrapper .k-numerictextbox .k-select .k-link span.k-i-arrow-s { background-position: -1em -2em; } .km-pane-wrapper .k-state-selected .k-i-arrow-n { background-position: -1em 0em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-state-selected .k-i-arrow-n, .k-state-hover > .km-pane-wrapper .k-state-selected .k-i-arrow-n, .k-state-hover > * > .km-pane-wrapper .k-state-selected .k-i-arrow-n, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-state-selected .k-i-arrow-n, .k-textbox:hover .km-pane-wrapper .k-state-selected .k-i-arrow-n, .k-button:active .km-pane-wrapper .k-state-selected .k-i-arrow-n { background-position: -2em 0em; } .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-n, .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-n { background-position: -1em 0em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-n, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-n, .k-state-hover > .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-n, .k-state-hover > .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-n, .k-state-hover > * > .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-n, .k-state-hover > * > .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-n, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-n, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-n, .k-textbox:hover .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-n, .k-textbox:hover .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-n, .k-button:active .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-n, .k-button:active .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-n { background-position: -2em 0em; } .km-pane-wrapper .k-state-selected .k-i-arrow-s { background-position: -1em -2em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-state-selected .k-i-arrow-s, .k-state-hover > .km-pane-wrapper .k-state-selected .k-i-arrow-s, .k-state-hover > * > .km-pane-wrapper .k-state-selected .k-i-arrow-s, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-state-selected .k-i-arrow-s, .k-textbox:hover .km-pane-wrapper .k-state-selected .k-i-arrow-s, .k-button:active .km-pane-wrapper .k-state-selected .k-i-arrow-s { background-position: -2em -2em; } .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-s, .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-s { background-position: -1em -2em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-s, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-s, .k-state-hover > .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-s, .k-state-hover > .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-s, .k-state-hover > * > .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-s, .k-state-hover > * > .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-s, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-s, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-s, .k-textbox:hover .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-s, .k-textbox:hover .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-s, .k-button:active .km-pane-wrapper .k-numerictextbox .k-link.k-state-selected span.k-i-arrow-s, .k-button:active .km-pane-wrapper .k-numerictextbox .k-state-hover .k-link span.k-i-arrow-s { background-position: -2em -2em; } .km-pane-wrapper .k-i-arrow-n { background-position: 0em 0em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-arrow-n, .k-state-hover > .km-pane-wrapper .k-i-arrow-n, .k-state-hover > * > .km-pane-wrapper .k-i-arrow-n, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-arrow-n, .k-textbox:hover .km-pane-wrapper .k-i-arrow-n, .k-button:active .km-pane-wrapper .k-i-arrow-n { background-position: -1em 0em; } .km-pane-wrapper .k-i-arrow-e { background-position: 0em -1em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-arrow-e, .k-state-hover > .km-pane-wrapper .k-i-arrow-e, .k-state-hover > * > .km-pane-wrapper .k-i-arrow-e, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-arrow-e, .k-textbox:hover .km-pane-wrapper .k-i-arrow-e, .k-button:active .km-pane-wrapper .k-i-arrow-e { background-position: -1em -1em; } .k-rtl .km-pane-wrapper .k-i-arrow-w { background-position: 0em -1em; } .k-rtl .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-arrow-w, .k-rtl .k-state-hover > .km-pane-wrapper .k-i-arrow-w, .k-rtl .k-state-hover > * > .km-pane-wrapper .k-i-arrow-w, .k-rtl .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-arrow-w, .k-rtl .k-textbox:hover .km-pane-wrapper .k-i-arrow-w, .k-rtl .k-button:active .km-pane-wrapper .k-i-arrow-w { background-position: -1em -1em; } .km-pane-wrapper .k-i-arrow-s { background-position: 0em -2em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-arrow-s, .k-state-hover > .km-pane-wrapper .k-i-arrow-s, .k-state-hover > * > .km-pane-wrapper .k-i-arrow-s, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-arrow-s, .k-textbox:hover .km-pane-wrapper .k-i-arrow-s, .k-button:active .km-pane-wrapper .k-i-arrow-s { background-position: -1em -2em; } .km-pane-wrapper .k-i-arrow-w { background-position: 0em -3em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-arrow-w, .k-state-hover > .km-pane-wrapper .k-i-arrow-w, .k-state-hover > * > .km-pane-wrapper .k-i-arrow-w, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-arrow-w, .k-textbox:hover .km-pane-wrapper .k-i-arrow-w, .k-button:active .km-pane-wrapper .k-i-arrow-w { background-position: -1em -3em; } .k-rtl .km-pane-wrapper .k-i-arrow-e { background-position: 0em -3em; } .k-rtl .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-arrow-e, .k-rtl .k-state-hover > .km-pane-wrapper .k-i-arrow-e, .k-rtl .k-state-hover > * > .km-pane-wrapper .k-i-arrow-e, .k-rtl .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-arrow-e, .k-rtl .k-textbox:hover .km-pane-wrapper .k-i-arrow-e, .k-rtl .k-button:active .km-pane-wrapper .k-i-arrow-e { background-position: -1em -3em; } .km-pane-wrapper .k-i-seek-n { background-position: 0em -4em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-seek-n, .k-state-hover > .km-pane-wrapper .k-i-seek-n, .k-state-hover > * > .km-pane-wrapper .k-i-seek-n, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-seek-n, .k-textbox:hover .km-pane-wrapper .k-i-seek-n, .k-button:active .km-pane-wrapper .k-i-seek-n { background-position: -1em -4em; } .km-pane-wrapper .k-i-seek-e { background-position: 0em -5em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-seek-e, .k-state-hover > .km-pane-wrapper .k-i-seek-e, .k-state-hover > * > .km-pane-wrapper .k-i-seek-e, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-seek-e, .k-textbox:hover .km-pane-wrapper .k-i-seek-e, .k-button:active .km-pane-wrapper .k-i-seek-e { background-position: -1em -5em; } .k-rtl .km-pane-wrapper .k-i-seek-w { background-position: 0em -5em; } .k-rtl .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-seek-w, .k-rtl .k-state-hover > .km-pane-wrapper .k-i-seek-w, .k-rtl .k-state-hover > * > .km-pane-wrapper .k-i-seek-w, .k-rtl .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-seek-w, .k-rtl .k-textbox:hover .km-pane-wrapper .k-i-seek-w, .k-rtl .k-button:active .km-pane-wrapper .k-i-seek-w { background-position: -1em -5em; } .km-pane-wrapper .k-i-seek-s { background-position: 0em -6em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-seek-s, .k-state-hover > .km-pane-wrapper .k-i-seek-s, .k-state-hover > * > .km-pane-wrapper .k-i-seek-s, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-seek-s, .k-textbox:hover .km-pane-wrapper .k-i-seek-s, .k-button:active .km-pane-wrapper .k-i-seek-s { background-position: -1em -6em; } .km-pane-wrapper .k-i-seek-w { background-position: 0em -7em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-seek-w, .k-state-hover > .km-pane-wrapper .k-i-seek-w, .k-state-hover > * > .km-pane-wrapper .k-i-seek-w, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-seek-w, .k-textbox:hover .km-pane-wrapper .k-i-seek-w, .k-button:active .km-pane-wrapper .k-i-seek-w { background-position: -1em -7em; } .k-rtl .km-pane-wrapper .k-i-seek-e { background-position: 0em -7em; } .k-rtl .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-seek-e, .k-rtl .k-state-hover > .km-pane-wrapper .k-i-seek-e, .k-rtl .k-state-hover > * > .km-pane-wrapper .k-i-seek-e, .k-rtl .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-seek-e, .k-rtl .k-textbox:hover .km-pane-wrapper .k-i-seek-e, .k-rtl .k-button:active .km-pane-wrapper .k-i-seek-e { background-position: -1em -7em; } .km-pane-wrapper .k-i-arrowhead-n { background-position: 0em -16em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-arrowhead-n, .k-state-hover > .km-pane-wrapper .k-i-arrowhead-n, .k-state-hover > * > .km-pane-wrapper .k-i-arrowhead-n, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-arrowhead-n, .k-textbox:hover .km-pane-wrapper .k-i-arrowhead-n, .k-button:active .km-pane-wrapper .k-i-arrowhead-n { background-position: -1em -16em; } .km-pane-wrapper .k-i-arrowhead-e { background-position: 0em -17em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-arrowhead-e, .k-state-hover > .km-pane-wrapper .k-i-arrowhead-e, .k-state-hover > * > .km-pane-wrapper .k-i-arrowhead-e, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-arrowhead-e, .k-textbox:hover .km-pane-wrapper .k-i-arrowhead-e, .k-button:active .km-pane-wrapper .k-i-arrowhead-e { background-position: -1em -17em; } .km-pane-wrapper .k-i-arrowhead-s { background-position: 0em -18em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-arrowhead-s, .k-state-hover > .km-pane-wrapper .k-i-arrowhead-s, .k-state-hover > * > .km-pane-wrapper .k-i-arrowhead-s, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-arrowhead-s, .k-textbox:hover .km-pane-wrapper .k-i-arrowhead-s, .k-button:active .km-pane-wrapper .k-i-arrowhead-s { background-position: -1em -18em; } .km-pane-wrapper .k-i-arrowhead-w { background-position: 0em -19em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-arrowhead-w, .k-state-hover > .km-pane-wrapper .k-i-arrowhead-w, .k-state-hover > * > .km-pane-wrapper .k-i-arrowhead-w, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-arrowhead-w, .k-textbox:hover .km-pane-wrapper .k-i-arrowhead-w, .k-button:active .km-pane-wrapper .k-i-arrowhead-w { background-position: -1em -19em; } .km-pane-wrapper .k-i-expand, .km-pane-wrapper .k-plus, .km-pane-wrapper .k-plus-disabled { background-position: 0em -12em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-expand, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-plus, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-plus-disabled, .k-state-hover > .km-pane-wrapper .k-i-expand, .k-state-hover > .km-pane-wrapper .k-plus, .k-state-hover > .km-pane-wrapper .k-plus-disabled, .k-state-hover > * > .km-pane-wrapper .k-i-expand, .k-state-hover > * > .km-pane-wrapper .k-plus, .k-state-hover > * > .km-pane-wrapper .k-plus-disabled, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-expand, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-plus, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-plus-disabled, .k-textbox:hover .km-pane-wrapper .k-i-expand, .k-textbox:hover .km-pane-wrapper .k-plus, .k-textbox:hover .km-pane-wrapper .k-plus-disabled, .k-button:active .km-pane-wrapper .k-i-expand, .k-button:active .km-pane-wrapper .k-plus, .k-button:active .km-pane-wrapper .k-plus-disabled { background-position: -1em -12em; } .km-pane-wrapper .k-i-expand-w, .k-rtl .km-pane-wrapper .k-i-expand, .k-rtl .km-pane-wrapper .k-plus, .k-rtl .km-pane-wrapper .k-plus-disabled { background-position: 0em -13em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-expand-w, .k-link:not(.k-state-disabled):hover > .k-rtl .km-pane-wrapper .k-i-expand, .k-link:not(.k-state-disabled):hover > .k-rtl .km-pane-wrapper .k-plus, .k-link:not(.k-state-disabled):hover > .k-rtl .km-pane-wrapper .k-plus-disabled, .k-state-hover > .km-pane-wrapper .k-i-expand-w, .k-state-hover > .k-rtl .km-pane-wrapper .k-i-expand, .k-state-hover > .k-rtl .km-pane-wrapper .k-plus, .k-state-hover > .k-rtl .km-pane-wrapper .k-plus-disabled, .k-state-hover > * > .km-pane-wrapper .k-i-expand-w, .k-state-hover > * > .k-rtl .km-pane-wrapper .k-i-expand, .k-state-hover > * > .k-rtl .km-pane-wrapper .k-plus, .k-state-hover > * > .k-rtl .km-pane-wrapper .k-plus-disabled, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-expand-w, .k-button:not(.k-state-disabled):hover .k-rtl .km-pane-wrapper .k-i-expand, .k-button:not(.k-state-disabled):hover .k-rtl .km-pane-wrapper .k-plus, .k-button:not(.k-state-disabled):hover .k-rtl .km-pane-wrapper .k-plus-disabled, .k-textbox:hover .km-pane-wrapper .k-i-expand-w, .k-textbox:hover .k-rtl .km-pane-wrapper .k-i-expand, .k-textbox:hover .k-rtl .km-pane-wrapper .k-plus, .k-textbox:hover .k-rtl .km-pane-wrapper .k-plus-disabled, .k-button:active .km-pane-wrapper .k-i-expand-w, .k-button:active .k-rtl .km-pane-wrapper .k-i-expand, .k-button:active .k-rtl .km-pane-wrapper .k-plus, .k-button:active .k-rtl .km-pane-wrapper .k-plus-disabled { background-position: -1em -13em; } .km-pane-wrapper .k-i-collapse, .km-pane-wrapper .k-minus, .km-pane-wrapper .k-minus-disabled { background-position: 0em -14em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-collapse, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-minus, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-minus-disabled, .k-state-hover > .km-pane-wrapper .k-i-collapse, .k-state-hover > .km-pane-wrapper .k-minus, .k-state-hover > .km-pane-wrapper .k-minus-disabled, .k-state-hover > * > .km-pane-wrapper .k-i-collapse, .k-state-hover > * > .km-pane-wrapper .k-minus, .k-state-hover > * > .km-pane-wrapper .k-minus-disabled, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-collapse, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-minus, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-minus-disabled, .k-textbox:hover .km-pane-wrapper .k-i-collapse, .k-textbox:hover .km-pane-wrapper .k-minus, .k-textbox:hover .km-pane-wrapper .k-minus-disabled, .k-button:active .km-pane-wrapper .k-i-collapse, .k-button:active .km-pane-wrapper .k-minus, .k-button:active .km-pane-wrapper .k-minus-disabled { background-position: -1em -14em; } .km-pane-wrapper .k-i-collapse-w, .k-rtl .km-pane-wrapper .k-i-collapse, .k-rtl .km-pane-wrapper .k-minus, .k-rtl .km-pane-wrapper .k-minus-disabled { background-position: 0em -15em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-collapse-w, .k-link:not(.k-state-disabled):hover > .k-rtl .km-pane-wrapper .k-i-collapse, .k-link:not(.k-state-disabled):hover > .k-rtl .km-pane-wrapper .k-minus, .k-link:not(.k-state-disabled):hover > .k-rtl .km-pane-wrapper .k-minus-disabled, .k-state-hover > .km-pane-wrapper .k-i-collapse-w, .k-state-hover > .k-rtl .km-pane-wrapper .k-i-collapse, .k-state-hover > .k-rtl .km-pane-wrapper .k-minus, .k-state-hover > .k-rtl .km-pane-wrapper .k-minus-disabled, .k-state-hover > * > .km-pane-wrapper .k-i-collapse-w, .k-state-hover > * > .k-rtl .km-pane-wrapper .k-i-collapse, .k-state-hover > * > .k-rtl .km-pane-wrapper .k-minus, .k-state-hover > * > .k-rtl .km-pane-wrapper .k-minus-disabled, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-collapse-w, .k-button:not(.k-state-disabled):hover .k-rtl .km-pane-wrapper .k-i-collapse, .k-button:not(.k-state-disabled):hover .k-rtl .km-pane-wrapper .k-minus, .k-button:not(.k-state-disabled):hover .k-rtl .km-pane-wrapper .k-minus-disabled, .k-textbox:hover .km-pane-wrapper .k-i-collapse-w, .k-textbox:hover .k-rtl .km-pane-wrapper .k-i-collapse, .k-textbox:hover .k-rtl .km-pane-wrapper .k-minus, .k-textbox:hover .k-rtl .km-pane-wrapper .k-minus-disabled, .k-button:active .km-pane-wrapper .k-i-collapse-w, .k-button:active .k-rtl .km-pane-wrapper .k-i-collapse, .k-button:active .k-rtl .km-pane-wrapper .k-minus, .k-button:active .k-rtl .km-pane-wrapper .k-minus-disabled { background-position: -1em -15em; } .km-pane-wrapper .k-i-pencil, .km-pane-wrapper .k-edit { background-position: -2em 0em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-pencil, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-edit, .k-state-hover > .km-pane-wrapper .k-i-pencil, .k-state-hover > .km-pane-wrapper .k-edit, .k-state-hover > * > .km-pane-wrapper .k-i-pencil, .k-state-hover > * > .km-pane-wrapper .k-edit, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-pencil, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-edit, .k-textbox:hover .km-pane-wrapper .k-i-pencil, .k-textbox:hover .km-pane-wrapper .k-edit, .k-button:active .km-pane-wrapper .k-i-pencil, .k-button:active .km-pane-wrapper .k-edit { background-position: -3em 0em; } .km-pane-wrapper .k-i-close, .km-pane-wrapper .k-delete, .km-pane-wrapper .k-group-delete { background-position: -2em -1em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-close, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-delete, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-group-delete, .k-state-hover > .km-pane-wrapper .k-i-close, .k-state-hover > .km-pane-wrapper .k-delete, .k-state-hover > .km-pane-wrapper .k-group-delete, .k-state-hover > * > .km-pane-wrapper .k-i-close, .k-state-hover > * > .km-pane-wrapper .k-delete, .k-state-hover > * > .km-pane-wrapper .k-group-delete, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-close, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-delete, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-group-delete, .k-textbox:hover .km-pane-wrapper .k-i-close, .k-textbox:hover .km-pane-wrapper .k-delete, .k-textbox:hover .km-pane-wrapper .k-group-delete, .k-button:active .km-pane-wrapper .k-i-close, .k-button:active .km-pane-wrapper .k-delete, .k-button:active .km-pane-wrapper .k-group-delete { background-position: -3em -1em; } .km-pane-wrapper .k-si-close { background-position: -10em -5em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-si-close, .k-state-hover > .km-pane-wrapper .k-si-close, .k-state-hover > * > .km-pane-wrapper .k-si-close, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-si-close, .k-textbox:hover .km-pane-wrapper .k-si-close, .k-button:active .km-pane-wrapper .k-si-close { background-position: -11em -5em; } .km-pane-wrapper .k-multiselect .k-delete { background-position: -10em -5em; } .km-pane-wrapper .k-multiselect .k-state-hover .k-delete { background-position: -11em -5em; } .km-pane-wrapper .k-i-tick, .km-pane-wrapper .k-insert, .km-pane-wrapper .k-update { background-position: -2em -2em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-tick, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-insert, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-update, .k-state-hover > .km-pane-wrapper .k-i-tick, .k-state-hover > .km-pane-wrapper .k-insert, .k-state-hover > .km-pane-wrapper .k-update, .k-state-hover > * > .km-pane-wrapper .k-i-tick, .k-state-hover > * > .km-pane-wrapper .k-insert, .k-state-hover > * > .km-pane-wrapper .k-update, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-tick, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-insert, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-update, .k-textbox:hover .km-pane-wrapper .k-i-tick, .k-textbox:hover .km-pane-wrapper .k-insert, .k-textbox:hover .km-pane-wrapper .k-update, .k-button:active .km-pane-wrapper .k-i-tick, .k-button:active .km-pane-wrapper .k-insert, .k-button:active .km-pane-wrapper .k-update { background-position: -3em -2em; } .km-pane-wrapper .k-check:checked, .km-pane-wrapper .k-mobile-list .k-edit-field [type=checkbox], .km-pane-wrapper .k-mobile-list .k-edit-field [type=radio] { background-position: -2em -2em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-check:checked, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-mobile-list .k-edit-field [type=checkbox], .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-mobile-list .k-edit-field [type=radio], .k-state-hover > .km-pane-wrapper .k-check:checked, .k-state-hover > .km-pane-wrapper .k-mobile-list .k-edit-field [type=checkbox], .k-state-hover > .km-pane-wrapper .k-mobile-list .k-edit-field [type=radio], .k-state-hover > * > .km-pane-wrapper .k-check:checked, .k-state-hover > * > .km-pane-wrapper .k-mobile-list .k-edit-field [type=checkbox], .k-state-hover > * > .km-pane-wrapper .k-mobile-list .k-edit-field [type=radio], .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-check:checked, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-mobile-list .k-edit-field [type=checkbox], .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-mobile-list .k-edit-field [type=radio], .k-textbox:hover .km-pane-wrapper .k-check:checked, .k-textbox:hover .km-pane-wrapper .k-mobile-list .k-edit-field [type=checkbox], .k-textbox:hover .km-pane-wrapper .k-mobile-list .k-edit-field [type=radio], .k-button:active .km-pane-wrapper .k-check:checked, .k-button:active .km-pane-wrapper .k-mobile-list .k-edit-field [type=checkbox], .k-button:active .km-pane-wrapper .k-mobile-list .k-edit-field [type=radio] { background-position: -3em -2em; } .km-pane-wrapper .k-i-cancel, .km-pane-wrapper .k-cancel, .km-pane-wrapper .k-denied { background-position: -2em -3em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-cancel, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-cancel, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-denied, .k-state-hover > .km-pane-wrapper .k-i-cancel, .k-state-hover > .km-pane-wrapper .k-cancel, .k-state-hover > .km-pane-wrapper .k-denied, .k-state-hover > * > .km-pane-wrapper .k-i-cancel, .k-state-hover > * > .km-pane-wrapper .k-cancel, .k-state-hover > * > .km-pane-wrapper .k-denied, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-cancel, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-cancel, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-denied, .k-textbox:hover .km-pane-wrapper .k-i-cancel, .k-textbox:hover .km-pane-wrapper .k-cancel, .k-textbox:hover .km-pane-wrapper .k-denied, .k-button:active .km-pane-wrapper .k-i-cancel, .k-button:active .km-pane-wrapper .k-cancel, .k-button:active .km-pane-wrapper .k-denied { background-position: -3em -3em; } .km-pane-wrapper .k-i-plus, .km-pane-wrapper .k-add { background-position: -2em -4em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-plus, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-add, .k-state-hover > .km-pane-wrapper .k-i-plus, .k-state-hover > .km-pane-wrapper .k-add, .k-state-hover > * > .km-pane-wrapper .k-i-plus, .k-state-hover > * > .km-pane-wrapper .k-add, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-plus, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-add, .k-textbox:hover .km-pane-wrapper .k-i-plus, .k-textbox:hover .km-pane-wrapper .k-add, .k-button:active .km-pane-wrapper .k-i-plus, .k-button:active .km-pane-wrapper .k-add { background-position: -3em -4em; } .km-pane-wrapper .k-i-funnel, .km-pane-wrapper .k-filter { background-position: -2em -5em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-funnel, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-filter, .k-state-hover > .km-pane-wrapper .k-i-funnel, .k-state-hover > .km-pane-wrapper .k-filter, .k-state-hover > * > .km-pane-wrapper .k-i-funnel, .k-state-hover > * > .km-pane-wrapper .k-filter, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-funnel, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-filter, .k-textbox:hover .km-pane-wrapper .k-i-funnel, .k-textbox:hover .km-pane-wrapper .k-filter, .k-button:active .km-pane-wrapper .k-i-funnel, .k-button:active .km-pane-wrapper .k-filter { background-position: -3em -5em; } .km-pane-wrapper .k-i-funnel-clear, .km-pane-wrapper .k-clear-filter { background-position: -2em -6em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-funnel-clear, .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-clear-filter, .k-state-hover > .km-pane-wrapper .k-i-funnel-clear, .k-state-hover > .km-pane-wrapper .k-clear-filter, .k-state-hover > * > .km-pane-wrapper .k-i-funnel-clear, .k-state-hover > * > .km-pane-wrapper .k-clear-filter, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-funnel-clear, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-clear-filter, .k-textbox:hover .km-pane-wrapper .k-i-funnel-clear, .k-textbox:hover .km-pane-wrapper .k-clear-filter, .k-button:active .km-pane-wrapper .k-i-funnel-clear, .k-button:active .km-pane-wrapper .k-clear-filter { background-position: -3em -6em; } .km-pane-wrapper .k-i-refresh { background-position: -2em -7em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-refresh, .k-state-hover > .km-pane-wrapper .k-i-refresh, .k-state-hover > * > .km-pane-wrapper .k-i-refresh, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-refresh, .k-textbox:hover .km-pane-wrapper .k-i-refresh, .k-button:active .km-pane-wrapper .k-i-refresh { background-position: -3em -7em; } .km-pane-wrapper .k-i-exception { background-position: -10em -19em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-exception, .k-state-hover > .km-pane-wrapper .k-i-exception, .k-state-hover > * > .km-pane-wrapper .k-i-exception, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-exception, .k-textbox:hover .km-pane-wrapper .k-i-exception, .k-button:active .km-pane-wrapper .k-i-exception { background-position: -11em -19em; } .km-pane-wrapper .k-i-restore { background-position: -2em -8em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-restore, .k-state-hover > .km-pane-wrapper .k-i-restore, .k-state-hover > * > .km-pane-wrapper .k-i-restore, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-restore, .k-textbox:hover .km-pane-wrapper .k-i-restore, .k-button:active .km-pane-wrapper .k-i-restore { background-position: -3em -8em; } .km-pane-wrapper .k-i-maximize { background-position: -2em -9em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-maximize, .k-state-hover > .km-pane-wrapper .k-i-maximize, .k-state-hover > * > .km-pane-wrapper .k-i-maximize, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-maximize, .k-textbox:hover .km-pane-wrapper .k-i-maximize, .k-button:active .km-pane-wrapper .k-i-maximize { background-position: -3em -9em; } .km-pane-wrapper .k-i-minimize { background-position: -4em -18em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-minimize, .k-state-hover > .km-pane-wrapper .k-i-minimize, .k-state-hover > * > .km-pane-wrapper .k-i-minimize, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-minimize, .k-textbox:hover .km-pane-wrapper .k-i-minimize, .k-button:active .km-pane-wrapper .k-i-minimize { background-position: -5em -18em; } .km-pane-wrapper .k-i-pin { background-position: -10em -16em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-pin, .k-state-hover > .km-pane-wrapper .k-i-pin, .k-state-hover > * > .km-pane-wrapper .k-i-pin, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-pin, .k-textbox:hover .km-pane-wrapper .k-i-pin, .k-button:active .km-pane-wrapper .k-i-pin { background-position: -11em -16em; } .km-pane-wrapper .k-i-unpin { background-position: -10em -17em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-unpin, .k-state-hover > .km-pane-wrapper .k-i-unpin, .k-state-hover > * > .km-pane-wrapper .k-i-unpin, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-unpin, .k-textbox:hover .km-pane-wrapper .k-i-unpin, .k-button:active .km-pane-wrapper .k-i-unpin { background-position: -11em -17em; } .km-pane-wrapper .k-resize-se { background-position: -2em -10em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-resize-se, .k-state-hover > .km-pane-wrapper .k-resize-se, .k-state-hover > * > .km-pane-wrapper .k-resize-se, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-resize-se, .k-textbox:hover .km-pane-wrapper .k-resize-se, .k-button:active .km-pane-wrapper .k-resize-se { background-position: -3em -10em; } .km-pane-wrapper .k-i-calendar { background-position: -2em -11em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-calendar, .k-state-hover > .km-pane-wrapper .k-i-calendar, .k-state-hover > * > .km-pane-wrapper .k-i-calendar, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-calendar, .k-textbox:hover .km-pane-wrapper .k-i-calendar, .k-button:active .km-pane-wrapper .k-i-calendar { background-position: -3em -11em; } .km-pane-wrapper .k-i-clock { background-position: -2em -12em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-i-clock, .k-state-hover > .km-pane-wrapper .k-i-clock, .k-state-hover > * > .km-pane-wrapper .k-i-clock, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-i-clock, .k-textbox:hover .km-pane-wrapper .k-i-clock, .k-button:active .km-pane-wrapper .k-i-clock { background-position: -3em -12em; } .km-pane-wrapper .k-si-plus { background-position: -2em -13em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-si-plus, .k-state-hover > .km-pane-wrapper .k-si-plus, .k-state-hover > * > .km-pane-wrapper .k-si-plus, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-si-plus, .k-textbox:hover .km-pane-wrapper .k-si-plus, .k-button:active .km-pane-wrapper .k-si-plus { background-position: -3em -13em; } .km-pane-wrapper .k-si-minus { background-position: -2em -14em; } .k-link:not(.k-state-disabled):hover > .km-pane-wrapper .k-si-minus, .k-state-hover > .km-pane-wrapper .k-si-minus, .k-state-hover > * > .km-pane-wrapper .k-si-minus, .k-button:not(.k-state-disabled):hover .km-pane-wrapper .k-si-minus, .k-textbox:hover .km-pane-wrapper .k-si-minus, .k-button:active .km-pane-wrapper .k-si-minus { background-position: -3em -14em; } } .km-pane-wrapper .km-pane .k-mobile-list input:not([type="checkbox"]):not([type="radio"]), .km-pane-wrapper .km-pane .k-mobile-list select:not([multiple]), .km-pane-wrapper .km-pane .k-mobile-list textarea, .km-pane-wrapper .k-mobile-list .k-widget, .km-pane-wrapper .k-edit-field > *:not([type="checkbox"]):not([type="radio"]):not(.k-button) { text-indent: 0; font-size: 1em; line-height: 1.6em; vertical-align: middle; height: auto; padding: 0; border: 0; margin: 0; background: transparent; -webkit-box-shadow: none; box-shadow: none; border-radius: 0; } .km-pane-wrapper .k-mobile-list .k-widget { border: 0; border-radius: 0; } .k-ie .km-pane-wrapper .k-mobile-list .k-widget { height: initial; } .km-pane-wrapper .k-mobile-list .k-widget .k-input, .km-pane-wrapper .k-mobile-list .k-widget .k-state-default { border: 0; background: transparent; } .km-pane-wrapper *:not(.k-state-default) > input:not([type="checkbox"]):not([type="radio"]), .km-pane-wrapper .k-mobile-list select:not([multiple]), .km-pane-wrapper .k-mobile-list textarea, .km-pane-wrapper .k-mobile-list .k-widget, .km-pane-wrapper .k-edit-field > *:not([type="checkbox"]):not([type="radio"]):not(.k-button) { width: 80%; padding: .6em 0; margin: -0.5em 0; } .km-pane-wrapper .km-pane .k-mobile-list input, .km-pane-wrapper .km-pane .k-mobile-list select:not([multiple]), .km-pane-wrapper .km-pane .k-mobile-list textarea, .km-pane-wrapper .k-mobile-list .k-widget, .km-pane-wrapper .k-mobile-list .k-edit-field > * { -webkit-appearance: none; -moz-appearance: none; appearance: none; float: right; z-index: 1; position: relative; } .km-pane-wrapper .k-scheduler-views { width: 18em; } .km-pane-wrapper .k-mobile-list .k-edit-field.k-scheduler-toolbar { background: transparent; border: 0; -webkit-box-shadow: none; box-shadow: none; padding: .5em 1em; } .km-pane-wrapper #recurrence .k-scheduler-navigation { width: 100%; } .km-pane-wrapper .k-scheduler-views, .km-pane-wrapper .k-mobile-list .k-scheduler-navigation { display: table; table-layout: fixed; } .km-pane-wrapper .k-scheduler-views li, .km-pane-wrapper .k-mobile-list .k-scheduler-navigation li { display: table-cell; text-align: center; } .km-pane-wrapper .k-scheduler-views li a, .km-pane-wrapper .k-mobile-list .k-scheduler-navigation li a { padding-left: 0; padding-right: 0; width: 100%; } .km-pane-wrapper .k-mobile-list .k-recur-view > .k-edit-field .k-check { margin: 0; padding-left: 1em; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .km-pane-wrapper .k-mobile-list .k-recur-view > .k-edit-field .k-check:first-child { margin-top: -0.5em; } .km-pane-wrapper .k-mobile-list .k-recur-view > .k-edit-field .k-check:last-child { margin-bottom: -0.5em; } .km-pane-wrapper .k-mobile-list .k-scheduler-timezones .k-edit-field label.k-check { text-indent: 1em; } .km-pane-wrapper .k-mobile-list .k-edit-field > .k-button { margin-left: 20%; float: left; } .km-pane-wrapper .k-mobile-list .k-picker-wrap, .km-pane-wrapper .k-mobile-list .k-numeric-wrap, .km-pane-wrapper .k-mobile-list .k-dropdown-wrap { position: static; -webkit-box-shadow: none; box-shadow: none; } .km-pane-wrapper .k-mobile-list .k-datepicker .k-select, .km-pane-wrapper .k-mobile-list .k-datetimepicker .k-select, .km-pane-wrapper .k-mobile-list .k-numerictextbox .k-select { position: absolute; top: 0; right: 0; line-height: auto; } .km-pane-wrapper .k-mobile-list .k-datepicker .k-select:before, .km-pane-wrapper .k-mobile-list .k-datetimepicker .k-select:before { content: "\a0"; display: inline-block; width: 0; height: 100%; vertical-align: middle; } .km-pane-wrapper .k-mobile-list .k-numerictextbox .k-link { height: 50%; } .km-pane-wrapper .k-grid .k-button, .km-pane-wrapper .k-edit-form-container .k-button { margin: 0; } .km-pane-wrapper .k-grid .k-button + .k-button, .km-pane-wrapper .k-edit-form-container .k-button + .k-button { margin: 0 0 0 .18em; } .km-pane-wrapper .k-pager-numbers .k-link, .km-pane-wrapper .k-pager-numbers .k-state-selected, .km-pane-wrapper .k-pager-wrap > .k-link { width: 2.4em; height: 2.4em; line-height: 2.1em; border-radius: 2em; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .km-pane-wrapper .k-pager-numbers .k-link, .km-pane-wrapper .k-pager-numbers .k-state-selected { width: auto; line-height: 2.2em; padding: 0 .86em; min-width: .7em; } .km-pane-wrapper .k-pager-wrap { line-height: 2.4em; } @media all and (max-width: 699px), (-ms-high-contrast: active) and (-ms-high-contrast: none) and (max-width: 800px) { .km-pane-wrapper *:not(.k-state-default) > input:not([type="checkbox"]):not([type="radio"]), .km-pane-wrapper .k-mobile-list select:not([multiple]), .km-pane-wrapper .k-mobile-list textarea, .km-pane-wrapper .k-mobile-list .k-widget, .km-pane-wrapper .k-edit-field > *:not([type="checkbox"]):not([type="radio"]):not(.k-button) { width: 50%; } .km-pane-wrapper .k-mobile-list .k-edit-field > .k-button { margin-left: 50%; } .km-pane-wrapper .k-mobile-list .k-edit-field > .k-timezone-button { margin-left: 1em; } .km-pane-wrapper .k-scheduler-views { width: 15em; } .km-pane-wrapper .k-nav-today a { padding-left: .6em; padding-right: .6em; } .km-pane-wrapper li.k-nav-current { margin-left: 0; margin-right: 0; } .km-pane-wrapper .k-pager-wrap { position: relative; } .km-pane-wrapper .k-pager-numbers { width: auto; display: block; overflow: hidden; margin-right: 5.5em; float: none; text-overflow: ellipsis; height: 2.4em; text-align: center; } .km-pane-wrapper .k-pager-numbers li { float: none; display: inline-block; } .km-pane-wrapper .k-pager-nav { float: left; } .km-pane-wrapper .k-pager-nav + .k-pager-nav ~ .k-pager-nav { position: absolute; right: .3em; top: .3em; } .km-pane-wrapper .k-pager-wrap .k-pager-numbers + .k-pager-nav, .km-pane-wrapper .k-pager-nav:first-child + .k-pager-nav + .k-pager-nav { right: 3em; } .km-pane-wrapper .k-pager-info { display: none; } } .km-pane-wrapper .k-mobile-list .k-recur-view > .k-edit-field .k-check, .km-pane-wrapper .k-mobile-list .k-edit-field > * > select:not([multiple]), .km-pane-wrapper .k-mobile-list .k-scheduler-timezones .k-edit-field label.k-check { width: 100%; } /* Mobile Scroller */ .km-scroll-container { -khtml-user-select: none; -webkit-user-select: none; -moz-user-select: -moz-none; -ms-user-select: none; user-select: none; -webkit-margin-collapse: separate; -webkit-transform: translatez(0); } .k-widget .km-scroll-wrapper { position: relative; padding-bottom: 0; } .km-touch-scrollbar { position: absolute; visibility: hidden; z-index: 200000; height: .3em; width: .3em; background-color: rgba(0, 0, 0, 0.7); opacity: 0; -webkit-transition: opacity 0.3s linear; -moz-transition: opacity 0.3s linear; -o-transition: opacity 0.3s linear; transition: opacity 0.3s linear; -webkit-transition: "opacity 0.3s linear"; -moz-transition: "opacity 0.3s linear"; -ms-transition: "opacity 0.3s linear"; -o-transition: "opacity 0.3s linear"; transition: "opacity 0.3s linear"; } .km-vertical-scrollbar { height: 100%; right: 2px; top: 2px; } .km-horizontal-scrollbar { width: 100%; left: 2px; bottom: 2px; } /* animation classes */ .k-fx-end .k-fx-next, .k-fx-end .k-fx-current { -webkit-transition: all 350ms ease-out; -moz-transition: all 350ms ease-out; -ms-transition: all 350ms ease-out; -o-transition: all 350ms ease-out; transition: all 350ms ease-out; } .k-fx { position: relative; } .k-fx .k-fx-current { z-index: 0; } .k-fx .k-fx-next { z-index: 1; } .k-fx-hidden, .k-fx-hidden * { visibility: hidden !important; } .k-fx-reverse .k-fx-current { z-index: 1; } .k-fx-reverse .k-fx-next { z-index: 0; } /* Zoom */ .k-fx-zoom.k-fx-start .k-fx-next { -webkit-transform: scale(0) !important; -moz-transform: scale(0) !important; -ms-transform: scale(0) !important; -o-transform: scale(0) !important; transform: scale(0) !important; } .k-fx-zoom.k-fx-end .k-fx-next { -webkit-transform: scale(1) !important; -moz-transform: scale(1) !important; -ms-transform: scale(1) !important; -o-transform: scale(1) !important; transform: scale(1) !important; } .k-fx-zoom.k-fx-reverse.k-fx-start .k-fx-next, .k-fx-zoom.k-fx-reverse.k-fx-end .k-fx-next { -webkit-transform: scale(1) !important; -moz-transform: scale(1) !important; -ms-transform: scale(1) !important; -o-transform: scale(1) !important; transform: scale(1) !important; } .k-fx-zoom.k-fx-reverse.k-fx-start .k-fx-current { -webkit-transform: scale(1) !important; -moz-transform: scale(1) !important; -ms-transform: scale(1) !important; -o-transform: scale(1) !important; transform: scale(1) !important; } .k-fx-zoom.k-fx-reverse.k-fx-end .k-fx-current { -webkit-transform: scale(0) !important; -moz-transform: scale(0) !important; -ms-transform: scale(0) !important; -o-transform: scale(0) !important; transform: scale(0) !important; } /* Fade */ .k-fx-fade.k-fx-start .k-fx-next { will-change: opacity; opacity: 0; } .k-fx-fade.k-fx-end .k-fx-next { opacity: 1; } .k-fx-fade.k-fx-reverse.k-fx-start .k-fx-current { will-change: opacity; opacity: 1; } .k-fx-fade.k-fx-reverse.k-fx-end .k-fx-current { opacity: 0; } /* Slide */ .k-fx-slide { /* left */ /* left reverse */ /* right */ } .k-fx-slide.k-fx-end .k-fx-next .km-content, .k-fx-slide.k-fx-end .k-fx-next .km-header, .k-fx-slide.k-fx-end .k-fx-next .km-footer, .k-fx-slide.k-fx-end .k-fx-current .km-content, .k-fx-slide.k-fx-end .k-fx-current .km-header, .k-fx-slide.k-fx-end .k-fx-current .km-footer { -webkit-transition: all 350ms ease-out; -moz-transition: all 350ms ease-out; -ms-transition: all 350ms ease-out; -o-transition: all 350ms ease-out; transition: all 350ms ease-out; } .k-fx-slide.k-fx-start .k-fx-next .km-content { will-change: transform; -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-slide.k-fx-start .k-fx-next .km-header, .k-fx-slide.k-fx-start .k-fx-next .km-footer { will-change: opacity; opacity: 0; } .k-fx-slide.k-fx-end .k-fx-current .km-content { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-slide.k-fx-end .k-fx-next .km-header, .k-fx-slide.k-fx-end .k-fx-next .km-footer { opacity: 1; } .k-fx-slide.k-fx-reverse.k-fx-start .k-fx-current .km-content { will-change: transform; -webkit-transform: translatex(0); -moz-transform: translatex(0); -ms-transform: translatex(0); -o-transform: translatex(0); transform: translatex(0); } .k-fx-slide.k-fx-reverse.k-fx-end .k-fx-current .km-content { -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-slide.k-fx-reverse.k-fx-start .k-fx-next .km-content { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-slide.k-fx-reverse.k-fx-end .k-fx-next .km-content { -webkit-transform: translatex(0); -moz-transform: translatex(0); -ms-transform: translatex(0); -o-transform: translatex(0); transform: translatex(0); } .k-fx-slide.k-fx-reverse.k-fx-start .k-fx-current .km-header, .k-fx-slide.k-fx-reverse.k-fx-start .k-fx-current .km-footer { will-change: opacity; opacity: 1; } .k-fx-slide.k-fx-reverse.k-fx-start .k-fx-next .km-header, .k-fx-slide.k-fx-reverse.k-fx-start .k-fx-next .km-footer { opacity: 1; } .k-fx-slide.k-fx-reverse.k-fx-end .k-fx-current .km-header, .k-fx-slide.k-fx-reverse.k-fx-end .k-fx-current .km-footer { opacity: 0; } .k-fx-slide.k-fx-reverse.k-fx-end .k-fx-next .km-header, .k-fx-slide.k-fx-reverse.k-fx-end .k-fx-next .km-footer { opacity: 1; } .k-fx-slide.k-fx-right { /* right reverse */ } .k-fx-slide.k-fx-right.k-fx-start .k-fx-next .km-content { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-slide.k-fx-right.k-fx-end .k-fx-current .km-content { -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-slide.k-fx-right.k-fx-reverse.k-fx-start .k-fx-current .km-content { -webkit-transform: translatex(0); -moz-transform: translatex(0); -ms-transform: translatex(0); -o-transform: translatex(0); transform: translatex(0); } .k-fx-slide.k-fx-right.k-fx-reverse.k-fx-end .k-fx-current .km-content { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-slide.k-fx-right.k-fx-reverse.k-fx-start .k-fx-next .km-content { -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-slide.k-fx-right.k-fx-reverse.k-fx-end .k-fx-next .km-content { -webkit-transform: translatex(0%); -moz-transform: translatex(0%); -ms-transform: translatex(0%); -o-transform: translatex(0%); transform: translatex(0%); } /* Tile */ .k-fx-tile { /* left */ /* left reverse */ /* right */ } .k-fx-tile.k-fx-start .k-fx-next { will-change: transform; -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-tile.k-fx-end .k-fx-current { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-tile.k-fx-reverse.k-fx-start .k-fx-current { will-change: transform; -webkit-transform: translatex(0); -moz-transform: translatex(0); -ms-transform: translatex(0); -o-transform: translatex(0); transform: translatex(0); } .k-fx-tile.k-fx-reverse.k-fx-end .k-fx-current { -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-tile.k-fx-reverse.k-fx-start .k-fx-next { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-tile.k-fx-reverse.k-fx-end .k-fx-next { -webkit-transform: translatex(0); -moz-transform: translatex(0); -ms-transform: translatex(0); -o-transform: translatex(0); transform: translatex(0); } .k-fx-tile.k-fx-right { /* right reverse */ } .k-fx-tile.k-fx-right.k-fx-start .k-fx-next { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-tile.k-fx-right.k-fx-end .k-fx-current { -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-tile.k-fx-right.k-fx-reverse.k-fx-start .k-fx-current { -webkit-transform: translatex(0); -moz-transform: translatex(0); -ms-transform: translatex(0); -o-transform: translatex(0); transform: translatex(0); } .k-fx-tile.k-fx-right.k-fx-reverse.k-fx-end .k-fx-current { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-tile.k-fx-right.k-fx-reverse.k-fx-start .k-fx-next { -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-tile.k-fx-right.k-fx-reverse.k-fx-end .k-fx-next { -webkit-transform: translatex(0%); -moz-transform: translatex(0%); -ms-transform: translatex(0%); -o-transform: translatex(0%); transform: translatex(0%); } /* Tile */ .k-fx-tile { /* left */ /* left reverse */ /* right */ } .k-fx-tile.k-fx-start .k-fx-next { will-change: transform; -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-tile.k-fx-end .k-fx-current { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-tile.k-fx-reverse.k-fx-start .k-fx-current { will-change: transform; -webkit-transform: translatex(0); -moz-transform: translatex(0); -ms-transform: translatex(0); -o-transform: translatex(0); transform: translatex(0); } .k-fx-tile.k-fx-reverse.k-fx-end .k-fx-current { -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-tile.k-fx-reverse.k-fx-start .k-fx-next { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-tile.k-fx-reverse.k-fx-end .k-fx-next { -webkit-transform: translatex(0); -moz-transform: translatex(0); -ms-transform: translatex(0); -o-transform: translatex(0); transform: translatex(0); } .k-fx-tile.k-fx-right { /* right reverse */ } .k-fx-tile.k-fx-right.k-fx-start .k-fx-next { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-tile.k-fx-right.k-fx-end .k-fx-current { -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-tile.k-fx-right.k-fx-reverse.k-fx-start .k-fx-current { -webkit-transform: translatex(0); -moz-transform: translatex(0); -ms-transform: translatex(0); -o-transform: translatex(0); transform: translatex(0); } .k-fx-tile.k-fx-right.k-fx-reverse.k-fx-end .k-fx-current { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx-tile.k-fx-right.k-fx-reverse.k-fx-start .k-fx-next { -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx-tile.k-fx-right.k-fx-reverse.k-fx-end .k-fx-next { -webkit-transform: translatex(0%); -moz-transform: translatex(0%); -ms-transform: translatex(0%); -o-transform: translatex(0%); transform: translatex(0%); } /* Overlay */ .k-fx.k-fx-overlay.k-fx-start .k-fx-next, .k-fx.k-fx-overlay.k-fx-left.k-fx-start .k-fx-next { will-change: transform; -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx.k-fx-overlay.k-fx-right.k-fx-start .k-fx-next { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx.k-fx-overlay.k-fx-up.k-fx-start .k-fx-next { -webkit-transform: translatey(100%); -moz-transform: translatey(100%); -ms-transform: translatey(100%); -o-transform: translatey(100%); transform: translatey(100%); } .k-fx.k-fx-overlay.k-fx-down.k-fx-start .k-fx-next { -webkit-transform: translatey(-100%); -moz-transform: translatey(-100%); -ms-transform: translatey(-100%); -o-transform: translatey(-100%); transform: translatey(-100%); } .k-fx.k-fx-overlay.k-fx-reverse.k-fx-start .k-fx-next { -webkit-transform: none; -moz-transform: none; -ms-transform: none; -o-transform: none; transform: none; } .k-fx.k-fx-overlay.k-fx-reverse.k-fx-start .k-fx-current { will-change: transform; -webkit-transform: none; -moz-transform: none; -ms-transform: none; -o-transform: none; transform: none; } .k-fx.k-fx-overlay.k-fx-reverse.k-fx-end .k-fx-current, .k-fx.k-fx-overlay.k-fx-reverse.k-fx-left.k-fx-end .k-fx-current { -webkit-transform: translatex(100%); -moz-transform: translatex(100%); -ms-transform: translatex(100%); -o-transform: translatex(100%); transform: translatex(100%); } .k-fx.k-fx-overlay.k-fx-reverse.k-fx-right.k-fx-end .k-fx-current { -webkit-transform: translatex(-100%); -moz-transform: translatex(-100%); -ms-transform: translatex(-100%); -o-transform: translatex(-100%); transform: translatex(-100%); } .k-fx.k-fx-overlay.k-fx-reverse.k-fx-up.k-fx-end .k-fx-current { -webkit-transform: translatey(100%); -moz-transform: translatey(100%); -ms-transform: translatey(100%); -o-transform: translatey(100%); transform: translatey(100%); } .k-fx.k-fx-overlay.k-fx-reverse.k-fx-down.k-fx-end .k-fx-current { -webkit-transform: translatey(-100%); -moz-transform: translatey(-100%); -ms-transform: translatey(-100%); -o-transform: translatey(-100%); transform: translatey(-100%); } /* Default fonts for PDF export */ /* sans-serif */ @font-face { font-family: "DejaVu Sans"; src: url("fonts/DejaVu/DejaVuSans.ttf") format("truetype"); } @font-face { font-family: "DejaVu Sans"; font-weight: bold; src: url("fonts/DejaVu/DejaVuSans-Bold.ttf") format("truetype"); } @font-face { font-family: "DejaVu Sans"; font-style: italic; src: url("fonts/DejaVu/DejaVuSans-Oblique.ttf") format("truetype"); } @font-face { font-family: "DejaVu Sans"; font-weight: bold; font-style: italic; src: url("fonts/DejaVu/DejaVuSans-BoldOblique.ttf") format("truetype"); } /* serif */ @font-face { font-family: "DejaVu Serif"; src: url("fonts/DejaVu/DejaVuSerif.ttf") format("truetype"); } @font-face { font-family: "DejaVu Serif"; font-weight: bold; src: url("fonts/DejaVu/DejaVuSerif-Bold.ttf") format("truetype"); } @font-face { font-family: "DejaVu Serif"; font-style: italic; src: url("fonts/DejaVu/DejaVuSerif-Italic.ttf") format("truetype"); } @font-face { font-family: "DejaVu Serif"; font-weight: bold; font-style: italic; src: url("fonts/DejaVu/DejaVuSerif-BoldItalic.ttf") format("truetype"); } /* monospace */ @font-face { font-family: "DejaVu Mono"; src: url("fonts/DejaVu/DejaVuSansMono.ttf") format("truetype"); } @font-face { font-family: "DejaVu Mono"; font-weight: bold; src: url("fonts/DejaVu/DejaVuSansMono-Bold.ttf") format("truetype"); } @font-face { font-family: "DejaVu Mono"; font-style: italic; src: url("fonts/DejaVu/DejaVuSansMono-Oblique.ttf") format("truetype"); } @font-face { font-family: "DejaVu Mono"; font-weight: bold; font-style: italic; src: url("fonts/DejaVu/DejaVuSansMono-BoldOblique.ttf") format("truetype"); } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/Site.css ================================================ @charset "UTF-8"; body { /* padding-top: 60px; */ padding-bottom: 40px; } pre { background-color: #AAAAAA; border-color: #AAAAAA; } /* styles for validation helpers */ .field-validation-error { color: #b94a48; } .field-validation-valid { display: none; } input.input-validation-error { border: 1px solid #b94a48; } input[type="checkbox"].input-validation-error { border: 0 none; } .validation-summary-errors { color: #b94a48; } .validation-summary-valid { display: none; } /* override bootstrap styles */ .jumbotron { padding: 40px; padding-top: 20px; padding-bottom: 20px; margin-top: 20px; /* its buggy without it */ } .jumbotron h1 { color: #FFF; } @media (max-width: 767px) { .jumbotron h1 { font-size: 48px; } } .news-content { background-color: #FFF; border: 1px solid #000; border-radius: 20px; color: #000; margin-top: 20px; } .profile-info-label { display: inline; cursor: none; } .k-upload { display: inline-block; width: auto; } .test-file-dropdown { width: 100%; } .text-white { color: white; } .drop-down-width { width: 175px; } .full-editor { width: 100%; height: 30px; } .full-kendo-editor { width: 100%; } .form-control { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .hidden-file-upload { height: 0; width: 0; overflow: hidden; } .small-margin-top { margin-top: 10px; } .captcha-container input { line-height: normal !important; } /* Code mirror fix for the matrix theme */ .cm-s-the-matrix span.cm-builtin { color: #2A9FD6 !important; } /* Kendo */ .k-alt, .k-separator { background-color: #282828; } .k-state-selected { background-color: initial; } .width100percent { width: 100%; } .search-box { height: 32px; } .btn-search { padding: 4px 12px; } .search-form { line-height: 36px; } .btn-search-small { line-height: 48px; } @media (min-width: 991px) { .nav > li > a { padding: 15px 10px; } } @media (min-width: 768px) and (max-width: 991px) { .nav > li > a { padding: 15px 7px; } } .no-padding-right { padding-right: 0; } #cookies-notification { position: fixed !important; z-index: 99999998 !important; width: 100% !important; margin: 0; padding: 13px; display: block; bottom: 0; background-color: #000000; font-weight: bold; font-size: 16px; text-align: center; display: none; } #cookies-notification-button { color: #00AA00; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/bootstrap/bootstrap-theme-cyborg.css ================================================ @import url("//fonts.googleapis.com/css?family=Droid+Sans:400,700"); /*! * Bootstrap v3.0.0 * * Copyright 2013 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. */ /*! normalize.css v2.1.0 | MIT License | git.io/normalize */ article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } audio, canvas, video { display: inline-block; } audio:not([controls]) { display: none; height: 0; } [hidden] { display: none; } html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } a:focus { outline: thin dotted; } a:active, a:hover { outline: 0; } h1 { margin: 0.67em 0; font-size: 2em; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } hr { height: 0; -moz-box-sizing: content-box; box-sizing: content-box; } mark { color: #000; background: #ff0; } code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } pre { white-space: pre-wrap; } q { quotes: "\201C" "\201D" "\2018" "\2019"; } small { font-size: 80%; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 0; } fieldset { padding: 0.35em 0.625em 0.75em; margin: 0 2px; border: 1px solid #c0c0c0; } legend { padding: 0; border: 0; } button, input, select, textarea { margin: 0; font-family: inherit; font-size: 100%; } button, input { line-height: normal; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; } button[disabled], html input[disabled] { cursor: default; } input[type="checkbox"], input[type="radio"] { padding: 0; box-sizing: border-box; } input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } textarea { overflow: auto; vertical-align: top; } table { border-collapse: collapse; border-spacing: 0; } @media print { * { color: #000 !important; text-shadow: none !important; background: transparent !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } @page { margin: 2cm .5cm; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .table td, .table th { background-color: #fff !important; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } *, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 62.5%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Droid Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.428571429; color: #888888; background-color: #060606; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } button, input, select[multiple], textarea { background-image: none; } a { color: #2a9fd6; text-decoration: none; } a:hover, a:focus { color: #2a9fd6; text-decoration: underline; } a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } img { vertical-align: middle; } .img-responsive { display: block; height: auto; max-width: 100%; } .img-rounded { border-radius: 6px; } .img-thumbnail { display: inline-block; height: auto; max-width: 100%; padding: 4px; line-height: 1.428571429; background-color: #060606; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #282828; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16.099999999999998px; font-weight: 200; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small { font-size: 85%; } cite { font-style: normal; } .text-muted { color: #888888; } .text-primary { color: #2a9fd6; } .text-warning { color: #ffffff; } .text-danger { color: #ffffff; } .text-success { color: #ffffff; } .text-info { color: #ffffff; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: "Droid Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small { font-weight: normal; line-height: 1; color: #888888; } h1, h2, h3 { margin-top: 20px; margin-bottom: 10px; } h4, h5, h6 { margin-top: 10px; margin-bottom: 10px; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } h1 small, .h1 small { font-size: 24px; } h2 small, .h2 small { font-size: 18px; } h3 small, .h3 small, h4 small, .h4 small { font-size: 14px; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #282828; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-bottom: 20px; } dt, dd { line-height: 1.428571429; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 800px) { .dl-horizontal dt { float: left; width: 160px; overflow: hidden; clear: left; text-align: right; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #888888; } abbr.initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; border-left: 5px solid #282828; } blockquote p { font-size: 17.5px; font-weight: 300; line-height: 1.25; } blockquote p:last-child { margin-bottom: 0; } blockquote small { display: block; line-height: 1.428571429; color: #555555; } blockquote small:before { content: '\2014 \00A0'; } blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #282828; border-left: 0; } blockquote.pull-right p, blockquote.pull-right small { text-align: right; } blockquote.pull-right small:before { content: ''; } blockquote.pull-right small:after { content: '\00A0 \2014'; } q:before, q:after, blockquote:before, blockquote:after { content: ""; } address { display: block; margin-bottom: 20px; font-style: normal; line-height: 1.428571429; } code, pre { font-family: Monaco, Menlo, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; white-space: nowrap; background-color: #f9f2f4; border-radius: 4px; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.428571429; color: #282828; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px; } pre.prettyprint { margin-bottom: 20px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .row { margin-right: -15px; margin-left: -15px; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11 { float: left; } .col-xs-1 { width: 8.333333333333332%; } .col-xs-2 { width: 16.666666666666664%; } .col-xs-3 { width: 25%; } .col-xs-4 { width: 33.33333333333333%; } .col-xs-5 { width: 41.66666666666667%; } .col-xs-6 { width: 50%; } .col-xs-7 { width: 58.333333333333336%; } .col-xs-8 { width: 66.66666666666666%; } .col-xs-9 { width: 75%; } .col-xs-10 { width: 83.33333333333334%; } .col-xs-11 { width: 91.66666666666666%; } .col-xs-12 { width: 100%; } @media (min-width: 768px) { .container { max-width: 750px; } .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11 { float: left; } .col-sm-1 { width: 8.333333333333332%; } .col-sm-2 { width: 16.666666666666664%; } .col-sm-3 { width: 25%; } .col-sm-4 { width: 33.33333333333333%; } .col-sm-5 { width: 41.66666666666667%; } .col-sm-6 { width: 50%; } .col-sm-7 { width: 58.333333333333336%; } .col-sm-8 { width: 66.66666666666666%; } .col-sm-9 { width: 75%; } .col-sm-10 { width: 83.33333333333334%; } .col-sm-11 { width: 91.66666666666666%; } .col-sm-12 { width: 100%; } .col-sm-push-1 { left: 8.333333333333332%; } .col-sm-push-2 { left: 16.666666666666664%; } .col-sm-push-3 { left: 25%; } .col-sm-push-4 { left: 33.33333333333333%; } .col-sm-push-5 { left: 41.66666666666667%; } .col-sm-push-6 { left: 50%; } .col-sm-push-7 { left: 58.333333333333336%; } .col-sm-push-8 { left: 66.66666666666666%; } .col-sm-push-9 { left: 75%; } .col-sm-push-10 { left: 83.33333333333334%; } .col-sm-push-11 { left: 91.66666666666666%; } .col-sm-pull-1 { right: 8.333333333333332%; } .col-sm-pull-2 { right: 16.666666666666664%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-4 { right: 33.33333333333333%; } .col-sm-pull-5 { right: 41.66666666666667%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-7 { right: 58.333333333333336%; } .col-sm-pull-8 { right: 66.66666666666666%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-10 { right: 83.33333333333334%; } .col-sm-pull-11 { right: 91.66666666666666%; } .col-sm-offset-1 { margin-left: 8.333333333333332%; } .col-sm-offset-2 { margin-left: 16.666666666666664%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-4 { margin-left: 33.33333333333333%; } .col-sm-offset-5 { margin-left: 41.66666666666667%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-7 { margin-left: 58.333333333333336%; } .col-sm-offset-8 { margin-left: 66.66666666666666%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-10 { margin-left: 83.33333333333334%; } .col-sm-offset-11 { margin-left: 91.66666666666666%; } } @media (min-width: 992px) { .container { max-width: 970px; } .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11 { float: left; } .col-md-1 { width: 8.333333333333332%; } .col-md-2 { width: 16.666666666666664%; } .col-md-3 { width: 25%; } .col-md-4 { width: 33.33333333333333%; } .col-md-5 { width: 41.66666666666667%; } .col-md-6 { width: 50%; } .col-md-7 { width: 58.333333333333336%; } .col-md-8 { width: 66.66666666666666%; } .col-md-9 { width: 75%; } .col-md-10 { width: 83.33333333333334%; } .col-md-11 { width: 91.66666666666666%; } .col-md-12 { width: 100%; } .col-md-push-0 { left: auto; } .col-md-push-1 { left: 8.333333333333332%; } .col-md-push-2 { left: 16.666666666666664%; } .col-md-push-3 { left: 25%; } .col-md-push-4 { left: 33.33333333333333%; } .col-md-push-5 { left: 41.66666666666667%; } .col-md-push-6 { left: 50%; } .col-md-push-7 { left: 58.333333333333336%; } .col-md-push-8 { left: 66.66666666666666%; } .col-md-push-9 { left: 75%; } .col-md-push-10 { left: 83.33333333333334%; } .col-md-push-11 { left: 91.66666666666666%; } .col-md-pull-0 { right: auto; } .col-md-pull-1 { right: 8.333333333333332%; } .col-md-pull-2 { right: 16.666666666666664%; } .col-md-pull-3 { right: 25%; } .col-md-pull-4 { right: 33.33333333333333%; } .col-md-pull-5 { right: 41.66666666666667%; } .col-md-pull-6 { right: 50%; } .col-md-pull-7 { right: 58.333333333333336%; } .col-md-pull-8 { right: 66.66666666666666%; } .col-md-pull-9 { right: 75%; } .col-md-pull-10 { right: 83.33333333333334%; } .col-md-pull-11 { right: 91.66666666666666%; } .col-md-offset-0 { margin-left: 0; } .col-md-offset-1 { margin-left: 8.333333333333332%; } .col-md-offset-2 { margin-left: 16.666666666666664%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-4 { margin-left: 33.33333333333333%; } .col-md-offset-5 { margin-left: 41.66666666666667%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-7 { margin-left: 58.333333333333336%; } .col-md-offset-8 { margin-left: 66.66666666666666%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-10 { margin-left: 83.33333333333334%; } .col-md-offset-11 { margin-left: 91.66666666666666%; } } @media (min-width: 1200px) { .container { max-width: 1170px; } .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11 { float: left; } .col-lg-1 { width: 8.333333333333332%; } .col-lg-2 { width: 16.666666666666664%; } .col-lg-3 { width: 25%; } .col-lg-4 { width: 33.33333333333333%; } .col-lg-5 { width: 41.66666666666667%; } .col-lg-6 { width: 50%; } .col-lg-7 { width: 58.333333333333336%; } .col-lg-8 { width: 66.66666666666666%; } .col-lg-9 { width: 75%; } .col-lg-10 { width: 83.33333333333334%; } .col-lg-11 { width: 91.66666666666666%; } .col-lg-12 { width: 100%; } .col-lg-push-0 { left: auto; } .col-lg-push-1 { left: 8.333333333333332%; } .col-lg-push-2 { left: 16.666666666666664%; } .col-lg-push-3 { left: 25%; } .col-lg-push-4 { left: 33.33333333333333%; } .col-lg-push-5 { left: 41.66666666666667%; } .col-lg-push-6 { left: 50%; } .col-lg-push-7 { left: 58.333333333333336%; } .col-lg-push-8 { left: 66.66666666666666%; } .col-lg-push-9 { left: 75%; } .col-lg-push-10 { left: 83.33333333333334%; } .col-lg-push-11 { left: 91.66666666666666%; } .col-lg-pull-0 { right: auto; } .col-lg-pull-1 { right: 8.333333333333332%; } .col-lg-pull-2 { right: 16.666666666666664%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-4 { right: 33.33333333333333%; } .col-lg-pull-5 { right: 41.66666666666667%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-7 { right: 58.333333333333336%; } .col-lg-pull-8 { right: 66.66666666666666%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-10 { right: 83.33333333333334%; } .col-lg-pull-11 { right: 91.66666666666666%; } .col-lg-offset-0 { margin-left: 0; } .col-lg-offset-1 { margin-left: 8.333333333333332%; } .col-lg-offset-2 { margin-left: 16.666666666666664%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-4 { margin-left: 33.33333333333333%; } .col-lg-offset-5 { margin-left: 41.66666666666667%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-7 { margin-left: 58.333333333333336%; } .col-lg-offset-8 { margin-left: 66.66666666666666%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-10 { margin-left: 83.33333333333334%; } .col-lg-offset-11 { margin-left: 91.66666666666666%; } } table { max-width: 100%; background-color: #181818; } th { text-align: left; } .table { width: 100%; margin-bottom: 20px; } .table thead > tr > th, .table tbody > tr > th, .table tfoot > tr > th, .table thead > tr > td, .table tbody > tr > td, .table tfoot > tr > td { padding: 8px; line-height: 1.428571429; vertical-align: top; border-top: 1px solid #282828; } .table thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #282828; } .table caption + thead tr:first-child th, .table colgroup + thead tr:first-child th, .table thead:first-child tr:first-child th, .table caption + thead tr:first-child td, .table colgroup + thead tr:first-child td, .table thead:first-child tr:first-child td { border-top: 0; } .table tbody + tbody { border-top: 2px solid #282828; } .table .table { background-color: #060606; } .table-condensed thead > tr > th, .table-condensed tbody > tr > th, .table-condensed tfoot > tr > th, .table-condensed thead > tr > td, .table-condensed tbody > tr > td, .table-condensed tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #282828; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #282828; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-child(odd) > td, .table-striped > tbody > tr:nth-child(odd) > th { background-color: #080808; } .table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th { background-color: #282828; } table col[class*="col-"] { display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { display: table-cell; float: none; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #282828; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #77b300; border-color: #809a00; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td { background-color: #669a00; border-color: #6a8000; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #cc0000; border-color: #bd001f; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td { background-color: #b30000; border-color: #a3001b; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #ff8800; border-color: #f05800; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td { background-color: #e67a00; border-color: #d64f00; } @media (max-width: 768px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-x: scroll; overflow-y: hidden; border: 1px solid #282828; } .table-responsive > .table { margin-bottom: 0; background-color: #fff; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > thead > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > thead > tr:last-child > td, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #888888; border: 0; border-bottom: 1px solid #282828; } label { display: inline-block; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; /* IE8-9 */ line-height: normal; } input[type="file"] { display: block; } select[multiple], select[size] { height: auto; } select optgroup { font-family: inherit; font-size: inherit; font-style: inherit; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { height: auto; } .form-control:-moz-placeholder { color: #888888; } .form-control::-moz-placeholder { color: #888888; } .form-control:-ms-input-placeholder { color: #888888; } .form-control::-webkit-input-placeholder { color: #888888; } .form-control { display: block; width: 100%; height: 38px; padding: 8px 12px; font-size: 14px; line-height: 1.428571429; color: #888888; vertical-align: middle; background-color: #ffffff; border: 1px solid #282828; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { cursor: not-allowed; background-color: #adafae; } textarea.form-control { height: auto; } .form-group { margin-bottom: 15px; } .radio, .checkbox { display: block; min-height: 20px; padding-left: 20px; margin-top: 10px; margin-bottom: 10px; vertical-align: middle; } .radio label, .checkbox label { display: inline; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], .radio[disabled], .radio-inline[disabled], .checkbox[disabled], .checkbox-inline[disabled], fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"], fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm { height: auto; } .input-lg { height: 56px; padding: 14px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-lg { height: 56px; line-height: 56px; } textarea.input-lg { height: auto; } .has-warning .help-block, .has-warning .control-label { color: #ffffff; } .has-warning .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-warning .input-group-addon { color: #ffffff; background-color: #ff8800; border-color: #ffffff; } .has-error .help-block, .has-error .control-label { color: #ffffff; } .has-error .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-error .input-group-addon { color: #ffffff; background-color: #cc0000; border-color: #ffffff; } .has-success .help-block, .has-success .control-label { color: #ffffff; } .has-success .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-success .input-group-addon { color: #ffffff; background-color: #77b300; border-color: #ffffff; } .form-control-static { padding-top: 9px; margin-bottom: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #c8c8c8; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; } .form-inline .radio, .form-inline .checkbox { display: inline-block; padding-left: 0; margin-top: 0; margin-bottom: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 9px; margin-top: 0; margin-bottom: 0; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; } } .btn { display: inline-block; padding: 8px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; line-height: 1.428571429; text-align: center; white-space: nowrap; vertical-align: middle; cursor: pointer; border: 1px solid transparent; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; } .btn:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus { color: #ffffff; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { pointer-events: none; cursor: not-allowed; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } .btn-default { color: #ffffff; background-color: #424242; border-color: #424242; } .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { color: #ffffff; background-color: #2d2d2d; border-color: #232323; } .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #424242; border-color: #424242; } .btn-primary { color: #ffffff; background-color: #2a9fd6; border-color: #2a9fd6; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { color: #ffffff; background-color: #2386b4; border-color: #1f79a3; } .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #2a9fd6; border-color: #2a9fd6; } .btn-warning { color: #ffffff; background-color: #ff8800; border-color: #ff8800; } .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { color: #ffffff; background-color: #d67200; border-color: #c26700; } .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #ff8800; border-color: #ff8800; } .btn-danger { color: #ffffff; background-color: #cc0000; border-color: #cc0000; } .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { color: #ffffff; background-color: #a30000; border-color: #8f0000; } .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #cc0000; border-color: #cc0000; } .btn-success { color: #ffffff; background-color: #77b300; border-color: #77b300; } .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { color: #ffffff; background-color: #5c8a00; border-color: #4e7600; } .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #77b300; border-color: #77b300; } .btn-info { color: #ffffff; background-color: #9933cc; border-color: #9933cc; } .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { color: #ffffff; background-color: #812bab; border-color: #74279b; } .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #9933cc; border-color: #9933cc; } .btn-link { font-weight: normal; color: #2a9fd6; cursor: pointer; border-radius: 0; } .btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #2a9fd6; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #888888; text-decoration: none; } .btn-lg { padding: 14px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-sm, .btn-xs { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs { padding: 1px 5px; } .btn-block { display: block; width: 100%; padding-right: 0; padding-left: 0; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition: height 0.35s ease; transition: height 0.35s ease; } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; -webkit-font-smoothing: antialiased; font-style: normal; font-weight: normal; line-height: 1; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-briefcase:before { content: "\1f4bc"; } .glyphicon-calendar:before { content: "\1f4c5"; } .glyphicon-pushpin:before { content: "\1f4cc"; } .glyphicon-paperclip:before { content: "\1f4ce"; } .glyphicon-camera:before { content: "\1f4f7"; } .glyphicon-lock:before { content: "\1f512"; } .glyphicon-bell:before { content: "\1f514"; } .glyphicon-bookmark:before { content: "\1f516"; } .glyphicon-fire:before { content: "\1f525"; } .glyphicon-wrench:before { content: "\1f527"; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px solid #000000; border-right: 4px solid transparent; border-bottom: 0 dotted; border-left: 4px solid transparent; content: ""; } .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; list-style: none; background-color: #222222; border: 1px solid #444444; border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: rgba(255, 255, 255, 0.1); } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.428571429; color: #ffffff; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #ffffff; text-decoration: none; background-color: #2a9fd6; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; background-color: #2a9fd6; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #888888; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.428571429; color: #888888; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0 dotted; border-bottom: 4px solid #000000; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } } .btn-default .caret { border-top-color: #ffffff; } .btn-primary .caret, .btn-success .caret, .btn-warning .caret, .btn-danger .caret, .btn-info .caret { border-top-color: #fff; } .dropup .btn-default .caret { border-bottom-color: #ffffff; } .dropup .btn-primary .caret, .dropup .btn-success .caret, .dropup .btn-warning .caret, .dropup .btn-danger .caret, .dropup .btn-info .caret { border-bottom-color: #fff; } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group > .btn:focus, .btn-group-vertical > .btn:focus { outline: none; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar .btn-group { float: left; } .btn-toolbar > .btn + .btn, .btn-toolbar > .btn-group + .btn, .btn-toolbar > .btn + .btn-group, .btn-toolbar > .btn-group + .btn-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child > .btn:last-child, .btn-group > .btn-group:first-child > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group-xs > .btn { padding: 5px 10px; padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-group-lg > .btn { padding: 14px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-right-radius: 0; border-bottom-left-radius: 4px; border-top-left-radius: 0; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child > .btn:last-child, .btn-group-vertical > .btn-group:first-child > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; border-collapse: separate; table-layout: fixed; } .btn-group-justified .btn { display: table-cell; float: none; width: 1%; } [data-toggle="buttons"] > .btn > input[type="radio"], [data-toggle="buttons"] > .btn > input[type="checkbox"] { display: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group.col { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 56px; padding: 14px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 56px; line-height: 56px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 8px 12px; font-size: 14px; font-weight: normal; line-height: 1; text-align: center; background-color: #adafae; border: 1px solid #282828; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 14px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -4px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:active { z-index: 2; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #222222; } .nav > li.disabled > a { color: #888888; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #888888; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #222222; border-color: #2a9fd6; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #282828; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.428571429; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: transparent transparent #282828; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #ffffff; cursor: default; background-color: #2a9fd6; border: 1px solid #282828; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { text-align: center; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-bottom: 1px solid #dddddd; } .nav-tabs.nav-justified > .active > a { border-bottom-color: #060606; } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 5px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #ffffff; background-color: #2a9fd6; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { text-align: center; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-bottom: 1px solid #dddddd; } .nav-tabs-justified > .active > a { border-bottom-color: #060606; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tab-content > .tab-pane, .pill-content > .pill-pane { display: none; } .tab-content > .active, .pill-content > .active { display: block; } .nav .caret { border-top-color: #2a9fd6; border-bottom-color: #2a9fd6; } .nav a:hover .caret { border-top-color: #2a9fd6; border-bottom-color: #2a9fd6; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; z-index: 1000; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { max-height: 340px; padding-right: 15px; padding-left: 15px; overflow-x: visible; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-collapse .navbar-nav.navbar-left:first-child { margin-left: -15px; } .navbar-collapse .navbar-nav.navbar-right:last-child { margin-right: -15px; } .navbar-collapse .navbar-text:last-child { margin-right: 0; } } .container > .navbar-header, .container > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; z-index: 1030; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; } .navbar-brand { float: left; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } @media (min-width: 768px) { .navbar > .container .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-top: 8px; margin-right: 15px; margin-bottom: 8px; background-color: transparent; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; } } .navbar-form { padding: 10px 15px; margin-top: 6px; margin-right: -15px; margin-bottom: 6px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; padding-left: 0; margin-top: 0; margin-bottom: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-nav.pull-right > li > .dropdown-menu, .navbar-nav > li > .dropdown-menu.pull-right { right: 0; left: auto; } .navbar-btn { margin-top: 6px; margin-bottom: 6px; } .navbar-text { float: left; margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { margin-right: 15px; margin-left: 15px; } } .navbar-default { background-color: #060606; border-color: #000000; } .navbar-default .navbar-brand { color: #ffffff; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-text { color: #888888; } .navbar-default .navbar-nav > li > a { color: #888888; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #888888; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #282828; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #282828; } .navbar-default .navbar-toggle .icon-bar { background-color: #cccccc; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #000000; } .navbar-default .navbar-nav > .dropdown > a:hover .caret, .navbar-default .navbar-nav > .dropdown > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav > .open > a .caret, .navbar-default .navbar-nav > .open > a:hover .caret, .navbar-default .navbar-nav > .open > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-default .navbar-nav > .dropdown > a .caret { border-top-color: #888888; border-bottom-color: #888888; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #888888; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #888888; background-color: transparent; } } .navbar-default .navbar-link { color: #888888; } .navbar-default .navbar-link:hover { color: #ffffff; } .navbar-inverse { background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #ffffff; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { color: #888888; } .navbar-inverse .navbar-nav > li > a { color: #888888; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #aaaaaa; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .dropdown > a:hover .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-inverse .navbar-nav > .dropdown > a .caret { border-top-color: #888888; border-bottom-color: #888888; } .navbar-inverse .navbar-nav > .open > a .caret, .navbar-inverse .navbar-nav > .open > a:hover .caret, .navbar-inverse .navbar-nav > .open > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #888888; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #aaaaaa; background-color: transparent; } } .navbar-inverse .navbar-link { color: #888888; } .navbar-inverse .navbar-link:hover { color: #ffffff; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #222222; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #ffffff; content: "/\00a0"; } .breadcrumb > .active { color: #888888; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 8px 12px; margin-left: -1px; line-height: 1.428571429; text-decoration: none; background-color: #222222; border: 1px solid #282828; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 4px; border-top-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { background-color: #adafae; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #ffffff; cursor: default; background-color: #2a9fd6; border-color: #2a9fd6; } .pagination > .disabled > span, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #888888; cursor: not-allowed; background-color: #222222; border-color: #282828; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 14px 16px; font-size: 18px; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 6px; border-top-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #222222; border: 1px solid #282828; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #adafae; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #888888; cursor: not-allowed; background-color: #222222; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } .label[href]:hover, .label[href]:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .label-default { background-color: #424242; } .label-default[href]:hover, .label-default[href]:focus { background-color: #282828; } .label-primary { background-color: #2a9fd6; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #2180ac; } .label-success { background-color: #77b300; } .label-success[href]:hover, .label-success[href]:focus { background-color: #558000; } .label-info { background-color: #9933cc; } .label-info[href]:hover, .label-info[href]:focus { background-color: #7a29a3; } .label-warning { background-color: #ff8800; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #cc6d00; } .label-danger { background-color: #cc0000; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #990000; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; background-color: #2a9fd6; border-radius: 10px; } .badge:empty { display: none; } a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .btn .badge { position: relative; top: -1px; } a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #2a9fd6; background-color: #ffffff; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding: 30px; margin-bottom: 30px; font-size: 21px; font-weight: 200; line-height: 2.1428571435; color: inherit; background-color: #151515; } .jumbotron h1 { line-height: 1; color: inherit; } .jumbotron p { line-height: 1.4; } .container .jumbotron { border-radius: 6px; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1 { font-size: 63px; } } .thumbnail { display: inline-block; display: block; height: auto; max-width: 100%; padding: 4px; line-height: 1.428571429; background-color: #060606; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .thumbnail > img { display: block; height: auto; max-width: 100%; } a.thumbnail:hover, a.thumbnail:focus { border-color: #2a9fd6; } .thumbnail > img { margin-right: auto; margin-left: auto; } .thumbnail .caption { padding: 9px; color: #888888; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable { padding-right: 35px; } .alert-dismissable .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #ffffff; background-color: #77b300; border-color: #809a00; } .alert-success hr { border-top-color: #6a8000; } .alert-success .alert-link { color: #e6e6e6; } .alert-info { color: #ffffff; background-color: #9933cc; border-color: #6e2caf; } .alert-info hr { border-top-color: #61279b; } .alert-info .alert-link { color: #e6e6e6; } .alert-warning { color: #ffffff; background-color: #ff8800; border-color: #f05800; } .alert-warning hr { border-top-color: #d64f00; } .alert-warning .alert-link { color: #e6e6e6; } .alert-danger { color: #ffffff; background-color: #cc0000; border-color: #bd001f; } .alert-danger hr { border-top-color: #a3001b; } .alert-danger .alert-link { color: #e6e6e6; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-moz-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #222222; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0; height: 100%; font-size: 12px; color: #ffffff; text-align: center; background-color: #2a9fd6; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; } .progress.active .progress-bar { -webkit-animation: progress-bar-stripes 2s linear infinite; -moz-animation: progress-bar-stripes 2s linear infinite; -ms-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #77b300; } .progress-striped .progress-bar-success { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #9933cc; } .progress-striped .progress-bar-info { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #ff8800; } .progress-striped .progress-bar-warning { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #cc0000; } .progress-striped .progress-bar-danger { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .media, .media-body { overflow: hidden; zoom: 1; } .media, .media .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media-object { display: block; } .media-heading { margin: 0 0 5px; } .media > .pull-left { margin-right: 10px; } .media > .pull-right { margin-left: 10px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #222222; border: 1px solid #282828; } .list-group-item:first-child { border-top-right-radius: 4px; border-top-left-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } a.list-group-item { color: #888888; } a.list-group-item .list-group-item-heading { color: #ffffff; } a.list-group-item:hover, a.list-group-item:focus { text-decoration: none; background-color: #484848; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #2a9fd6; border-color: #2a9fd6; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #d5ecf7; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #222222; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item { border-width: 1px 0; } .panel > .list-group .list-group-item:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .panel > .list-group .list-group-item:last-child { border-bottom: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .panel > .table { margin-bottom: 0; } .panel > .panel-body + .table { border-top: 1px solid #282828; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; } .panel-title > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #3c3c3c; border-top: 1px solid #282828; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel-group .panel { margin-bottom: 0; overflow: hidden; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse .panel-body { border-top: 1px solid #282828; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #282828; } .panel-default { border-color: #282828; } .panel-default > .panel-heading { color: #282828; background-color: #3c3c3c; border-color: #282828; } .panel-default > .panel-heading + .panel-collapse .panel-body { border-top-color: #282828; } .panel-default > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #282828; } .panel-primary { border-color: #2a9fd6; } .panel-primary > .panel-heading { color: #ffffff; background-color: #2a9fd6; border-color: #2a9fd6; } .panel-primary > .panel-heading + .panel-collapse .panel-body { border-top-color: #2a9fd6; } .panel-primary > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #2a9fd6; } .panel-success { border-color: #809a00; } .panel-success > .panel-heading { color: #ffffff; background-color: #77b300; border-color: #809a00; } .panel-success > .panel-heading + .panel-collapse .panel-body { border-top-color: #809a00; } .panel-success > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #809a00; } .panel-warning { border-color: #f05800; } .panel-warning > .panel-heading { color: #ffffff; background-color: #ff8800; border-color: #f05800; } .panel-warning > .panel-heading + .panel-collapse .panel-body { border-top-color: #f05800; } .panel-warning > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #f05800; } .panel-danger { border-color: #bd001f; } .panel-danger > .panel-heading { color: #ffffff; background-color: #cc0000; border-color: #bd001f; } .panel-danger > .panel-heading + .panel-collapse .panel-body { border-top-color: #bd001f; } .panel-danger > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #bd001f; } .panel-info { border-color: #6e2caf; } .panel-info > .panel-heading { color: #ffffff; background-color: #9933cc; border-color: #6e2caf; } .panel-info > .panel-heading + .panel-collapse .panel-body { border-top-color: #6e2caf; } .panel-info > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #6e2caf; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #151515; border: 1px solid #030303; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } body.modal-open, .modal-open .navbar-fixed-top, .modal-open .navbar-fixed-bottom { margin-right: 15px; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; display: none; overflow: auto; overflow-y: scroll; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0); } .modal-dialog { z-index: 1050; width: auto; padding: 10px; margin-right: auto; margin-left: auto; } .modal-content { position: relative; background-color: #202020; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; outline: none; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1030; background-color: #000000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { min-height: 16.428571429px; padding: 15px; border-bottom: 1px solid #282828; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.428571429; } .modal-body { position: relative; padding: 20px; } .modal-footer { padding: 19px 20px 20px; margin-top: 15px; text-align: right; border-top: 1px solid #282828; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } @media screen and (min-width: 768px) { .modal-dialog { right: auto; left: 50%; width: 600px; padding-top: 30px; padding-bottom: 30px; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } } .tooltip { position: absolute; z-index: 1030; display: block; font-size: 12px; line-height: 1.4; opacity: 0; filter: alpha(opacity=0); visibility: visible; } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: rgba(0, 0, 0, 0.9); border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-top-color: rgba(0, 0, 0, 0.9); border-width: 5px 5px 0; } .tooltip.top-left .tooltip-arrow { bottom: 0; left: 5px; border-top-color: rgba(0, 0, 0, 0.9); border-width: 5px 5px 0; } .tooltip.top-right .tooltip-arrow { right: 5px; bottom: 0; border-top-color: rgba(0, 0, 0, 0.9); border-width: 5px 5px 0; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-right-color: rgba(0, 0, 0, 0.9); border-width: 5px 5px 5px 0; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-left-color: rgba(0, 0, 0, 0.9); border-width: 5px 0 5px 5px; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-bottom-color: rgba(0, 0, 0, 0.9); border-width: 0 5px 5px; } .tooltip.bottom-left .tooltip-arrow { top: 0; left: 5px; border-bottom-color: rgba(0, 0, 0, 0.9); border-width: 0 5px 5px; } .tooltip.bottom-right .tooltip-arrow { top: 0; right: 5px; border-bottom-color: rgba(0, 0, 0, 0.9); border-width: 0 5px 5px; } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; max-width: 276px; padding: 1px; text-align: left; white-space: normal; background-color: #202020; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); background-clip: padding-box; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; font-weight: normal; line-height: 18px; background-color: #181818; border-bottom: 1px solid #0b0b0b; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover .arrow, .popover .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover .arrow { border-width: 11px; } .popover .arrow:after { border-width: 10px; content: ""; } .popover.top .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); border-bottom-width: 0; } .popover.top .arrow:after { bottom: 1px; margin-left: -10px; border-top-color: #202020; border-bottom-width: 0; content: " "; } .popover.right .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); border-left-width: 0; } .popover.right .arrow:after { bottom: -10px; left: 1px; border-right-color: #202020; border-left-width: 0; content: " "; } .popover.bottom .arrow { top: -11px; left: 50%; margin-left: -11px; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); border-top-width: 0; } .popover.bottom .arrow:after { top: 1px; margin-left: -10px; border-bottom-color: #202020; border-top-width: 0; content: " "; } .popover.left .arrow { top: 50%; right: -11px; margin-top: -11px; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); border-right-width: 0; } .popover.left .arrow:after { right: 1px; bottom: -10px; border-left-color: #202020; border-right-width: 0; content: " "; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; height: auto; max-width: 100%; line-height: 1; } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); opacity: 0.5; filter: alpha(opacity=50); } .carousel-control.left { background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { right: 0; left: auto; background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; left: 50%; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; margin-top: -10px; margin-left: -10px; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; border: 1px solid #ffffff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #ffffff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; margin-left: -15px; font-size: 30px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .affix { position: fixed; } @-ms-viewport { width: device-width; } @media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } } .hidden { display: none !important; visibility: hidden !important; } .visible-xs { display: none !important; } tr.visible-xs { display: none !important; } th.visible-xs, td.visible-xs { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-xs.visible-sm { display: block !important; } tr.visible-xs.visible-sm { display: table-row !important; } th.visible-xs.visible-sm, td.visible-xs.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-xs.visible-md { display: block !important; } tr.visible-xs.visible-md { display: table-row !important; } th.visible-xs.visible-md, td.visible-xs.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-xs.visible-lg { display: block !important; } tr.visible-xs.visible-lg { display: table-row !important; } th.visible-xs.visible-lg, td.visible-xs.visible-lg { display: table-cell !important; } } .visible-sm { display: none !important; } tr.visible-sm { display: none !important; } th.visible-sm, td.visible-sm { display: none !important; } @media (max-width: 767px) { .visible-sm.visible-xs { display: block !important; } tr.visible-sm.visible-xs { display: table-row !important; } th.visible-sm.visible-xs, td.visible-sm.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-sm.visible-md { display: block !important; } tr.visible-sm.visible-md { display: table-row !important; } th.visible-sm.visible-md, td.visible-sm.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-sm.visible-lg { display: block !important; } tr.visible-sm.visible-lg { display: table-row !important; } th.visible-sm.visible-lg, td.visible-sm.visible-lg { display: table-cell !important; } } .visible-md { display: none !important; } tr.visible-md { display: none !important; } th.visible-md, td.visible-md { display: none !important; } @media (max-width: 767px) { .visible-md.visible-xs { display: block !important; } tr.visible-md.visible-xs { display: table-row !important; } th.visible-md.visible-xs, td.visible-md.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-md.visible-sm { display: block !important; } tr.visible-md.visible-sm { display: table-row !important; } th.visible-md.visible-sm, td.visible-md.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-md.visible-lg { display: block !important; } tr.visible-md.visible-lg { display: table-row !important; } th.visible-md.visible-lg, td.visible-md.visible-lg { display: table-cell !important; } } .visible-lg { display: none !important; } tr.visible-lg { display: none !important; } th.visible-lg, td.visible-lg { display: none !important; } @media (max-width: 767px) { .visible-lg.visible-xs { display: block !important; } tr.visible-lg.visible-xs { display: table-row !important; } th.visible-lg.visible-xs, td.visible-lg.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-lg.visible-sm { display: block !important; } tr.visible-lg.visible-sm { display: table-row !important; } th.visible-lg.visible-sm, td.visible-lg.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-lg.visible-md { display: block !important; } tr.visible-lg.visible-md { display: table-row !important; } th.visible-lg.visible-md, td.visible-lg.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } .hidden-xs { display: block !important; } tr.hidden-xs { display: table-row !important; } th.hidden-xs, td.hidden-xs { display: table-cell !important; } @media (max-width: 767px) { .hidden-xs { display: none !important; } tr.hidden-xs { display: none !important; } th.hidden-xs, td.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-xs.hidden-sm { display: none !important; } tr.hidden-xs.hidden-sm { display: none !important; } th.hidden-xs.hidden-sm, td.hidden-xs.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-xs.hidden-md { display: none !important; } tr.hidden-xs.hidden-md { display: none !important; } th.hidden-xs.hidden-md, td.hidden-xs.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-xs.hidden-lg { display: none !important; } tr.hidden-xs.hidden-lg { display: none !important; } th.hidden-xs.hidden-lg, td.hidden-xs.hidden-lg { display: none !important; } } .hidden-sm { display: block !important; } tr.hidden-sm { display: table-row !important; } th.hidden-sm, td.hidden-sm { display: table-cell !important; } @media (max-width: 767px) { .hidden-sm.hidden-xs { display: none !important; } tr.hidden-sm.hidden-xs { display: none !important; } th.hidden-sm.hidden-xs, td.hidden-sm.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } tr.hidden-sm { display: none !important; } th.hidden-sm, td.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-sm.hidden-md { display: none !important; } tr.hidden-sm.hidden-md { display: none !important; } th.hidden-sm.hidden-md, td.hidden-sm.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-sm.hidden-lg { display: none !important; } tr.hidden-sm.hidden-lg { display: none !important; } th.hidden-sm.hidden-lg, td.hidden-sm.hidden-lg { display: none !important; } } .hidden-md { display: block !important; } tr.hidden-md { display: table-row !important; } th.hidden-md, td.hidden-md { display: table-cell !important; } @media (max-width: 767px) { .hidden-md.hidden-xs { display: none !important; } tr.hidden-md.hidden-xs { display: none !important; } th.hidden-md.hidden-xs, td.hidden-md.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-md.hidden-sm { display: none !important; } tr.hidden-md.hidden-sm { display: none !important; } th.hidden-md.hidden-sm, td.hidden-md.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } tr.hidden-md { display: none !important; } th.hidden-md, td.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-md.hidden-lg { display: none !important; } tr.hidden-md.hidden-lg { display: none !important; } th.hidden-md.hidden-lg, td.hidden-md.hidden-lg { display: none !important; } } .hidden-lg { display: block !important; } tr.hidden-lg { display: table-row !important; } th.hidden-lg, td.hidden-lg { display: table-cell !important; } @media (max-width: 767px) { .hidden-lg.hidden-xs { display: none !important; } tr.hidden-lg.hidden-xs { display: none !important; } th.hidden-lg.hidden-xs, td.hidden-lg.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-lg.hidden-sm { display: none !important; } tr.hidden-lg.hidden-sm { display: none !important; } th.hidden-lg.hidden-sm, td.hidden-lg.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-lg.hidden-md { display: none !important; } tr.hidden-lg.hidden-md { display: none !important; } th.hidden-lg.hidden-md, td.hidden-lg.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } tr.hidden-lg { display: none !important; } th.hidden-lg, td.hidden-lg { display: none !important; } } .visible-print { display: none !important; } tr.visible-print { display: none !important; } th.visible-print, td.visible-print { display: none !important; } @media print { .visible-print { display: block !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } .hidden-print { display: none !important; } tr.hidden-print { display: none !important; } th.hidden-print, td.hidden-print { display: none !important; } } .navbar { border-bottom: 1px solid #282828; } h1, h2, h3, h4, h5, h6 { color: #fff; } .text-primary { color: #2a9fd6; } .text-success { color: #77b300; } .text-danger { color: #cc0000; } .text-warning { color: #ff8800; } .text-info { color: #9933cc; } .table tr.success, .table tr.warning, .table tr.danger { color: #fff; } .has-warning .help-block, .has-warning .control-label { color: #ff8800; } .has-warning .form-control, .has-warning .form-control:focus { border-color: #ff8800; } .has-error .help-block, .has-error .control-label { color: #cc0000; } .has-error .form-control, .has-error .form-control:focus { border-color: #cc0000; } .has-success .help-block, .has-success .control-label { color: #77b300; } .has-success .form-control, .has-success .form-control:focus { border-color: #77b300; } legend { color: #fff; } .input-group-addon { background-color: #424242; } .nav .caret, .nav a:hover .caret { border-top-color: #fff; border-bottom-color: #fff; } .nav-tabs a, .nav-pills a, .breadcrumb a, .pagination a, .pager a { color: #fff; } .alert .alert-link, .alert a { color: #ffffff; text-decoration: underline; } .jumbotron h1, .jumbotron h2, .jumbotron h3, .jumbotron h4, .jumbotron h5, .jumbotron h6 { color: #fff; } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .affix { position: fixed; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/bootstrap/bootstrap-theme.css ================================================ .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn:active, .btn.active { background-image: none; } .btn-default { text-shadow: 0 1px 0 #fff; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#e6e6e6)); background-image: -webkit-linear-gradient(top, #ffffff, 0%, #e6e6e6, 100%); background-image: -moz-linear-gradient(top, #ffffff 0%, #e6e6e6 100%); background-image: linear-gradient(to bottom, #ffffff 0%, #e6e6e6 100%); background-repeat: repeat-x; border-color: #e0e0e0; border-color: #ccc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); } .btn-default:active, .btn-default.active { background-color: #e6e6e6; border-color: #e0e0e0; } .btn-primary { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); background-repeat: repeat-x; border-color: #2d6ca2; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); } .btn-primary:active, .btn-primary.active { background-color: #3071a9; border-color: #2d6ca2; } .btn-success { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%); background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); background-repeat: repeat-x; border-color: #419641; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); } .btn-success:active, .btn-success.active { background-color: #449d44; border-color: #419641; } .btn-warning { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%); background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); background-repeat: repeat-x; border-color: #eb9316; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); } .btn-warning:active, .btn-warning.active { background-color: #ec971f; border-color: #eb9316; } .btn-danger { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%); background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); background-repeat: repeat-x; border-color: #c12e2a; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); } .btn-danger:active, .btn-danger.active { background-color: #c9302c; border-color: #c12e2a; } .btn-info { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%); background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); background-repeat: repeat-x; border-color: #2aabd2; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); } .btn-info:active, .btn-info.active { background-color: #31b0d5; border-color: #2aabd2; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus, .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #357ebd; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); } .navbar { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#f8f8f8)); background-image: -webkit-linear-gradient(top, #ffffff, 0%, #f8f8f8, 100%); background-image: -moz-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); background-repeat: repeat-x; border-radius: 4px; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); } .navbar .navbar-nav > .active > a { background-color: #f8f8f8; } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); } .navbar-inverse { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3c3c3c), to(#222222)); background-image: -webkit-linear-gradient(top, #3c3c3c, 0%, #222222, 100%); background-image: -moz-linear-gradient(top, #3c3c3c 0%, #222222 100%); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); } .navbar-inverse .navbar-nav > .active > a { background-color: #222222; } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); } .alert-success { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#c8e5bc)); background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #c8e5bc, 100%); background-image: -moz-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); background-repeat: repeat-x; border-color: #b2dba1; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); } .alert-info { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#b9def0)); background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #b9def0, 100%); background-image: -moz-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); background-repeat: repeat-x; border-color: #9acfea; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); } .alert-warning { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#f8efc0)); background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #f8efc0, 100%); background-image: -moz-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); background-repeat: repeat-x; border-color: #f5e79e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); } .alert-danger { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#e7c3c3)); background-image: -webkit-linear-gradient(top, #f2dede, 0%, #e7c3c3, 100%); background-image: -moz-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); background-repeat: repeat-x; border-color: #dca7a7; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); } .progress { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f5f5f5)); background-image: -webkit-linear-gradient(top, #ebebeb, 0%, #f5f5f5, 100%); background-image: -moz-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); } .progress-bar { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); } .progress-bar-success { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%); background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); } .progress-bar-info { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%); background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); } .progress-bar-warning { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%); background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); } .progress-bar-danger { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%); background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #3071a9; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3278b3)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #3278b3, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #3278b3 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); background-repeat: repeat-x; border-color: #3278b3; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .panel-default > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8)); background-image: -webkit-linear-gradient(top, #f5f5f5, 0%, #e8e8e8, 100%); background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); } .panel-primary > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); } .panel-success > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#d0e9c6)); background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #d0e9c6, 100%); background-image: -moz-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); } .panel-info > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#c4e3f3)); background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #c4e3f3, 100%); background-image: -moz-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); } .panel-warning > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#faf2cc)); background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #faf2cc, 100%); background-image: -moz-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); } .panel-danger > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#ebcccc)); background-image: -webkit-linear-gradient(top, #f2dede, 0%, #ebcccc, 100%); background-image: -moz-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); } .well { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#e8e8e8), to(#f5f5f5)); background-image: -webkit-linear-gradient(top, #e8e8e8, 0%, #f5f5f5, 100%); background-image: -moz-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); background-repeat: repeat-x; border-color: #dcdcdc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/bootstrap/bootstrap.css ================================================ /*! * Bootstrap v3.0.0 * * Copyright 2013 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. */ /*! normalize.css v2.1.0 | MIT License | git.io/normalize */ article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } audio, canvas, video { display: inline-block; } audio:not([controls]) { display: none; height: 0; } [hidden] { display: none; } html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } a:focus { outline: thin dotted; } a:active, a:hover { outline: 0; } h1 { margin: 0.67em 0; font-size: 2em; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } hr { height: 0; -moz-box-sizing: content-box; box-sizing: content-box; } mark { color: #000; background: #ff0; } code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } pre { white-space: pre-wrap; } q { quotes: "\201C" "\201D" "\2018" "\2019"; } small { font-size: 80%; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 0; } fieldset { padding: 0.35em 0.625em 0.75em; margin: 0 2px; border: 1px solid #c0c0c0; } legend { padding: 0; border: 0; } button, input, select, textarea { margin: 0; font-family: inherit; font-size: 100%; } button, input { line-height: normal; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; } button[disabled], html input[disabled] { cursor: default; } input[type="checkbox"], input[type="radio"] { padding: 0; box-sizing: border-box; } input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } textarea { overflow: auto; vertical-align: top; } table { border-collapse: collapse; border-spacing: 0; } @media print { * { color: #000 !important; text-shadow: none !important; background: transparent !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } @page { margin: 2cm .5cm; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .table td, .table th { background-color: #fff !important; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } *, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 62.5%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.428571429; color: #333333; background-color: #ffffff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } button, input, select[multiple], textarea { background-image: none; } a { color: #428bca; text-decoration: none; } a:hover, a:focus { color: #2a6496; text-decoration: underline; } a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } img { vertical-align: middle; } .img-responsive { display: block; height: auto; max-width: 100%; } .img-rounded { border-radius: 6px; } .img-thumbnail { display: inline-block; height: auto; max-width: 100%; padding: 4px; line-height: 1.428571429; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eeeeee; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16.099999999999998px; font-weight: 200; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small { font-size: 85%; } cite { font-style: normal; } .text-muted { color: #999999; } .text-primary { color: #428bca; } .text-warning { color: #c09853; } .text-danger { color: #b94a48; } .text-success { color: #468847; } .text-info { color: #3a87ad; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small { font-weight: normal; line-height: 1; color: #999999; } h1, h2, h3 { margin-top: 20px; margin-bottom: 10px; } h4, h5, h6 { margin-top: 10px; margin-bottom: 10px; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } h1 small, .h1 small { font-size: 24px; } h2 small, .h2 small { font-size: 18px; } h3 small, .h3 small, h4 small, .h4 small { font-size: 14px; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eeeeee; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-bottom: 20px; } dt, dd { line-height: 1.428571429; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; overflow: hidden; clear: left; text-align: right; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #999999; } abbr.initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; border-left: 5px solid #eeeeee; } blockquote p { font-size: 17.5px; font-weight: 300; line-height: 1.25; } blockquote p:last-child { margin-bottom: 0; } blockquote small { display: block; line-height: 1.428571429; color: #999999; } blockquote small:before { content: '\2014 \00A0'; } blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #eeeeee; border-left: 0; } blockquote.pull-right p, blockquote.pull-right small { text-align: right; } blockquote.pull-right small:before { content: ''; } blockquote.pull-right small:after { content: '\00A0 \2014'; } q:before, q:after, blockquote:before, blockquote:after { content: ""; } address { display: block; margin-bottom: 20px; font-style: normal; line-height: 1.428571429; } code, pre { font-family: Monaco, Menlo, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; white-space: nowrap; background-color: #f9f2f4; border-radius: 4px; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.428571429; color: #333333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px; } pre.prettyprint { margin-bottom: 20px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .row { margin-right: -15px; margin-left: -15px; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11 { float: left; } .col-xs-1 { width: 8.333333333333332%; } .col-xs-2 { width: 16.666666666666664%; } .col-xs-3 { width: 25%; } .col-xs-4 { width: 33.33333333333333%; } .col-xs-5 { width: 41.66666666666667%; } .col-xs-6 { width: 50%; } .col-xs-7 { width: 58.333333333333336%; } .col-xs-8 { width: 66.66666666666666%; } .col-xs-9 { width: 75%; } .col-xs-10 { width: 83.33333333333334%; } .col-xs-11 { width: 91.66666666666666%; } .col-xs-12 { width: 100%; } @media (min-width: 768px) { .container { max-width: 750px; } .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11 { float: left; } .col-sm-1 { width: 8.333333333333332%; } .col-sm-2 { width: 16.666666666666664%; } .col-sm-3 { width: 25%; } .col-sm-4 { width: 33.33333333333333%; } .col-sm-5 { width: 41.66666666666667%; } .col-sm-6 { width: 50%; } .col-sm-7 { width: 58.333333333333336%; } .col-sm-8 { width: 66.66666666666666%; } .col-sm-9 { width: 75%; } .col-sm-10 { width: 83.33333333333334%; } .col-sm-11 { width: 91.66666666666666%; } .col-sm-12 { width: 100%; } .col-sm-push-1 { left: 8.333333333333332%; } .col-sm-push-2 { left: 16.666666666666664%; } .col-sm-push-3 { left: 25%; } .col-sm-push-4 { left: 33.33333333333333%; } .col-sm-push-5 { left: 41.66666666666667%; } .col-sm-push-6 { left: 50%; } .col-sm-push-7 { left: 58.333333333333336%; } .col-sm-push-8 { left: 66.66666666666666%; } .col-sm-push-9 { left: 75%; } .col-sm-push-10 { left: 83.33333333333334%; } .col-sm-push-11 { left: 91.66666666666666%; } .col-sm-pull-1 { right: 8.333333333333332%; } .col-sm-pull-2 { right: 16.666666666666664%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-4 { right: 33.33333333333333%; } .col-sm-pull-5 { right: 41.66666666666667%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-7 { right: 58.333333333333336%; } .col-sm-pull-8 { right: 66.66666666666666%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-10 { right: 83.33333333333334%; } .col-sm-pull-11 { right: 91.66666666666666%; } .col-sm-offset-1 { margin-left: 8.333333333333332%; } .col-sm-offset-2 { margin-left: 16.666666666666664%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-4 { margin-left: 33.33333333333333%; } .col-sm-offset-5 { margin-left: 41.66666666666667%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-7 { margin-left: 58.333333333333336%; } .col-sm-offset-8 { margin-left: 66.66666666666666%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-10 { margin-left: 83.33333333333334%; } .col-sm-offset-11 { margin-left: 91.66666666666666%; } } @media (min-width: 992px) { .container { max-width: 970px; } .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11 { float: left; } .col-md-1 { width: 8.333333333333332%; } .col-md-2 { width: 16.666666666666664%; } .col-md-3 { width: 25%; } .col-md-4 { width: 33.33333333333333%; } .col-md-5 { width: 41.66666666666667%; } .col-md-6 { width: 50%; } .col-md-7 { width: 58.333333333333336%; } .col-md-8 { width: 66.66666666666666%; } .col-md-9 { width: 75%; } .col-md-10 { width: 83.33333333333334%; } .col-md-11 { width: 91.66666666666666%; } .col-md-12 { width: 100%; } .col-md-push-0 { left: auto; } .col-md-push-1 { left: 8.333333333333332%; } .col-md-push-2 { left: 16.666666666666664%; } .col-md-push-3 { left: 25%; } .col-md-push-4 { left: 33.33333333333333%; } .col-md-push-5 { left: 41.66666666666667%; } .col-md-push-6 { left: 50%; } .col-md-push-7 { left: 58.333333333333336%; } .col-md-push-8 { left: 66.66666666666666%; } .col-md-push-9 { left: 75%; } .col-md-push-10 { left: 83.33333333333334%; } .col-md-push-11 { left: 91.66666666666666%; } .col-md-pull-0 { right: auto; } .col-md-pull-1 { right: 8.333333333333332%; } .col-md-pull-2 { right: 16.666666666666664%; } .col-md-pull-3 { right: 25%; } .col-md-pull-4 { right: 33.33333333333333%; } .col-md-pull-5 { right: 41.66666666666667%; } .col-md-pull-6 { right: 50%; } .col-md-pull-7 { right: 58.333333333333336%; } .col-md-pull-8 { right: 66.66666666666666%; } .col-md-pull-9 { right: 75%; } .col-md-pull-10 { right: 83.33333333333334%; } .col-md-pull-11 { right: 91.66666666666666%; } .col-md-offset-0 { margin-left: 0; } .col-md-offset-1 { margin-left: 8.333333333333332%; } .col-md-offset-2 { margin-left: 16.666666666666664%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-4 { margin-left: 33.33333333333333%; } .col-md-offset-5 { margin-left: 41.66666666666667%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-7 { margin-left: 58.333333333333336%; } .col-md-offset-8 { margin-left: 66.66666666666666%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-10 { margin-left: 83.33333333333334%; } .col-md-offset-11 { margin-left: 91.66666666666666%; } } @media (min-width: 1200px) { .container { max-width: 1170px; } .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11 { float: left; } .col-lg-1 { width: 8.333333333333332%; } .col-lg-2 { width: 16.666666666666664%; } .col-lg-3 { width: 25%; } .col-lg-4 { width: 33.33333333333333%; } .col-lg-5 { width: 41.66666666666667%; } .col-lg-6 { width: 50%; } .col-lg-7 { width: 58.333333333333336%; } .col-lg-8 { width: 66.66666666666666%; } .col-lg-9 { width: 75%; } .col-lg-10 { width: 83.33333333333334%; } .col-lg-11 { width: 91.66666666666666%; } .col-lg-12 { width: 100%; } .col-lg-push-0 { left: auto; } .col-lg-push-1 { left: 8.333333333333332%; } .col-lg-push-2 { left: 16.666666666666664%; } .col-lg-push-3 { left: 25%; } .col-lg-push-4 { left: 33.33333333333333%; } .col-lg-push-5 { left: 41.66666666666667%; } .col-lg-push-6 { left: 50%; } .col-lg-push-7 { left: 58.333333333333336%; } .col-lg-push-8 { left: 66.66666666666666%; } .col-lg-push-9 { left: 75%; } .col-lg-push-10 { left: 83.33333333333334%; } .col-lg-push-11 { left: 91.66666666666666%; } .col-lg-pull-0 { right: auto; } .col-lg-pull-1 { right: 8.333333333333332%; } .col-lg-pull-2 { right: 16.666666666666664%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-4 { right: 33.33333333333333%; } .col-lg-pull-5 { right: 41.66666666666667%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-7 { right: 58.333333333333336%; } .col-lg-pull-8 { right: 66.66666666666666%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-10 { right: 83.33333333333334%; } .col-lg-pull-11 { right: 91.66666666666666%; } .col-lg-offset-0 { margin-left: 0; } .col-lg-offset-1 { margin-left: 8.333333333333332%; } .col-lg-offset-2 { margin-left: 16.666666666666664%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-4 { margin-left: 33.33333333333333%; } .col-lg-offset-5 { margin-left: 41.66666666666667%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-7 { margin-left: 58.333333333333336%; } .col-lg-offset-8 { margin-left: 66.66666666666666%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-10 { margin-left: 83.33333333333334%; } .col-lg-offset-11 { margin-left: 91.66666666666666%; } } table { max-width: 100%; background-color: transparent; } th { text-align: left; } .table { width: 100%; margin-bottom: 20px; } .table thead > tr > th, .table tbody > tr > th, .table tfoot > tr > th, .table thead > tr > td, .table tbody > tr > td, .table tfoot > tr > td { padding: 8px; line-height: 1.428571429; vertical-align: top; border-top: 1px solid #dddddd; } .table thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #dddddd; } .table caption + thead tr:first-child th, .table colgroup + thead tr:first-child th, .table thead:first-child tr:first-child th, .table caption + thead tr:first-child td, .table colgroup + thead tr:first-child td, .table thead:first-child tr:first-child td { border-top: 0; } .table tbody + tbody { border-top: 2px solid #dddddd; } .table .table { background-color: #ffffff; } .table-condensed thead > tr > th, .table-condensed tbody > tr > th, .table-condensed tfoot > tr > th, .table-condensed thead > tr > td, .table-condensed tbody > tr > td, .table-condensed tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-child(odd) > td, .table-striped > tbody > tr:nth-child(odd) > th { background-color: #f9f9f9; } .table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th { background-color: #f5f5f5; } table col[class*="col-"] { display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { display: table-cell; float: none; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; border-color: #d6e9c6; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td { background-color: #d0e9c6; border-color: #c9e2b3; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; border-color: #eed3d7; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td { background-color: #ebcccc; border-color: #e6c1c7; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; border-color: #fbeed5; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td { background-color: #faf2cc; border-color: #f8e5be; } @media (max-width: 768px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-x: scroll; overflow-y: hidden; border: 1px solid #dddddd; } .table-responsive > .table { margin-bottom: 0; background-color: #fff; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > thead > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > thead > tr:last-child > td, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; /* IE8-9 */ line-height: normal; } input[type="file"] { display: block; } select[multiple], select[size] { height: auto; } select optgroup { font-family: inherit; font-size: inherit; font-style: inherit; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { height: auto; } .form-control:-moz-placeholder { color: #999999; } .form-control::-moz-placeholder { color: #999999; } .form-control:-ms-input-placeholder { color: #999999; } .form-control::-webkit-input-placeholder { color: #999999; } .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.428571429; color: #555555; vertical-align: middle; background-color: #ffffff; border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { cursor: not-allowed; background-color: #eeeeee; } textarea.form-control { height: auto; } .form-group { margin-bottom: 15px; } .radio, .checkbox { display: block; min-height: 20px; padding-left: 20px; margin-top: 10px; margin-bottom: 10px; vertical-align: middle; } .radio label, .checkbox label { display: inline; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], .radio[disabled], .radio-inline[disabled], .checkbox[disabled], .checkbox-inline[disabled], fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"], fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm { height: auto; } .input-lg { height: 45px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-lg { height: 45px; line-height: 45px; } textarea.input-lg { height: auto; } .has-warning .help-block, .has-warning .control-label { color: #c09853; } .has-warning .form-control { border-color: #c09853; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #a47e3c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; } .has-warning .input-group-addon { color: #c09853; background-color: #fcf8e3; border-color: #c09853; } .has-error .help-block, .has-error .control-label { color: #b94a48; } .has-error .form-control { border-color: #b94a48; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #953b39; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; } .has-error .input-group-addon { color: #b94a48; background-color: #f2dede; border-color: #b94a48; } .has-success .help-block, .has-success .control-label { color: #468847; } .has-success .form-control { border-color: #468847; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #356635; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; } .has-success .input-group-addon { color: #468847; background-color: #dff0d8; border-color: #468847; } .form-control-static { padding-top: 7px; margin-bottom: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; } .form-inline .radio, .form-inline .checkbox { display: inline-block; padding-left: 0; margin-top: 0; margin-bottom: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 7px; margin-top: 0; margin-bottom: 0; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; } } .btn { display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; line-height: 1.428571429; text-align: center; white-space: nowrap; vertical-align: middle; cursor: pointer; border: 1px solid transparent; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; } .btn:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus { color: #333333; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { pointer-events: none; cursor: not-allowed; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } .btn-default { color: #333333; background-color: #ffffff; border-color: #cccccc; } .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { color: #333333; background-color: #ebebeb; border-color: #adadad; } .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #ffffff; border-color: #cccccc; } .btn-primary { color: #ffffff; background-color: #428bca; border-color: #357ebd; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { color: #ffffff; background-color: #3276b1; border-color: #285e8e; } .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #428bca; border-color: #357ebd; } .btn-warning { color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { color: #ffffff; background-color: #ed9c28; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #f0ad4e; border-color: #eea236; } .btn-danger { color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { color: #ffffff; background-color: #d2322d; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #d9534f; border-color: #d43f3a; } .btn-success { color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { color: #ffffff; background-color: #47a447; border-color: #398439; } .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #5cb85c; border-color: #4cae4c; } .btn-info { color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { color: #ffffff; background-color: #39b3d7; border-color: #269abc; } .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #5bc0de; border-color: #46b8da; } .btn-link { font-weight: normal; color: #428bca; cursor: pointer; border-radius: 0; } .btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #2a6496; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #999999; text-decoration: none; } .btn-lg { padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-sm, .btn-xs { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs { padding: 1px 5px; } .btn-block { display: block; width: 100%; padding-right: 0; padding-left: 0; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition: height 0.35s ease; transition: height 0.35s ease; } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; -webkit-font-smoothing: antialiased; font-style: normal; font-weight: normal; line-height: 1; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-briefcase:before { content: "\1f4bc"; } .glyphicon-calendar:before { content: "\1f4c5"; } .glyphicon-pushpin:before { content: "\1f4cc"; } .glyphicon-paperclip:before { content: "\1f4ce"; } .glyphicon-camera:before { content: "\1f4f7"; } .glyphicon-lock:before { content: "\1f512"; } .glyphicon-bell:before { content: "\1f514"; } .glyphicon-bookmark:before { content: "\1f516"; } .glyphicon-fire:before { content: "\1f525"; } .glyphicon-wrench:before { content: "\1f527"; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px solid #000000; border-right: 4px solid transparent; border-bottom: 0 dotted; border-left: 4px solid transparent; content: ""; } .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; list-style: none; background-color: #ffffff; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.428571429; color: #333333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #ffffff; text-decoration: none; background-color: #428bca; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; background-color: #428bca; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #999999; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.428571429; color: #999999; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0 dotted; border-bottom: 4px solid #000000; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } } .btn-default .caret { border-top-color: #333333; } .btn-primary .caret, .btn-success .caret, .btn-warning .caret, .btn-danger .caret, .btn-info .caret { border-top-color: #fff; } .dropup .btn-default .caret { border-bottom-color: #333333; } .dropup .btn-primary .caret, .dropup .btn-success .caret, .dropup .btn-warning .caret, .dropup .btn-danger .caret, .dropup .btn-info .caret { border-bottom-color: #fff; } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group > .btn:focus, .btn-group-vertical > .btn:focus { outline: none; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar .btn-group { float: left; } .btn-toolbar > .btn + .btn, .btn-toolbar > .btn-group + .btn, .btn-toolbar > .btn + .btn-group, .btn-toolbar > .btn-group + .btn-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child > .btn:last-child, .btn-group > .btn-group:first-child > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group-xs > .btn { padding: 5px 10px; padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-right-radius: 0; border-bottom-left-radius: 4px; border-top-left-radius: 0; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child > .btn:last-child, .btn-group-vertical > .btn-group:first-child > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; border-collapse: separate; table-layout: fixed; } .btn-group-justified .btn { display: table-cell; float: none; width: 1%; } [data-toggle="buttons"] > .btn > input[type="radio"], [data-toggle="buttons"] > .btn > input[type="checkbox"] { display: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group.col { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 45px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 45px; line-height: 45px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; text-align: center; background-color: #eeeeee; border: 1px solid #cccccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -4px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:active { z-index: 2; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eeeeee; } .nav > li.disabled > a { color: #999999; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #999999; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eeeeee; border-color: #428bca; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #dddddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.428571429; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; cursor: default; background-color: #ffffff; border: 1px solid #dddddd; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { text-align: center; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-bottom: 1px solid #dddddd; } .nav-tabs.nav-justified > .active > a { border-bottom-color: #ffffff; } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 5px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #ffffff; background-color: #428bca; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { text-align: center; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-bottom: 1px solid #dddddd; } .nav-tabs-justified > .active > a { border-bottom-color: #ffffff; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tab-content > .tab-pane, .pill-content > .pill-pane { display: none; } .tab-content > .active, .pill-content > .active { display: block; } .nav .caret { border-top-color: #428bca; border-bottom-color: #428bca; } .nav a:hover .caret { border-top-color: #2a6496; border-bottom-color: #2a6496; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; z-index: 1000; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { max-height: 340px; padding-right: 15px; padding-left: 15px; overflow-x: visible; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-collapse .navbar-nav.navbar-left:first-child { margin-left: -15px; } .navbar-collapse .navbar-nav.navbar-right:last-child { margin-right: -15px; } .navbar-collapse .navbar-text:last-child { margin-right: 0; } } .container > .navbar-header, .container > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; z-index: 1030; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; } .navbar-brand { float: left; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } @media (min-width: 768px) { .navbar > .container .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-top: 8px; margin-right: 15px; margin-bottom: 8px; background-color: transparent; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; } } .navbar-form { padding: 10px 15px; margin-top: 8px; margin-right: -15px; margin-bottom: 8px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; padding-left: 0; margin-top: 0; margin-bottom: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-nav.pull-right > li > .dropdown-menu, .navbar-nav > li > .dropdown-menu.pull-right { right: 0; left: auto; } .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .navbar-text { float: left; margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { margin-right: 15px; margin-left: 15px; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777777; } .navbar-default .navbar-nav > li > a { color: #777777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #cccccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #dddddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #dddddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #cccccc; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e6e6e6; } .navbar-default .navbar-nav > .dropdown > a:hover .caret, .navbar-default .navbar-nav > .dropdown > a:focus .caret { border-top-color: #333333; border-bottom-color: #333333; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a .caret, .navbar-default .navbar-nav > .open > a:hover .caret, .navbar-default .navbar-nav > .open > a:focus .caret { border-top-color: #555555; border-bottom-color: #555555; } .navbar-default .navbar-nav > .dropdown > a .caret { border-top-color: #777777; border-bottom-color: #777777; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #cccccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777777; } .navbar-default .navbar-link:hover { color: #333333; } .navbar-inverse { background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #999999; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { color: #999999; } .navbar-inverse .navbar-nav > li > a { color: #999999; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .dropdown > a:hover .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-inverse .navbar-nav > .dropdown > a .caret { border-top-color: #999999; border-bottom-color: #999999; } .navbar-inverse .navbar-nav > .open > a .caret, .navbar-inverse .navbar-nav > .open > a:hover .caret, .navbar-inverse .navbar-nav > .open > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #999999; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #999999; } .navbar-inverse .navbar-link:hover { color: #ffffff; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #cccccc; content: "/\00a0"; } .breadcrumb > .active { color: #999999; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.428571429; text-decoration: none; background-color: #ffffff; border: 1px solid #dddddd; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 4px; border-top-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { background-color: #eeeeee; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #ffffff; cursor: default; background-color: #428bca; border-color: #428bca; } .pagination > .disabled > span, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #999999; cursor: not-allowed; background-color: #ffffff; border-color: #dddddd; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 6px; border-top-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eeeeee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #999999; cursor: not-allowed; background-color: #ffffff; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } .label[href]:hover, .label[href]:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .label-default { background-color: #999999; } .label-default[href]:hover, .label-default[href]:focus { background-color: #808080; } .label-primary { background-color: #428bca; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #3071a9; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; background-color: #999999; border-radius: 10px; } .badge:empty { display: none; } a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .btn .badge { position: relative; top: -1px; } a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #428bca; background-color: #ffffff; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding: 30px; margin-bottom: 30px; font-size: 21px; font-weight: 200; line-height: 2.1428571435; color: inherit; background-color: #eeeeee; } .jumbotron h1 { line-height: 1; color: inherit; } .jumbotron p { line-height: 1.4; } .container .jumbotron { border-radius: 6px; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1 { font-size: 63px; } } .thumbnail { display: inline-block; display: block; height: auto; max-width: 100%; padding: 4px; line-height: 1.428571429; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .thumbnail > img { display: block; height: auto; max-width: 100%; } a.thumbnail:hover, a.thumbnail:focus { border-color: #428bca; } .thumbnail > img { margin-right: auto; margin-left: auto; } .thumbnail .caption { padding: 9px; color: #333333; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable { padding-right: 35px; } .alert-dismissable .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #468847; background-color: #dff0d8; border-color: #d6e9c6; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #356635; } .alert-info { color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #2d6987; } .alert-warning { color: #c09853; background-color: #fcf8e3; border-color: #fbeed5; } .alert-warning hr { border-top-color: #f8e5be; } .alert-warning .alert-link { color: #a47e3c; } .alert-danger { color: #b94a48; background-color: #f2dede; border-color: #eed3d7; } .alert-danger hr { border-top-color: #e6c1c7; } .alert-danger .alert-link { color: #953b39; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-moz-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0; height: 100%; font-size: 12px; color: #ffffff; text-align: center; background-color: #428bca; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; } .progress.active .progress-bar { -webkit-animation: progress-bar-stripes 2s linear infinite; -moz-animation: progress-bar-stripes 2s linear infinite; -ms-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .media, .media-body { overflow: hidden; zoom: 1; } .media, .media .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media-object { display: block; } .media-heading { margin: 0 0 5px; } .media > .pull-left { margin-right: 10px; } .media > .pull-right { margin-left: 10px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #ffffff; border: 1px solid #dddddd; } .list-group-item:first-child { border-top-right-radius: 4px; border-top-left-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } a.list-group-item { color: #555555; } a.list-group-item .list-group-item-heading { color: #333333; } a.list-group-item:hover, a.list-group-item:focus { text-decoration: none; background-color: #f5f5f5; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #428bca; border-color: #428bca; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #e1edf7; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item { border-width: 1px 0; } .panel > .list-group .list-group-item:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .panel > .list-group .list-group-item:last-child { border-bottom: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .panel > .table { margin-bottom: 0; } .panel > .panel-body + .table { border-top: 1px solid #dddddd; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; } .panel-title > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel-group .panel { margin-bottom: 0; overflow: hidden; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse .panel-body { border-top: 1px solid #dddddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #dddddd; } .panel-default { border-color: #dddddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; border-color: #dddddd; } .panel-default > .panel-heading + .panel-collapse .panel-body { border-top-color: #dddddd; } .panel-default > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #dddddd; } .panel-primary { border-color: #428bca; } .panel-primary > .panel-heading { color: #ffffff; background-color: #428bca; border-color: #428bca; } .panel-primary > .panel-heading + .panel-collapse .panel-body { border-top-color: #428bca; } .panel-primary > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #428bca; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #468847; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #d6e9c6; } .panel-warning { border-color: #fbeed5; } .panel-warning > .panel-heading { color: #c09853; background-color: #fcf8e3; border-color: #fbeed5; } .panel-warning > .panel-heading + .panel-collapse .panel-body { border-top-color: #fbeed5; } .panel-warning > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #fbeed5; } .panel-danger { border-color: #eed3d7; } .panel-danger > .panel-heading { color: #b94a48; background-color: #f2dede; border-color: #eed3d7; } .panel-danger > .panel-heading + .panel-collapse .panel-body { border-top-color: #eed3d7; } .panel-danger > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #eed3d7; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #bce8f1; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } body.modal-open, .modal-open .navbar-fixed-top, .modal-open .navbar-fixed-bottom { margin-right: 15px; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; display: none; overflow: auto; overflow-y: scroll; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0); } .modal-dialog { z-index: 1050; width: auto; padding: 10px; margin-right: auto; margin-left: auto; } .modal-content { position: relative; background-color: #ffffff; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; outline: none; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1030; background-color: #000000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { min-height: 16.428571429px; padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.428571429; } .modal-body { position: relative; padding: 20px; } .modal-footer { padding: 19px 20px 20px; margin-top: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } @media screen and (min-width: 768px) { .modal-dialog { right: auto; left: 50%; width: 600px; padding-top: 30px; padding-bottom: 30px; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } } .tooltip { position: absolute; z-index: 1030; display: block; font-size: 12px; line-height: 1.4; opacity: 0; filter: alpha(opacity=0); visibility: visible; } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: #000000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-top-color: #000000; border-width: 5px 5px 0; } .tooltip.top-left .tooltip-arrow { bottom: 0; left: 5px; border-top-color: #000000; border-width: 5px 5px 0; } .tooltip.top-right .tooltip-arrow { right: 5px; bottom: 0; border-top-color: #000000; border-width: 5px 5px 0; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-right-color: #000000; border-width: 5px 5px 5px 0; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-left-color: #000000; border-width: 5px 0 5px 5px; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-bottom-color: #000000; border-width: 0 5px 5px; } .tooltip.bottom-left .tooltip-arrow { top: 0; left: 5px; border-bottom-color: #000000; border-width: 0 5px 5px; } .tooltip.bottom-right .tooltip-arrow { top: 0; right: 5px; border-bottom-color: #000000; border-width: 0 5px 5px; } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; max-width: 276px; padding: 1px; text-align: left; white-space: normal; background-color: #ffffff; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); background-clip: padding-box; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; font-weight: normal; line-height: 18px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover .arrow, .popover .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover .arrow { border-width: 11px; } .popover .arrow:after { border-width: 10px; content: ""; } .popover.top .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); border-bottom-width: 0; } .popover.top .arrow:after { bottom: 1px; margin-left: -10px; border-top-color: #ffffff; border-bottom-width: 0; content: " "; } .popover.right .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); border-left-width: 0; } .popover.right .arrow:after { bottom: -10px; left: 1px; border-right-color: #ffffff; border-left-width: 0; content: " "; } .popover.bottom .arrow { top: -11px; left: 50%; margin-left: -11px; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); border-top-width: 0; } .popover.bottom .arrow:after { top: 1px; margin-left: -10px; border-bottom-color: #ffffff; border-top-width: 0; content: " "; } .popover.left .arrow { top: 50%; right: -11px; margin-top: -11px; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); border-right-width: 0; } .popover.left .arrow:after { right: 1px; bottom: -10px; border-left-color: #ffffff; border-right-width: 0; content: " "; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; height: auto; max-width: 100%; line-height: 1; } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); opacity: 0.5; filter: alpha(opacity=50); } .carousel-control.left { background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { right: 0; left: auto; background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; left: 50%; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; margin-top: -10px; margin-left: -10px; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; border: 1px solid #ffffff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #ffffff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; margin-left: -15px; font-size: 30px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .affix { position: fixed; } @-ms-viewport { width: device-width; } @media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } } .hidden { display: none !important; visibility: hidden !important; } .visible-xs { display: none !important; } tr.visible-xs { display: none !important; } th.visible-xs, td.visible-xs { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-xs.visible-sm { display: block !important; } tr.visible-xs.visible-sm { display: table-row !important; } th.visible-xs.visible-sm, td.visible-xs.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-xs.visible-md { display: block !important; } tr.visible-xs.visible-md { display: table-row !important; } th.visible-xs.visible-md, td.visible-xs.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-xs.visible-lg { display: block !important; } tr.visible-xs.visible-lg { display: table-row !important; } th.visible-xs.visible-lg, td.visible-xs.visible-lg { display: table-cell !important; } } .visible-sm { display: none !important; } tr.visible-sm { display: none !important; } th.visible-sm, td.visible-sm { display: none !important; } @media (max-width: 767px) { .visible-sm.visible-xs { display: block !important; } tr.visible-sm.visible-xs { display: table-row !important; } th.visible-sm.visible-xs, td.visible-sm.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-sm.visible-md { display: block !important; } tr.visible-sm.visible-md { display: table-row !important; } th.visible-sm.visible-md, td.visible-sm.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-sm.visible-lg { display: block !important; } tr.visible-sm.visible-lg { display: table-row !important; } th.visible-sm.visible-lg, td.visible-sm.visible-lg { display: table-cell !important; } } .visible-md { display: none !important; } tr.visible-md { display: none !important; } th.visible-md, td.visible-md { display: none !important; } @media (max-width: 767px) { .visible-md.visible-xs { display: block !important; } tr.visible-md.visible-xs { display: table-row !important; } th.visible-md.visible-xs, td.visible-md.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-md.visible-sm { display: block !important; } tr.visible-md.visible-sm { display: table-row !important; } th.visible-md.visible-sm, td.visible-md.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-md.visible-lg { display: block !important; } tr.visible-md.visible-lg { display: table-row !important; } th.visible-md.visible-lg, td.visible-md.visible-lg { display: table-cell !important; } } .visible-lg { display: none !important; } tr.visible-lg { display: none !important; } th.visible-lg, td.visible-lg { display: none !important; } @media (max-width: 767px) { .visible-lg.visible-xs { display: block !important; } tr.visible-lg.visible-xs { display: table-row !important; } th.visible-lg.visible-xs, td.visible-lg.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-lg.visible-sm { display: block !important; } tr.visible-lg.visible-sm { display: table-row !important; } th.visible-lg.visible-sm, td.visible-lg.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-lg.visible-md { display: block !important; } tr.visible-lg.visible-md { display: table-row !important; } th.visible-lg.visible-md, td.visible-lg.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } .hidden-xs { display: block !important; } tr.hidden-xs { display: table-row !important; } th.hidden-xs, td.hidden-xs { display: table-cell !important; } @media (max-width: 767px) { .hidden-xs { display: none !important; } tr.hidden-xs { display: none !important; } th.hidden-xs, td.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-xs.hidden-sm { display: none !important; } tr.hidden-xs.hidden-sm { display: none !important; } th.hidden-xs.hidden-sm, td.hidden-xs.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-xs.hidden-md { display: none !important; } tr.hidden-xs.hidden-md { display: none !important; } th.hidden-xs.hidden-md, td.hidden-xs.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-xs.hidden-lg { display: none !important; } tr.hidden-xs.hidden-lg { display: none !important; } th.hidden-xs.hidden-lg, td.hidden-xs.hidden-lg { display: none !important; } } .hidden-sm { display: block !important; } tr.hidden-sm { display: table-row !important; } th.hidden-sm, td.hidden-sm { display: table-cell !important; } @media (max-width: 767px) { .hidden-sm.hidden-xs { display: none !important; } tr.hidden-sm.hidden-xs { display: none !important; } th.hidden-sm.hidden-xs, td.hidden-sm.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } tr.hidden-sm { display: none !important; } th.hidden-sm, td.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-sm.hidden-md { display: none !important; } tr.hidden-sm.hidden-md { display: none !important; } th.hidden-sm.hidden-md, td.hidden-sm.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-sm.hidden-lg { display: none !important; } tr.hidden-sm.hidden-lg { display: none !important; } th.hidden-sm.hidden-lg, td.hidden-sm.hidden-lg { display: none !important; } } .hidden-md { display: block !important; } tr.hidden-md { display: table-row !important; } th.hidden-md, td.hidden-md { display: table-cell !important; } @media (max-width: 767px) { .hidden-md.hidden-xs { display: none !important; } tr.hidden-md.hidden-xs { display: none !important; } th.hidden-md.hidden-xs, td.hidden-md.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-md.hidden-sm { display: none !important; } tr.hidden-md.hidden-sm { display: none !important; } th.hidden-md.hidden-sm, td.hidden-md.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } tr.hidden-md { display: none !important; } th.hidden-md, td.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-md.hidden-lg { display: none !important; } tr.hidden-md.hidden-lg { display: none !important; } th.hidden-md.hidden-lg, td.hidden-md.hidden-lg { display: none !important; } } .hidden-lg { display: block !important; } tr.hidden-lg { display: table-row !important; } th.hidden-lg, td.hidden-lg { display: table-cell !important; } @media (max-width: 767px) { .hidden-lg.hidden-xs { display: none !important; } tr.hidden-lg.hidden-xs { display: none !important; } th.hidden-lg.hidden-xs, td.hidden-lg.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-lg.hidden-sm { display: none !important; } tr.hidden-lg.hidden-sm { display: none !important; } th.hidden-lg.hidden-sm, td.hidden-lg.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-lg.hidden-md { display: none !important; } tr.hidden-lg.hidden-md { display: none !important; } th.hidden-lg.hidden-md, td.hidden-lg.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } tr.hidden-lg { display: none !important; } th.hidden-lg, td.hidden-lg { display: none !important; } } .visible-print { display: none !important; } tr.visible-print { display: none !important; } th.visible-print, td.visible-print { display: none !important; } @media print { .visible-print { display: block !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } .hidden-print { display: none !important; } tr.hidden-print { display: none !important; } th.hidden-print, td.hidden-print { display: none !important; } } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/bootstrap/themes/bootstrap-theme-cosmo.css ================================================ @import url("//fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700"); /*! * Bootswatch v3.1.1+1 * Homepage: http://bootswatch.com * Copyright 2012-2014 Thomas Park * Licensed under MIT * Based on Bootstrap */ /*! normalize.css v3.0.0 | MIT License | git.io/normalize */ html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { font-size: 2em; margin: 0.67em 0; } mark { background: #ff0; color: #000; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { color: inherit; font: inherit; margin: 0; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } legend { border: 0; padding: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-collapse: collapse; border-spacing: 0; } td, th { padding: 0; } @media print { * { text-shadow: none !important; color: #000 !important; background: transparent !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } select { background: #fff !important; } .navbar { display: none; } .table td, .table th { background-color: #fff !important; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 62.5%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Open Sans", Calibri, Candara, Arial, sans-serif; font-size: 15px; line-height: 1.42857143; color: #333333; background-color: #ffffff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #007fff; text-decoration: none; } a:hover, a:focus { color: #0059b3; text-decoration: underline; } a:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 0; } .img-thumbnail { padding: 4px; line-height: 1.42857143; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 0; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; display: inline-block; max-width: 100%; height: auto; } .img-circle { border-radius: 50%; } hr { margin-top: 21px; margin-bottom: 21px; border: 0; border-top: 1px solid #e6e6e6; } .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: "Open Sans", Calibri, Candara, Arial, sans-serif; font-weight: 300; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #999999; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 21px; margin-bottom: 10.5px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 10.5px; margin-bottom: 10.5px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 39px; } h2, .h2 { font-size: 32px; } h3, .h3 { font-size: 26px; } h4, .h4 { font-size: 19px; } h5, .h5 { font-size: 15px; } h6, .h6 { font-size: 13px; } p { margin: 0 0 10.5px; } .lead { margin-bottom: 21px; font-size: 17px; font-weight: 200; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 22.5px; } } small, .small { font-size: 85%; } cite { font-style: normal; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-muted { color: #999999; } .text-primary { color: #007fff; } a.text-primary:hover { color: #0066cc; } .text-success { color: #ffffff; } a.text-success:hover { color: #e6e6e6; } .text-info { color: #ffffff; } a.text-info:hover { color: #e6e6e6; } .text-warning { color: #ffffff; } a.text-warning:hover { color: #e6e6e6; } .text-danger { color: #ffffff; } a.text-danger:hover { color: #e6e6e6; } .bg-primary { color: #fff; background-color: #007fff; } a.bg-primary:hover { background-color: #0066cc; } .bg-success { background-color: #3fb618; } a.bg-success:hover { background-color: #2f8912; } .bg-info { background-color: #9954bb; } a.bg-info:hover { background-color: #7e3f9d; } .bg-warning { background-color: #ff7518; } a.bg-warning:hover { background-color: #e45c00; } .bg-danger { background-color: #ff0039; } a.bg-danger:hover { background-color: #cc002e; } .page-header { padding-bottom: 9.5px; margin: 42px 0 21px; border-bottom: 1px solid #e6e6e6; } ul, ol { margin-top: 0; margin-bottom: 10.5px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; margin-left: -5px; } .list-inline > li { display: inline-block; padding-left: 5px; padding-right: 5px; } dl { margin-top: 0; margin-bottom: 21px; } dt, dd { line-height: 1.42857143; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #999999; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10.5px 21px; margin: 0 0 21px; font-size: 18.75px; border-left: 5px solid #e6e6e6; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #999999; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #e6e6e6; border-left: 0; text-align: right; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } blockquote:before, blockquote:after { content: ""; } address { margin-bottom: 21px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; white-space: nowrap; border-radius: 0; } kbd { padding: 2px 4px; font-size: 90%; color: #ffffff; background-color: #333333; border-radius: 0; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } pre { display: block; padding: 10px; margin: 0 0 10.5px; font-size: 14px; line-height: 1.42857143; word-break: break-all; word-wrap: break-word; color: #333333; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 0; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } .row { margin-left: -15px; margin-right: -15px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-left: 15px; padding-right: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: 0%; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: 0%; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0%; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: 0%; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: 0%; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0%; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: 0%; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: 0%; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0%; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: 0%; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: 0%; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0%; } } table { max-width: 100%; background-color: transparent; } th { text-align: left; } .table { width: 100%; margin-bottom: 21px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #dddddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #dddddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #dddddd; } .table .table { background-color: #ffffff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-child(odd) > td, .table-striped > tbody > tr:nth-child(odd) > th { background-color: #f9f9f9; } .table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th { background-color: #f5f5f5; } table col[class*="col-"] { position: static; float: none; display: table-column; } table td[class*="col-"], table th[class*="col-"] { position: static; float: none; display: table-cell; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #3fb618; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr.success:hover > th { background-color: #379f15; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #9954bb; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr.info:hover > th { background-color: #8d46b0; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #ff7518; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr.warning:hover > th { background-color: #fe6600; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #ff0039; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr.danger:hover > th { background-color: #e60033; } @media (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15.75px; overflow-y: hidden; overflow-x: scroll; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #dddddd; -webkit-overflow-scrolling: touch; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; min-width: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 21px; font-size: 22.5px; line-height: inherit; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; /* IE8-9 */ line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 11px; font-size: 15px; line-height: 1.42857143; color: #333333; } .form-control { display: block; width: 100%; height: 43px; padding: 10px 18px; font-size: 15px; line-height: 1.42857143; color: #333333; background-color: #ffffff; background-image: none; border: 1px solid #cccccc; border-radius: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { color: #999999; opacity: 1; } .form-control:-ms-input-placeholder { color: #999999; } .form-control::-webkit-input-placeholder { color: #999999; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { cursor: not-allowed; background-color: #e6e6e6; opacity: 1; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } input[type="date"] { line-height: 43px; } .form-group { margin-bottom: 15px; } .radio, .checkbox { display: block; min-height: 21px; margin-top: 10px; margin-bottom: 10px; padding-left: 20px; } .radio label, .checkbox label { display: inline; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; vertical-align: middle; font-weight: normal; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], .radio[disabled], .radio-inline[disabled], .checkbox[disabled], .checkbox-inline[disabled], fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"], fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .input-sm { height: 31px; padding: 5px 10px; font-size: 13px; line-height: 1.5; border-radius: 0; } select.input-sm { height: 31px; line-height: 31px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .input-lg { height: 64px; padding: 18px 30px; font-size: 19px; line-height: 1.33; border-radius: 0; } select.input-lg { height: 64px; line-height: 64px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 53.75px; } .has-feedback .form-control-feedback { position: absolute; top: 26px; right: 0; display: block; width: 43px; height: 43px; line-height: 43px; text-align: center; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline { color: #ffffff; } .has-success .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-success .input-group-addon { color: #ffffff; border-color: #ffffff; background-color: #3fb618; } .has-success .form-control-feedback { color: #ffffff; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline { color: #ffffff; } .has-warning .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-warning .input-group-addon { color: #ffffff; border-color: #ffffff; background-color: #ff7518; } .has-warning .form-control-feedback { color: #ffffff; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline { color: #ffffff; } .has-error .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-error .input-group-addon { color: #ffffff; border-color: #ffffff; background-color: #ff0039; } .has-error .form-control-feedback { color: #ffffff; } .form-control-static { margin-bottom: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; padding-left: 0; vertical-align: middle; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: none; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { margin-top: 0; margin-bottom: 0; padding-top: 11px; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 32px; } .form-horizontal .form-group { margin-left: -15px; margin-right: -15px; } .form-horizontal .form-control-static { padding-top: 11px; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; } } .form-horizontal .has-feedback .form-control-feedback { top: 0; right: 15px; } .btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; vertical-align: middle; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 10px 18px; font-size: 15px; line-height: 1.42857143; border-radius: 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .btn:focus, .btn:active:focus, .btn.active:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus { color: #ffffff; text-decoration: none; } .btn:active, .btn.active { outline: 0; background-image: none; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; pointer-events: none; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } .btn-default { color: #ffffff; background-color: #222222; border-color: #222222; } .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { color: #ffffff; background-color: #0e0e0e; border-color: #040404; } .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #222222; border-color: #222222; } .btn-default .badge { color: #222222; background-color: #ffffff; } .btn-primary { color: #ffffff; background-color: #007fff; border-color: #007fff; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { color: #ffffff; background-color: #006bd6; border-color: #0061c2; } .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #007fff; border-color: #007fff; } .btn-primary .badge { color: #007fff; background-color: #ffffff; } .btn-success { color: #ffffff; background-color: #3fb618; border-color: #3fb618; } .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { color: #ffffff; background-color: #339213; border-color: #2c8011; } .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #3fb618; border-color: #3fb618; } .btn-success .badge { color: #3fb618; background-color: #ffffff; } .btn-info { color: #ffffff; background-color: #9954bb; border-color: #9954bb; } .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { color: #ffffff; background-color: #8441a5; border-color: #783c96; } .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #9954bb; border-color: #9954bb; } .btn-info .badge { color: #9954bb; background-color: #ffffff; } .btn-warning { color: #ffffff; background-color: #ff7518; border-color: #ff7518; } .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { color: #ffffff; background-color: #ee6000; border-color: #da5800; } .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #ff7518; border-color: #ff7518; } .btn-warning .badge { color: #ff7518; background-color: #ffffff; } .btn-danger { color: #ffffff; background-color: #ff0039; border-color: #ff0039; } .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { color: #ffffff; background-color: #d60030; border-color: #c2002b; } .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #ff0039; border-color: #ff0039; } .btn-danger .badge { color: #ff0039; background-color: #ffffff; } .btn-link { color: #007fff; font-weight: normal; cursor: pointer; border-radius: 0; } .btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #0059b3; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #999999; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 18px 30px; font-size: 19px; line-height: 1.33; border-radius: 0; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 13px; line-height: 1.5; border-radius: 0; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 13px; line-height: 1.5; border-radius: 0; } .btn-block { display: block; width: 100%; padding-left: 0; padding-right: 0; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition: height 0.35s ease; transition: height 0.35s ease; } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px solid; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; list-style: none; font-size: 15px; background-color: #ffffff; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 0; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9.5px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #333333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { text-decoration: none; color: #ffffff; background-color: #007fff; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; outline: 0; background-color: #007fff; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #999999; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); cursor: not-allowed; } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { left: auto; right: 0; } .dropdown-menu-left { left: 0; right: auto; } .dropdown-header { display: block; padding: 3px 20px; font-size: 13px; line-height: 1.42857143; color: #999999; } .dropdown-backdrop { position: fixed; left: 0; right: 0; bottom: 0; top: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0; border-bottom: 4px solid; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { left: auto; right: 0; } .navbar-right .dropdown-menu-left { left: 0; right: auto; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group > .btn:focus, .btn-group-vertical > .btn:focus { outline: none; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child > .btn:last-child, .btn-group > .btn-group:first-child > .dropdown-toggle { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn-group:last-child > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-left: 8px; padding-right: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-left: 12px; padding-right: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-bottom-left-radius: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { float: none; display: table-cell; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } [data-toggle="buttons"] > .btn > input[type="radio"], [data-toggle="buttons"] > .btn > input[type="checkbox"] { display: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-left: 0; padding-right: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 64px; padding: 18px 30px; font-size: 19px; line-height: 1.33; border-radius: 0; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 64px; line-height: 64px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 31px; padding: 5px 10px; font-size: 13px; line-height: 1.5; border-radius: 0; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 31px; line-height: 31px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 10px 18px; font-size: 15px; font-weight: normal; line-height: 1; color: #333333; text-align: center; background-color: #e6e6e6; border: 1px solid #cccccc; border-radius: 0; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 13px; border-radius: 0; } .input-group-addon.input-lg { padding: 18px 30px; font-size: 19px; border-radius: 0; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-bottom-right-radius: 0; border-top-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { margin-left: -1px; } .nav { margin-bottom: 0; padding-left: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #e6e6e6; } .nav > li.disabled > a { color: #999999; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #999999; text-decoration: none; background-color: transparent; cursor: not-allowed; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #e6e6e6; border-color: #007fff; } .nav .nav-divider { height: 1px; margin: 9.5px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #dddddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 0 0 0 0; } .nav-tabs > li > a:hover { border-color: #e6e6e6 #e6e6e6 #dddddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; background-color: #ffffff; border: 1px solid #dddddd; border-bottom-color: transparent; cursor: default; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 0 0 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #ffffff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 0; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #ffffff; background-color: #007fff; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 0 0 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #ffffff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; min-height: 50px; margin-bottom: 21px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 0; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { max-height: 340px; overflow-x: visible; padding-right: 15px; padding-left: 15px; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-left: 0; padding-right: 0; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; padding: 14.5px 15px; font-size: 19px; line-height: 21px; height: 50px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; margin-right: 15px; padding: 9px 10px; margin-top: 8px; margin-bottom: 8px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 0; } .navbar-toggle:focus { outline: none; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.25px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 21px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 21px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 14.5px; padding-bottom: 14.5px; } .navbar-nav.navbar-right:last-child { margin-right: -15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; } } .navbar-form { margin-left: -15px; margin-right: -15px; padding: 10px 15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); margin-top: 3.5px; margin-bottom: 3.5px; } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; padding-left: 0; vertical-align: middle; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { float: none; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } } @media (min-width: 768px) { .navbar-form { width: auto; border: 0; margin-left: 0; margin-right: 0; padding-top: 0; padding-bottom: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-form.navbar-right:last-child { margin-right: -15px; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 3.5px; margin-bottom: 3.5px; } .navbar-btn.btn-sm { margin-top: 9.5px; margin-bottom: 9.5px; } .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; } .navbar-text { margin-top: 14.5px; margin-bottom: 14.5px; } @media (min-width: 768px) { .navbar-text { float: left; margin-left: 15px; margin-right: 15px; } .navbar-text.navbar-right:last-child { margin-right: 0; } } .navbar-default { background-color: #222222; border-color: #121212; } .navbar-default .navbar-brand { color: #ffffff; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #ffffff; background-color: none; } .navbar-default .navbar-text { color: #ffffff; } .navbar-default .navbar-nav > li > a { color: #ffffff; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #ffffff; background-color: #090909; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #ffffff; background-color: #090909; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #cccccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: transparent; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #090909; } .navbar-default .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #121212; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: #090909; color: #ffffff; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #ffffff; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: #090909; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: #090909; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #cccccc; background-color: transparent; } } .navbar-default .navbar-link { color: #ffffff; } .navbar-default .navbar-link:hover { color: #ffffff; } .navbar-inverse { background-color: #007fff; border-color: #0066cc; } .navbar-inverse .navbar-brand { color: #ffffff; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #ffffff; background-color: none; } .navbar-inverse .navbar-text { color: #ffffff; } .navbar-inverse .navbar-nav > li > a { color: #ffffff; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #ffffff; background-color: #0066cc; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: #0066cc; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: transparent; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #0066cc; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #006ddb; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #0066cc; color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #0066cc; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #0066cc; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #ffffff; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: #0066cc; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: #0066cc; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #ffffff; background-color: transparent; } } .navbar-inverse .navbar-link { color: #ffffff; } .navbar-inverse .navbar-link:hover { color: #ffffff; } .breadcrumb { padding: 8px 15px; margin-bottom: 21px; list-style: none; background-color: #f5f5f5; border-radius: 0; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; color: #cccccc; } .breadcrumb > .active { color: #999999; } .pagination { display: inline-block; padding-left: 0; margin: 21px 0; border-radius: 0; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 10px 18px; line-height: 1.42857143; text-decoration: none; color: #007fff; background-color: #ffffff; border: 1px solid #dddddd; margin-left: -1px; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 0; border-top-left-radius: 0; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-bottom-right-radius: 0; border-top-right-radius: 0; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { color: #0059b3; background-color: #e6e6e6; border-color: #dddddd; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #999999; background-color: #f5f5f5; border-color: #dddddd; cursor: default; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #999999; background-color: #ffffff; border-color: #dddddd; cursor: not-allowed; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 18px 30px; font-size: 19px; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 0; border-top-left-radius: 0; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-bottom-right-radius: 0; border-top-right-radius: 0; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 13px; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 0; border-top-left-radius: 0; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-bottom-right-radius: 0; border-top-right-radius: 0; } .pager { padding-left: 0; margin: 21px 0; list-style: none; text-align: center; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 0; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #e6e6e6; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #999999; background-color: #ffffff; cursor: not-allowed; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } .label[href]:hover, .label[href]:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #222222; } .label-default[href]:hover, .label-default[href]:focus { background-color: #090909; } .label-primary { background-color: #007fff; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #0066cc; } .label-success { background-color: #3fb618; } .label-success[href]:hover, .label-success[href]:focus { background-color: #2f8912; } .label-info { background-color: #9954bb; } .label-info[href]:hover, .label-info[href]:focus { background-color: #7e3f9d; } .label-warning { background-color: #ff7518; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #e45c00; } .label-danger { background-color: #ff0039; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #cc002e; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 13px; font-weight: bold; color: #ffffff; line-height: 1; vertical-align: baseline; white-space: nowrap; text-align: center; background-color: #007fff; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #007fff; background-color: #ffffff; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding: 30px; margin-bottom: 30px; color: inherit; background-color: #e6e6e6; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 23px; font-weight: 200; } .container .jumbotron { border-radius: 0; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron { padding-left: 60px; padding-right: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 67.5px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 21px; line-height: 1.42857143; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 0; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-left: auto; margin-right: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #007fff; } .thumbnail .caption { padding: 9px; color: #333333; } .alert { padding: 15px; margin-bottom: 21px; border: 1px solid transparent; border-radius: 0; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable { padding-right: 35px; } .alert-dismissable .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { background-color: #3fb618; border-color: #4e9f15; color: #ffffff; } .alert-success hr { border-top-color: #438912; } .alert-success .alert-link { color: #e6e6e6; } .alert-info { background-color: #9954bb; border-color: #7643a8; color: #ffffff; } .alert-info hr { border-top-color: #693c96; } .alert-info .alert-link { color: #e6e6e6; } .alert-warning { background-color: #ff7518; border-color: #ff4309; color: #ffffff; } .alert-warning hr { border-top-color: #ee3800; } .alert-warning .alert-link { color: #e6e6e6; } .alert-danger { background-color: #ff0039; border-color: #f0005e; color: #ffffff; } .alert-danger hr { border-top-color: #d60054; } .alert-danger .alert-link { color: #e6e6e6; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { overflow: hidden; height: 21px; margin-bottom: 21px; background-color: #cccccc; border-radius: 0; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0%; height: 100%; font-size: 13px; line-height: 21px; color: #ffffff; text-align: center; background-color: #007fff; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; } .progress.active .progress-bar { -webkit-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #3fb618; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #9954bb; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #ff7518; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #ff0039; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .media, .media-body { overflow: hidden; zoom: 1; } .media, .media .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media-object { display: block; } .media-heading { margin: 0 0 5px; } .media > .pull-left { margin-right: 10px; } .media > .pull-right { margin-left: 10px; } .media-list { padding-left: 0; list-style: none; } .list-group { margin-bottom: 20px; padding-left: 0; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #ffffff; border: 1px solid #dddddd; } .list-group-item:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } a.list-group-item { color: #555555; } a.list-group-item .list-group-item-heading { color: #333333; } a.list-group-item:hover, a.list-group-item:focus { text-decoration: none; background-color: #f5f5f5; } a.list-group-item.active, a.list-group-item.active:hover, a.list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #007fff; border-color: #007fff; } a.list-group-item.active .list-group-item-heading, a.list-group-item.active:hover .list-group-item-heading, a.list-group-item.active:focus .list-group-item-heading { color: inherit; } a.list-group-item.active .list-group-item-text, a.list-group-item.active:hover .list-group-item-text, a.list-group-item.active:focus .list-group-item-text { color: #cce5ff; } .list-group-item-success { color: #ffffff; background-color: #3fb618; } a.list-group-item-success { color: #ffffff; } a.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, a.list-group-item-success:focus { color: #ffffff; background-color: #379f15; } a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-info { color: #ffffff; background-color: #9954bb; } a.list-group-item-info { color: #ffffff; } a.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, a.list-group-item-info:focus { color: #ffffff; background-color: #8d46b0; } a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-warning { color: #ffffff; background-color: #ff7518; } a.list-group-item-warning { color: #ffffff; } a.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, a.list-group-item-warning:focus { color: #ffffff; background-color: #fe6600; } a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-danger { color: #ffffff; background-color: #ff0039; } a.list-group-item-danger { color: #ffffff; } a.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, a.list-group-item-danger:focus { color: #ffffff; background-color: #e60033; } a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 21px; background-color: #ffffff; border: 1px solid transparent; border-radius: 0; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: -1; border-top-left-radius: -1; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 17px; color: inherit; } .panel-title > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #dddddd; border-bottom-right-radius: -1; border-bottom-left-radius: -1; } .panel > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-right-radius: -1; border-top-left-radius: -1; } .panel > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: -1; border-bottom-left-radius: -1; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table { margin-bottom: 0; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-right-radius: -1; border-top-left-radius: -1; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: -1; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: -1; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: -1; border-bottom-left-radius: -1; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: -1; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: -1; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive { border-top: 1px solid #dddddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { border: 0; margin-bottom: 0; } .panel-group { margin-bottom: 21px; } .panel-group .panel { margin-bottom: 0; border-radius: 0; overflow: hidden; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse .panel-body { border-top: 1px solid #dddddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #dddddd; } .panel-default { border-color: #dddddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; border-color: #dddddd; } .panel-default > .panel-heading + .panel-collapse .panel-body { border-top-color: #dddddd; } .panel-default > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #dddddd; } .panel-primary { border-color: #007fff; } .panel-primary > .panel-heading { color: #ffffff; background-color: #007fff; border-color: #007fff; } .panel-primary > .panel-heading + .panel-collapse .panel-body { border-top-color: #007fff; } .panel-primary > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #007fff; } .panel-success { border-color: #4e9f15; } .panel-success > .panel-heading { color: #ffffff; background-color: #3fb618; border-color: #4e9f15; } .panel-success > .panel-heading + .panel-collapse .panel-body { border-top-color: #4e9f15; } .panel-success > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #4e9f15; } .panel-info { border-color: #7643a8; } .panel-info > .panel-heading { color: #ffffff; background-color: #9954bb; border-color: #7643a8; } .panel-info > .panel-heading + .panel-collapse .panel-body { border-top-color: #7643a8; } .panel-info > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #7643a8; } .panel-warning { border-color: #ff4309; } .panel-warning > .panel-heading { color: #ffffff; background-color: #ff7518; border-color: #ff4309; } .panel-warning > .panel-heading + .panel-collapse .panel-body { border-top-color: #ff4309; } .panel-warning > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #ff4309; } .panel-danger { border-color: #f0005e; } .panel-danger > .panel-heading { color: #ffffff; background-color: #ff0039; border-color: #f0005e; } .panel-danger > .panel-heading + .panel-collapse .panel-body { border-top-color: #f0005e; } .panel-danger > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #f0005e; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 0; } .well-sm { padding: 9px; border-radius: 0; } .close { float: right; font-size: 22.5px; font-weight: bold; line-height: 1; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } .modal { display: none; overflow: auto; overflow-y: scroll; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0); } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #ffffff; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 0; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; outline: none; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { padding: 15px; border-bottom: 1px solid #e5e5e5; min-height: 16.42857143px; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 20px; } .modal-footer { margin-top: 15px; padding: 19px 20px 20px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1030; display: block; visibility: visible; font-size: 13px; line-height: 1.4; opacity: 0; filter: alpha(opacity=0); } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { margin-top: -3px; padding: 5px 0; } .tooltip.right { margin-left: 3px; padding: 0 5px; } .tooltip.bottom { margin-top: 3px; padding: 5px 0; } .tooltip.left { margin-left: -3px; padding: 0 5px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: rgba(0, 0, 0, 0.9); border-radius: 0; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: rgba(0, 0, 0, 0.9); } .tooltip.top-left .tooltip-arrow { bottom: 0; left: 5px; border-width: 5px 5px 0; border-top-color: rgba(0, 0, 0, 0.9); } .tooltip.top-right .tooltip-arrow { bottom: 0; right: 5px; border-width: 5px 5px 0; border-top-color: rgba(0, 0, 0, 0.9); } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: rgba(0, 0, 0, 0.9); } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: rgba(0, 0, 0, 0.9); } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: rgba(0, 0, 0, 0.9); } .tooltip.bottom-left .tooltip-arrow { top: 0; left: 5px; border-width: 0 5px 5px; border-bottom-color: rgba(0, 0, 0, 0.9); } .tooltip.bottom-right .tooltip-arrow { top: 0; right: 5px; border-width: 0 5px 5px; border-bottom-color: rgba(0, 0, 0, 0.9); } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; max-width: 276px; padding: 1px; text-align: left; background-color: #ffffff; background-clip: padding-box; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 0; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); white-space: normal; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { margin: 0; padding: 8px 14px; font-size: 15px; font-weight: normal; line-height: 18px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { border-width: 10px; content: ""; } .popover.top > .arrow { left: 50%; margin-left: -11px; border-bottom-width: 0; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); bottom: -11px; } .popover.top > .arrow:after { content: " "; bottom: 1px; margin-left: -10px; border-bottom-width: 0; border-top-color: #ffffff; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-left-width: 0; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); } .popover.right > .arrow:after { content: " "; left: 1px; bottom: -10px; border-left-width: 0; border-right-color: #ffffff; } .popover.bottom > .arrow { left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); top: -11px; } .popover.bottom > .arrow:after { content: " "; top: 1px; margin-left: -10px; border-top-width: 0; border-bottom-color: #ffffff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); } .popover.left > .arrow:after { content: " "; right: 1px; border-right-width: 0; border-left-color: #ffffff; bottom: -10px; } .carousel { position: relative; } .carousel-inner { position: relative; overflow: hidden; width: 100%; } .carousel-inner > .item { display: none; position: relative; -webkit-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; left: 0; bottom: 0; width: 15%; opacity: 0.5; filter: alpha(opacity=50); font-size: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-control.left { background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { left: auto; right: 0; background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { outline: none; color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; margin-top: -10px; margin-left: -10px; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; margin-left: -30%; padding-left: 0; list-style: none; text-align: center; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; border: 1px solid #ffffff; border-radius: 10px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); } .carousel-indicators .active { margin: 0; width: 12px; height: 12px; background-color: #ffffff; } .carousel-caption { position: absolute; left: 15%; right: 15%; bottom: 20px; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; margin-left: -15px; font-size: 30px; } .carousel-caption { left: 20%; right: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-footer:before, .modal-footer:after { content: " "; display: table; } .clearfix:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-footer:after { clear: both; } .center-block { display: block; margin-left: auto; margin-right: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; visibility: hidden !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } @media print { .hidden-print { display: none !important; } } .navbar-inverse .badge { background-color: #fff; color: #007fff; } .btn-lg, .btn-group-lg > .btn { padding-top: 19px; } .text-primary, .text-primary:hover { color: #007fff; } .text-success, .text-success:hover { color: #3fb618; } .text-danger, .text-danger:hover { color: #ff0039; } .text-warning, .text-warning:hover { color: #ff7518; } .text-info, .text-info:hover { color: #9954bb; } table a, .table a { text-decoration: underline; } table .success, .table .success, table .warning, .table .warning, table .danger, .table .danger, table .info, .table .info { color: #fff; } table .success a, .table .success a, table .warning a, .table .warning a, table .danger a, .table .danger a, table .info a, .table .info a { color: #fff; } .has-warning .help-block, .has-warning .control-label, .has-warning .form-control-feedback { color: #ff7518; } .has-warning .form-control, .has-warning .form-control:focus { border: 1px solid #ff7518; } .has-error .help-block, .has-error .control-label, .has-error .form-control-feedback { color: #ff0039; } .has-error .form-control, .has-error .form-control:focus { border: 1px solid #ff0039; } .has-success .help-block, .has-success .control-label, .has-success .form-control-feedback { color: #3fb618; } .has-success .form-control, .has-success .form-control:focus { border: 1px solid #3fb618; } .nav-pills > li > a { border-radius: 0; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background-image: none; } .alert { border: none; } .alert .alert-link { text-decoration: underline; color: #fff; } .alert .close { color: #fff; text-decoration: none; opacity: 0.4; } .alert .close:hover, .alert .close:focus { color: #fff; opacity: 1; } .label { border-radius: 0; } .progress { height: 8px; -webkit-box-shadow: none; box-shadow: none; } .progress .progress-bar { font-size: 8px; line-height: 8px; } .panel-heading, .panel-footer { border-top-right-radius: 0; border-top-left-radius: 0; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/bootstrap/themes/bootstrap-theme-cyborg.css ================================================ @import url("//fonts.googleapis.com/css?family=Droid+Sans:400,700"); /*! * Bootstrap v3.0.0 * * Copyright 2013 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. */ /*! normalize.css v2.1.0 | MIT License | git.io/normalize */ article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } audio, canvas, video { display: inline-block; } audio:not([controls]) { display: none; height: 0; } [hidden] { display: none; } html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } a:focus { outline: thin dotted; } a:active, a:hover { outline: 0; } h1 { margin: 0.67em 0; font-size: 2em; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } hr { height: 0; -moz-box-sizing: content-box; box-sizing: content-box; } mark { color: #000; background: #ff0; } code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } pre { white-space: pre-wrap; } q { quotes: "\201C" "\201D" "\2018" "\2019"; } small { font-size: 80%; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 0; } fieldset { padding: 0.35em 0.625em 0.75em; margin: 0 2px; border: 1px solid #c0c0c0; } legend { padding: 0; border: 0; } button, input, select, textarea { margin: 0; font-family: inherit; font-size: 100%; } button, input { line-height: normal; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; } button[disabled], html input[disabled] { cursor: default; } input[type="checkbox"], input[type="radio"] { padding: 0; box-sizing: border-box; } input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } textarea { overflow: auto; vertical-align: top; } table { border-collapse: collapse; border-spacing: 0; } @media print { * { color: #000 !important; text-shadow: none !important; background: transparent !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } @page { margin: 2cm .5cm; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .table td, .table th { background-color: #fff !important; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } *, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 62.5%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Droid Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.428571429; color: #888888; background-color: #060606; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } button, input, select[multiple], textarea { background-image: none; } a { color: #2a9fd6; text-decoration: none; } a:hover, a:focus { color: #2a9fd6; text-decoration: underline; } a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } img { vertical-align: middle; } .img-responsive { display: block; height: auto; max-width: 100%; } .img-rounded { border-radius: 6px; } .img-thumbnail { display: inline-block; height: auto; max-width: 100%; padding: 4px; line-height: 1.428571429; background-color: #060606; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #282828; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16.099999999999998px; font-weight: 200; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small { font-size: 85%; } cite { font-style: normal; } .text-muted { color: #888888; } .text-primary { color: #2a9fd6; } .text-warning { color: #ffffff; } .text-danger { color: #ffffff; } .text-success { color: #ffffff; } .text-info { color: #ffffff; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: "Droid Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small { font-weight: normal; line-height: 1; color: #888888; } h1, h2, h3 { margin-top: 20px; margin-bottom: 10px; } h4, h5, h6 { margin-top: 10px; margin-bottom: 10px; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } h1 small, .h1 small { font-size: 24px; } h2 small, .h2 small { font-size: 18px; } h3 small, .h3 small, h4 small, .h4 small { font-size: 14px; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #282828; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-bottom: 20px; } dt, dd { line-height: 1.428571429; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 800px) { .dl-horizontal dt { float: left; width: 160px; overflow: hidden; clear: left; text-align: right; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #888888; } abbr.initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; border-left: 5px solid #282828; } blockquote p { font-size: 17.5px; font-weight: 300; line-height: 1.25; } blockquote p:last-child { margin-bottom: 0; } blockquote small { display: block; line-height: 1.428571429; color: #555555; } blockquote small:before { content: '\2014 \00A0'; } blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #282828; border-left: 0; } blockquote.pull-right p, blockquote.pull-right small { text-align: right; } blockquote.pull-right small:before { content: ''; } blockquote.pull-right small:after { content: '\00A0 \2014'; } q:before, q:after, blockquote:before, blockquote:after { content: ""; } address { display: block; margin-bottom: 20px; font-style: normal; line-height: 1.428571429; } code, pre { font-family: Monaco, Menlo, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; white-space: nowrap; background-color: #f9f2f4; border-radius: 4px; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.428571429; color: #282828; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px; } pre.prettyprint { margin-bottom: 20px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .row { margin-right: -15px; margin-left: -15px; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11 { float: left; } .col-xs-1 { width: 8.333333333333332%; } .col-xs-2 { width: 16.666666666666664%; } .col-xs-3 { width: 25%; } .col-xs-4 { width: 33.33333333333333%; } .col-xs-5 { width: 41.66666666666667%; } .col-xs-6 { width: 50%; } .col-xs-7 { width: 58.333333333333336%; } .col-xs-8 { width: 66.66666666666666%; } .col-xs-9 { width: 75%; } .col-xs-10 { width: 83.33333333333334%; } .col-xs-11 { width: 91.66666666666666%; } .col-xs-12 { width: 100%; } @media (min-width: 768px) { .container { max-width: 750px; } .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11 { float: left; } .col-sm-1 { width: 8.333333333333332%; } .col-sm-2 { width: 16.666666666666664%; } .col-sm-3 { width: 25%; } .col-sm-4 { width: 33.33333333333333%; } .col-sm-5 { width: 41.66666666666667%; } .col-sm-6 { width: 50%; } .col-sm-7 { width: 58.333333333333336%; } .col-sm-8 { width: 66.66666666666666%; } .col-sm-9 { width: 75%; } .col-sm-10 { width: 83.33333333333334%; } .col-sm-11 { width: 91.66666666666666%; } .col-sm-12 { width: 100%; } .col-sm-push-1 { left: 8.333333333333332%; } .col-sm-push-2 { left: 16.666666666666664%; } .col-sm-push-3 { left: 25%; } .col-sm-push-4 { left: 33.33333333333333%; } .col-sm-push-5 { left: 41.66666666666667%; } .col-sm-push-6 { left: 50%; } .col-sm-push-7 { left: 58.333333333333336%; } .col-sm-push-8 { left: 66.66666666666666%; } .col-sm-push-9 { left: 75%; } .col-sm-push-10 { left: 83.33333333333334%; } .col-sm-push-11 { left: 91.66666666666666%; } .col-sm-pull-1 { right: 8.333333333333332%; } .col-sm-pull-2 { right: 16.666666666666664%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-4 { right: 33.33333333333333%; } .col-sm-pull-5 { right: 41.66666666666667%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-7 { right: 58.333333333333336%; } .col-sm-pull-8 { right: 66.66666666666666%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-10 { right: 83.33333333333334%; } .col-sm-pull-11 { right: 91.66666666666666%; } .col-sm-offset-1 { margin-left: 8.333333333333332%; } .col-sm-offset-2 { margin-left: 16.666666666666664%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-4 { margin-left: 33.33333333333333%; } .col-sm-offset-5 { margin-left: 41.66666666666667%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-7 { margin-left: 58.333333333333336%; } .col-sm-offset-8 { margin-left: 66.66666666666666%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-10 { margin-left: 83.33333333333334%; } .col-sm-offset-11 { margin-left: 91.66666666666666%; } } @media (min-width: 992px) { .container { max-width: 970px; } .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11 { float: left; } .col-md-1 { width: 8.333333333333332%; } .col-md-2 { width: 16.666666666666664%; } .col-md-3 { width: 25%; } .col-md-4 { width: 33.33333333333333%; } .col-md-5 { width: 41.66666666666667%; } .col-md-6 { width: 50%; } .col-md-7 { width: 58.333333333333336%; } .col-md-8 { width: 66.66666666666666%; } .col-md-9 { width: 75%; } .col-md-10 { width: 83.33333333333334%; } .col-md-11 { width: 91.66666666666666%; } .col-md-12 { width: 100%; } .col-md-push-0 { left: auto; } .col-md-push-1 { left: 8.333333333333332%; } .col-md-push-2 { left: 16.666666666666664%; } .col-md-push-3 { left: 25%; } .col-md-push-4 { left: 33.33333333333333%; } .col-md-push-5 { left: 41.66666666666667%; } .col-md-push-6 { left: 50%; } .col-md-push-7 { left: 58.333333333333336%; } .col-md-push-8 { left: 66.66666666666666%; } .col-md-push-9 { left: 75%; } .col-md-push-10 { left: 83.33333333333334%; } .col-md-push-11 { left: 91.66666666666666%; } .col-md-pull-0 { right: auto; } .col-md-pull-1 { right: 8.333333333333332%; } .col-md-pull-2 { right: 16.666666666666664%; } .col-md-pull-3 { right: 25%; } .col-md-pull-4 { right: 33.33333333333333%; } .col-md-pull-5 { right: 41.66666666666667%; } .col-md-pull-6 { right: 50%; } .col-md-pull-7 { right: 58.333333333333336%; } .col-md-pull-8 { right: 66.66666666666666%; } .col-md-pull-9 { right: 75%; } .col-md-pull-10 { right: 83.33333333333334%; } .col-md-pull-11 { right: 91.66666666666666%; } .col-md-offset-0 { margin-left: 0; } .col-md-offset-1 { margin-left: 8.333333333333332%; } .col-md-offset-2 { margin-left: 16.666666666666664%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-4 { margin-left: 33.33333333333333%; } .col-md-offset-5 { margin-left: 41.66666666666667%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-7 { margin-left: 58.333333333333336%; } .col-md-offset-8 { margin-left: 66.66666666666666%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-10 { margin-left: 83.33333333333334%; } .col-md-offset-11 { margin-left: 91.66666666666666%; } } @media (min-width: 1200px) { .container { max-width: 1170px; } .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11 { float: left; } .col-lg-1 { width: 8.333333333333332%; } .col-lg-2 { width: 16.666666666666664%; } .col-lg-3 { width: 25%; } .col-lg-4 { width: 33.33333333333333%; } .col-lg-5 { width: 41.66666666666667%; } .col-lg-6 { width: 50%; } .col-lg-7 { width: 58.333333333333336%; } .col-lg-8 { width: 66.66666666666666%; } .col-lg-9 { width: 75%; } .col-lg-10 { width: 83.33333333333334%; } .col-lg-11 { width: 91.66666666666666%; } .col-lg-12 { width: 100%; } .col-lg-push-0 { left: auto; } .col-lg-push-1 { left: 8.333333333333332%; } .col-lg-push-2 { left: 16.666666666666664%; } .col-lg-push-3 { left: 25%; } .col-lg-push-4 { left: 33.33333333333333%; } .col-lg-push-5 { left: 41.66666666666667%; } .col-lg-push-6 { left: 50%; } .col-lg-push-7 { left: 58.333333333333336%; } .col-lg-push-8 { left: 66.66666666666666%; } .col-lg-push-9 { left: 75%; } .col-lg-push-10 { left: 83.33333333333334%; } .col-lg-push-11 { left: 91.66666666666666%; } .col-lg-pull-0 { right: auto; } .col-lg-pull-1 { right: 8.333333333333332%; } .col-lg-pull-2 { right: 16.666666666666664%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-4 { right: 33.33333333333333%; } .col-lg-pull-5 { right: 41.66666666666667%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-7 { right: 58.333333333333336%; } .col-lg-pull-8 { right: 66.66666666666666%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-10 { right: 83.33333333333334%; } .col-lg-pull-11 { right: 91.66666666666666%; } .col-lg-offset-0 { margin-left: 0; } .col-lg-offset-1 { margin-left: 8.333333333333332%; } .col-lg-offset-2 { margin-left: 16.666666666666664%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-4 { margin-left: 33.33333333333333%; } .col-lg-offset-5 { margin-left: 41.66666666666667%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-7 { margin-left: 58.333333333333336%; } .col-lg-offset-8 { margin-left: 66.66666666666666%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-10 { margin-left: 83.33333333333334%; } .col-lg-offset-11 { margin-left: 91.66666666666666%; } } table { max-width: 100%; background-color: #181818; } th { text-align: left; } .table { width: 100%; margin-bottom: 20px; } .table thead > tr > th, .table tbody > tr > th, .table tfoot > tr > th, .table thead > tr > td, .table tbody > tr > td, .table tfoot > tr > td { padding: 8px; line-height: 1.428571429; vertical-align: top; border-top: 1px solid #282828; } .table thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #282828; } .table caption + thead tr:first-child th, .table colgroup + thead tr:first-child th, .table thead:first-child tr:first-child th, .table caption + thead tr:first-child td, .table colgroup + thead tr:first-child td, .table thead:first-child tr:first-child td { border-top: 0; } .table tbody + tbody { border-top: 2px solid #282828; } .table .table { background-color: #060606; } .table-condensed thead > tr > th, .table-condensed tbody > tr > th, .table-condensed tfoot > tr > th, .table-condensed thead > tr > td, .table-condensed tbody > tr > td, .table-condensed tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #282828; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #282828; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-child(odd) > td, .table-striped > tbody > tr:nth-child(odd) > th { background-color: #080808; } .table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th { background-color: #282828; } table col[class*="col-"] { display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { display: table-cell; float: none; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #282828; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #77b300; border-color: #809a00; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td { background-color: #669a00; border-color: #6a8000; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #cc0000; border-color: #bd001f; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td { background-color: #b30000; border-color: #a3001b; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #ff8800; border-color: #f05800; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td { background-color: #e67a00; border-color: #d64f00; } @media (max-width: 768px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-x: scroll; overflow-y: hidden; border: 1px solid #282828; } .table-responsive > .table { margin-bottom: 0; background-color: #fff; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > thead > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > thead > tr:last-child > td, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #888888; border: 0; border-bottom: 1px solid #282828; } label { display: inline-block; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; /* IE8-9 */ line-height: normal; } input[type="file"] { display: block; } select[multiple], select[size] { height: auto; } select optgroup { font-family: inherit; font-size: inherit; font-style: inherit; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { height: auto; } .form-control:-moz-placeholder { color: #888888; } .form-control::-moz-placeholder { color: #888888; } .form-control:-ms-input-placeholder { color: #888888; } .form-control::-webkit-input-placeholder { color: #888888; } .form-control { display: block; width: 100%; height: 38px; padding: 8px 12px; font-size: 14px; line-height: 1.428571429; color: #888888; vertical-align: middle; background-color: #ffffff; border: 1px solid #282828; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { cursor: not-allowed; background-color: #adafae; } textarea.form-control { height: auto; } .form-group { margin-bottom: 15px; } .radio, .checkbox { display: block; min-height: 20px; padding-left: 20px; margin-top: 10px; margin-bottom: 10px; vertical-align: middle; } .radio label, .checkbox label { display: inline; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], .radio[disabled], .radio-inline[disabled], .checkbox[disabled], .checkbox-inline[disabled], fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"], fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm { height: auto; } .input-lg { height: 56px; padding: 14px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-lg { height: 56px; line-height: 56px; } textarea.input-lg { height: auto; } .has-warning .help-block, .has-warning .control-label { color: #ffffff; } .has-warning .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-warning .input-group-addon { color: #ffffff; background-color: #ff8800; border-color: #ffffff; } .has-error .help-block, .has-error .control-label { color: #ffffff; } .has-error .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-error .input-group-addon { color: #ffffff; background-color: #cc0000; border-color: #ffffff; } .has-success .help-block, .has-success .control-label { color: #ffffff; } .has-success .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-success .input-group-addon { color: #ffffff; background-color: #77b300; border-color: #ffffff; } .form-control-static { padding-top: 9px; margin-bottom: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #c8c8c8; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; } .form-inline .radio, .form-inline .checkbox { display: inline-block; padding-left: 0; margin-top: 0; margin-bottom: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 9px; margin-top: 0; margin-bottom: 0; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; } } .btn { display: inline-block; padding: 8px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; line-height: 1.428571429; text-align: center; white-space: nowrap; vertical-align: middle; cursor: pointer; border: 1px solid transparent; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; } .btn:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus { color: #ffffff; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { pointer-events: none; cursor: not-allowed; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } .btn-default { color: #ffffff; background-color: #424242; border-color: #424242; } .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { color: #ffffff; background-color: #2d2d2d; border-color: #232323; } .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #424242; border-color: #424242; } .btn-primary { color: #ffffff; background-color: #2a9fd6; border-color: #2a9fd6; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { color: #ffffff; background-color: #2386b4; border-color: #1f79a3; } .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #2a9fd6; border-color: #2a9fd6; } .btn-warning { color: #ffffff; background-color: #ff8800; border-color: #ff8800; } .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { color: #ffffff; background-color: #d67200; border-color: #c26700; } .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #ff8800; border-color: #ff8800; } .btn-danger { color: #ffffff; background-color: #cc0000; border-color: #cc0000; } .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { color: #ffffff; background-color: #a30000; border-color: #8f0000; } .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #cc0000; border-color: #cc0000; } .btn-success { color: #ffffff; background-color: #77b300; border-color: #77b300; } .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { color: #ffffff; background-color: #5c8a00; border-color: #4e7600; } .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #77b300; border-color: #77b300; } .btn-info { color: #ffffff; background-color: #9933cc; border-color: #9933cc; } .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { color: #ffffff; background-color: #812bab; border-color: #74279b; } .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #9933cc; border-color: #9933cc; } .btn-link { font-weight: normal; color: #2a9fd6; cursor: pointer; border-radius: 0; } .btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #2a9fd6; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #888888; text-decoration: none; } .btn-lg { padding: 14px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-sm, .btn-xs { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs { padding: 1px 5px; } .btn-block { display: block; width: 100%; padding-right: 0; padding-left: 0; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition: height 0.35s ease; transition: height 0.35s ease; } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; -webkit-font-smoothing: antialiased; font-style: normal; font-weight: normal; line-height: 1; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-briefcase:before { content: "\1f4bc"; } .glyphicon-calendar:before { content: "\1f4c5"; } .glyphicon-pushpin:before { content: "\1f4cc"; } .glyphicon-paperclip:before { content: "\1f4ce"; } .glyphicon-camera:before { content: "\1f4f7"; } .glyphicon-lock:before { content: "\1f512"; } .glyphicon-bell:before { content: "\1f514"; } .glyphicon-bookmark:before { content: "\1f516"; } .glyphicon-fire:before { content: "\1f525"; } .glyphicon-wrench:before { content: "\1f527"; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px solid #000000; border-right: 4px solid transparent; border-bottom: 0 dotted; border-left: 4px solid transparent; content: ""; } .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; list-style: none; background-color: #222222; border: 1px solid #444444; border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: rgba(255, 255, 255, 0.1); } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.428571429; color: #ffffff; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #ffffff; text-decoration: none; background-color: #2a9fd6; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; background-color: #2a9fd6; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #888888; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.428571429; color: #888888; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0 dotted; border-bottom: 4px solid #000000; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } } .btn-default .caret { border-top-color: #ffffff; } .btn-primary .caret, .btn-success .caret, .btn-warning .caret, .btn-danger .caret, .btn-info .caret { border-top-color: #fff; } .dropup .btn-default .caret { border-bottom-color: #ffffff; } .dropup .btn-primary .caret, .dropup .btn-success .caret, .dropup .btn-warning .caret, .dropup .btn-danger .caret, .dropup .btn-info .caret { border-bottom-color: #fff; } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group > .btn:focus, .btn-group-vertical > .btn:focus { outline: none; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar .btn-group { float: left; } .btn-toolbar > .btn + .btn, .btn-toolbar > .btn-group + .btn, .btn-toolbar > .btn + .btn-group, .btn-toolbar > .btn-group + .btn-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child > .btn:last-child, .btn-group > .btn-group:first-child > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group-xs > .btn { padding: 5px 10px; padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-group-lg > .btn { padding: 14px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-right-radius: 0; border-bottom-left-radius: 4px; border-top-left-radius: 0; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child > .btn:last-child, .btn-group-vertical > .btn-group:first-child > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; border-collapse: separate; table-layout: fixed; } .btn-group-justified .btn { display: table-cell; float: none; width: 1%; } [data-toggle="buttons"] > .btn > input[type="radio"], [data-toggle="buttons"] > .btn > input[type="checkbox"] { display: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group.col { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 56px; padding: 14px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 56px; line-height: 56px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 8px 12px; font-size: 14px; font-weight: normal; line-height: 1; text-align: center; background-color: #adafae; border: 1px solid #282828; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 14px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -4px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:active { z-index: 2; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #222222; } .nav > li.disabled > a { color: #888888; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #888888; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #222222; border-color: #2a9fd6; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #282828; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.428571429; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: transparent transparent #282828; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #ffffff; cursor: default; background-color: #2a9fd6; border: 1px solid #282828; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { text-align: center; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-bottom: 1px solid #dddddd; } .nav-tabs.nav-justified > .active > a { border-bottom-color: #060606; } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 5px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #ffffff; background-color: #2a9fd6; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { text-align: center; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-bottom: 1px solid #dddddd; } .nav-tabs-justified > .active > a { border-bottom-color: #060606; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tab-content > .tab-pane, .pill-content > .pill-pane { display: none; } .tab-content > .active, .pill-content > .active { display: block; } .nav .caret { border-top-color: #2a9fd6; border-bottom-color: #2a9fd6; } .nav a:hover .caret { border-top-color: #2a9fd6; border-bottom-color: #2a9fd6; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; z-index: 1000; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { max-height: 340px; padding-right: 15px; padding-left: 15px; overflow-x: visible; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-collapse .navbar-nav.navbar-left:first-child { margin-left: -15px; } .navbar-collapse .navbar-nav.navbar-right:last-child { margin-right: -15px; } .navbar-collapse .navbar-text:last-child { margin-right: 0; } } .container > .navbar-header, .container > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; z-index: 1030; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; } .navbar-brand { float: left; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } @media (min-width: 768px) { .navbar > .container .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-top: 8px; margin-right: 15px; margin-bottom: 8px; background-color: transparent; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; } } .navbar-form { padding: 10px 15px; margin-top: 6px; margin-right: -15px; margin-bottom: 6px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; padding-left: 0; margin-top: 0; margin-bottom: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-nav.pull-right > li > .dropdown-menu, .navbar-nav > li > .dropdown-menu.pull-right { right: 0; left: auto; } .navbar-btn { margin-top: 6px; margin-bottom: 6px; } .navbar-text { float: left; margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { margin-right: 15px; margin-left: 15px; } } .navbar-default { background-color: #060606; border-color: #000000; } .navbar-default .navbar-brand { color: #ffffff; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-text { color: #888888; } .navbar-default .navbar-nav > li > a { color: #888888; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #888888; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #282828; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #282828; } .navbar-default .navbar-toggle .icon-bar { background-color: #cccccc; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #000000; } .navbar-default .navbar-nav > .dropdown > a:hover .caret, .navbar-default .navbar-nav > .dropdown > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav > .open > a .caret, .navbar-default .navbar-nav > .open > a:hover .caret, .navbar-default .navbar-nav > .open > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-default .navbar-nav > .dropdown > a .caret { border-top-color: #888888; border-bottom-color: #888888; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #888888; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #888888; background-color: transparent; } } .navbar-default .navbar-link { color: #888888; } .navbar-default .navbar-link:hover { color: #ffffff; } .navbar-inverse { background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #ffffff; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { color: #888888; } .navbar-inverse .navbar-nav > li > a { color: #888888; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #aaaaaa; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .dropdown > a:hover .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-inverse .navbar-nav > .dropdown > a .caret { border-top-color: #888888; border-bottom-color: #888888; } .navbar-inverse .navbar-nav > .open > a .caret, .navbar-inverse .navbar-nav > .open > a:hover .caret, .navbar-inverse .navbar-nav > .open > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #888888; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #aaaaaa; background-color: transparent; } } .navbar-inverse .navbar-link { color: #888888; } .navbar-inverse .navbar-link:hover { color: #ffffff; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #222222; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #ffffff; content: "/\00a0"; } .breadcrumb > .active { color: #888888; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 8px 12px; margin-left: -1px; line-height: 1.428571429; text-decoration: none; background-color: #222222; border: 1px solid #282828; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 4px; border-top-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { background-color: #adafae; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #ffffff; cursor: default; background-color: #2a9fd6; border-color: #2a9fd6; } .pagination > .disabled > span, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #888888; cursor: not-allowed; background-color: #222222; border-color: #282828; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 14px 16px; font-size: 18px; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 6px; border-top-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #222222; border: 1px solid #282828; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #adafae; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #888888; cursor: not-allowed; background-color: #222222; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } .label[href]:hover, .label[href]:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .label-default { background-color: #424242; } .label-default[href]:hover, .label-default[href]:focus { background-color: #282828; } .label-primary { background-color: #2a9fd6; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #2180ac; } .label-success { background-color: #77b300; } .label-success[href]:hover, .label-success[href]:focus { background-color: #558000; } .label-info { background-color: #9933cc; } .label-info[href]:hover, .label-info[href]:focus { background-color: #7a29a3; } .label-warning { background-color: #ff8800; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #cc6d00; } .label-danger { background-color: #cc0000; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #990000; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; background-color: #2a9fd6; border-radius: 10px; } .badge:empty { display: none; } a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .btn .badge { position: relative; top: -1px; } a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #2a9fd6; background-color: #ffffff; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding: 30px; margin-bottom: 30px; font-size: 21px; font-weight: 200; line-height: 2.1428571435; color: inherit; background-color: #151515; } .jumbotron h1 { line-height: 1; color: inherit; } .jumbotron p { line-height: 1.4; } .container .jumbotron { border-radius: 6px; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1 { font-size: 63px; } } .thumbnail { display: inline-block; display: block; height: auto; max-width: 100%; padding: 4px; line-height: 1.428571429; background-color: #060606; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .thumbnail > img { display: block; height: auto; max-width: 100%; } a.thumbnail:hover, a.thumbnail:focus { border-color: #2a9fd6; } .thumbnail > img { margin-right: auto; margin-left: auto; } .thumbnail .caption { padding: 9px; color: #888888; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable { padding-right: 35px; } .alert-dismissable .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #ffffff; background-color: #77b300; border-color: #809a00; } .alert-success hr { border-top-color: #6a8000; } .alert-success .alert-link { color: #e6e6e6; } .alert-info { color: #ffffff; background-color: #9933cc; border-color: #6e2caf; } .alert-info hr { border-top-color: #61279b; } .alert-info .alert-link { color: #e6e6e6; } .alert-warning { color: #ffffff; background-color: #ff8800; border-color: #f05800; } .alert-warning hr { border-top-color: #d64f00; } .alert-warning .alert-link { color: #e6e6e6; } .alert-danger { color: #ffffff; background-color: #cc0000; border-color: #bd001f; } .alert-danger hr { border-top-color: #a3001b; } .alert-danger .alert-link { color: #e6e6e6; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-moz-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #222222; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0; height: 100%; font-size: 12px; color: #ffffff; text-align: center; background-color: #2a9fd6; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; } .progress.active .progress-bar { -webkit-animation: progress-bar-stripes 2s linear infinite; -moz-animation: progress-bar-stripes 2s linear infinite; -ms-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #77b300; } .progress-striped .progress-bar-success { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #9933cc; } .progress-striped .progress-bar-info { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #ff8800; } .progress-striped .progress-bar-warning { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #cc0000; } .progress-striped .progress-bar-danger { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .media, .media-body { overflow: hidden; zoom: 1; } .media, .media .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media-object { display: block; } .media-heading { margin: 0 0 5px; } .media > .pull-left { margin-right: 10px; } .media > .pull-right { margin-left: 10px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #222222; border: 1px solid #282828; } .list-group-item:first-child { border-top-right-radius: 4px; border-top-left-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } a.list-group-item { color: #888888; } a.list-group-item .list-group-item-heading { color: #ffffff; } a.list-group-item:hover, a.list-group-item:focus { text-decoration: none; background-color: #484848; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #2a9fd6; border-color: #2a9fd6; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #d5ecf7; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #222222; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item { border-width: 1px 0; } .panel > .list-group .list-group-item:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .panel > .list-group .list-group-item:last-child { border-bottom: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .panel > .table { margin-bottom: 0; } .panel > .panel-body + .table { border-top: 1px solid #282828; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; } .panel-title > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #3c3c3c; border-top: 1px solid #282828; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel-group .panel { margin-bottom: 0; overflow: hidden; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse .panel-body { border-top: 1px solid #282828; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #282828; } .panel-default { border-color: #282828; } .panel-default > .panel-heading { color: #282828; background-color: #3c3c3c; border-color: #282828; } .panel-default > .panel-heading + .panel-collapse .panel-body { border-top-color: #282828; } .panel-default > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #282828; } .panel-primary { border-color: #2a9fd6; } .panel-primary > .panel-heading { color: #ffffff; background-color: #2a9fd6; border-color: #2a9fd6; } .panel-primary > .panel-heading + .panel-collapse .panel-body { border-top-color: #2a9fd6; } .panel-primary > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #2a9fd6; } .panel-success { border-color: #809a00; } .panel-success > .panel-heading { color: #ffffff; background-color: #77b300; border-color: #809a00; } .panel-success > .panel-heading + .panel-collapse .panel-body { border-top-color: #809a00; } .panel-success > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #809a00; } .panel-warning { border-color: #f05800; } .panel-warning > .panel-heading { color: #ffffff; background-color: #ff8800; border-color: #f05800; } .panel-warning > .panel-heading + .panel-collapse .panel-body { border-top-color: #f05800; } .panel-warning > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #f05800; } .panel-danger { border-color: #bd001f; } .panel-danger > .panel-heading { color: #ffffff; background-color: #cc0000; border-color: #bd001f; } .panel-danger > .panel-heading + .panel-collapse .panel-body { border-top-color: #bd001f; } .panel-danger > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #bd001f; } .panel-info { border-color: #6e2caf; } .panel-info > .panel-heading { color: #ffffff; background-color: #9933cc; border-color: #6e2caf; } .panel-info > .panel-heading + .panel-collapse .panel-body { border-top-color: #6e2caf; } .panel-info > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #6e2caf; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #151515; border: 1px solid #030303; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } body.modal-open, .modal-open .navbar-fixed-top, .modal-open .navbar-fixed-bottom { margin-right: 15px; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; display: none; overflow: auto; overflow-y: scroll; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0); } .modal-dialog { z-index: 1050; width: auto; padding: 10px; margin-right: auto; margin-left: auto; } .modal-content { position: relative; background-color: #202020; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; outline: none; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1030; background-color: #000000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { min-height: 16.428571429px; padding: 15px; border-bottom: 1px solid #282828; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.428571429; } .modal-body { position: relative; padding: 20px; } .modal-footer { padding: 19px 20px 20px; margin-top: 15px; text-align: right; border-top: 1px solid #282828; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } @media screen and (min-width: 768px) { .modal-dialog { right: auto; left: 50%; width: 600px; padding-top: 30px; padding-bottom: 30px; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } } .tooltip { position: absolute; z-index: 1030; display: block; font-size: 12px; line-height: 1.4; opacity: 0; filter: alpha(opacity=0); visibility: visible; } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: rgba(0, 0, 0, 0.9); border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-top-color: rgba(0, 0, 0, 0.9); border-width: 5px 5px 0; } .tooltip.top-left .tooltip-arrow { bottom: 0; left: 5px; border-top-color: rgba(0, 0, 0, 0.9); border-width: 5px 5px 0; } .tooltip.top-right .tooltip-arrow { right: 5px; bottom: 0; border-top-color: rgba(0, 0, 0, 0.9); border-width: 5px 5px 0; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-right-color: rgba(0, 0, 0, 0.9); border-width: 5px 5px 5px 0; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-left-color: rgba(0, 0, 0, 0.9); border-width: 5px 0 5px 5px; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-bottom-color: rgba(0, 0, 0, 0.9); border-width: 0 5px 5px; } .tooltip.bottom-left .tooltip-arrow { top: 0; left: 5px; border-bottom-color: rgba(0, 0, 0, 0.9); border-width: 0 5px 5px; } .tooltip.bottom-right .tooltip-arrow { top: 0; right: 5px; border-bottom-color: rgba(0, 0, 0, 0.9); border-width: 0 5px 5px; } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; max-width: 276px; padding: 1px; text-align: left; white-space: normal; background-color: #202020; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); background-clip: padding-box; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; font-weight: normal; line-height: 18px; background-color: #181818; border-bottom: 1px solid #0b0b0b; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover .arrow, .popover .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover .arrow { border-width: 11px; } .popover .arrow:after { border-width: 10px; content: ""; } .popover.top .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); border-bottom-width: 0; } .popover.top .arrow:after { bottom: 1px; margin-left: -10px; border-top-color: #202020; border-bottom-width: 0; content: " "; } .popover.right .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); border-left-width: 0; } .popover.right .arrow:after { bottom: -10px; left: 1px; border-right-color: #202020; border-left-width: 0; content: " "; } .popover.bottom .arrow { top: -11px; left: 50%; margin-left: -11px; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); border-top-width: 0; } .popover.bottom .arrow:after { top: 1px; margin-left: -10px; border-bottom-color: #202020; border-top-width: 0; content: " "; } .popover.left .arrow { top: 50%; right: -11px; margin-top: -11px; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); border-right-width: 0; } .popover.left .arrow:after { right: 1px; bottom: -10px; border-left-color: #202020; border-right-width: 0; content: " "; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; height: auto; max-width: 100%; line-height: 1; } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); opacity: 0.5; filter: alpha(opacity=50); } .carousel-control.left { background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { right: 0; left: auto; background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; left: 50%; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; margin-top: -10px; margin-left: -10px; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; border: 1px solid #ffffff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #ffffff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; margin-left: -15px; font-size: 30px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .affix { position: fixed; } @-ms-viewport { width: device-width; } @media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } } .hidden { display: none !important; visibility: hidden !important; } .visible-xs { display: none !important; } tr.visible-xs { display: none !important; } th.visible-xs, td.visible-xs { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-xs.visible-sm { display: block !important; } tr.visible-xs.visible-sm { display: table-row !important; } th.visible-xs.visible-sm, td.visible-xs.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-xs.visible-md { display: block !important; } tr.visible-xs.visible-md { display: table-row !important; } th.visible-xs.visible-md, td.visible-xs.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-xs.visible-lg { display: block !important; } tr.visible-xs.visible-lg { display: table-row !important; } th.visible-xs.visible-lg, td.visible-xs.visible-lg { display: table-cell !important; } } .visible-sm { display: none !important; } tr.visible-sm { display: none !important; } th.visible-sm, td.visible-sm { display: none !important; } @media (max-width: 767px) { .visible-sm.visible-xs { display: block !important; } tr.visible-sm.visible-xs { display: table-row !important; } th.visible-sm.visible-xs, td.visible-sm.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-sm.visible-md { display: block !important; } tr.visible-sm.visible-md { display: table-row !important; } th.visible-sm.visible-md, td.visible-sm.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-sm.visible-lg { display: block !important; } tr.visible-sm.visible-lg { display: table-row !important; } th.visible-sm.visible-lg, td.visible-sm.visible-lg { display: table-cell !important; } } .visible-md { display: none !important; } tr.visible-md { display: none !important; } th.visible-md, td.visible-md { display: none !important; } @media (max-width: 767px) { .visible-md.visible-xs { display: block !important; } tr.visible-md.visible-xs { display: table-row !important; } th.visible-md.visible-xs, td.visible-md.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-md.visible-sm { display: block !important; } tr.visible-md.visible-sm { display: table-row !important; } th.visible-md.visible-sm, td.visible-md.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-md.visible-lg { display: block !important; } tr.visible-md.visible-lg { display: table-row !important; } th.visible-md.visible-lg, td.visible-md.visible-lg { display: table-cell !important; } } .visible-lg { display: none !important; } tr.visible-lg { display: none !important; } th.visible-lg, td.visible-lg { display: none !important; } @media (max-width: 767px) { .visible-lg.visible-xs { display: block !important; } tr.visible-lg.visible-xs { display: table-row !important; } th.visible-lg.visible-xs, td.visible-lg.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-lg.visible-sm { display: block !important; } tr.visible-lg.visible-sm { display: table-row !important; } th.visible-lg.visible-sm, td.visible-lg.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-lg.visible-md { display: block !important; } tr.visible-lg.visible-md { display: table-row !important; } th.visible-lg.visible-md, td.visible-lg.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } .hidden-xs { display: block !important; } tr.hidden-xs { display: table-row !important; } th.hidden-xs, td.hidden-xs { display: table-cell !important; } @media (max-width: 767px) { .hidden-xs { display: none !important; } tr.hidden-xs { display: none !important; } th.hidden-xs, td.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-xs.hidden-sm { display: none !important; } tr.hidden-xs.hidden-sm { display: none !important; } th.hidden-xs.hidden-sm, td.hidden-xs.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-xs.hidden-md { display: none !important; } tr.hidden-xs.hidden-md { display: none !important; } th.hidden-xs.hidden-md, td.hidden-xs.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-xs.hidden-lg { display: none !important; } tr.hidden-xs.hidden-lg { display: none !important; } th.hidden-xs.hidden-lg, td.hidden-xs.hidden-lg { display: none !important; } } .hidden-sm { display: block !important; } tr.hidden-sm { display: table-row !important; } th.hidden-sm, td.hidden-sm { display: table-cell !important; } @media (max-width: 767px) { .hidden-sm.hidden-xs { display: none !important; } tr.hidden-sm.hidden-xs { display: none !important; } th.hidden-sm.hidden-xs, td.hidden-sm.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } tr.hidden-sm { display: none !important; } th.hidden-sm, td.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-sm.hidden-md { display: none !important; } tr.hidden-sm.hidden-md { display: none !important; } th.hidden-sm.hidden-md, td.hidden-sm.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-sm.hidden-lg { display: none !important; } tr.hidden-sm.hidden-lg { display: none !important; } th.hidden-sm.hidden-lg, td.hidden-sm.hidden-lg { display: none !important; } } .hidden-md { display: block !important; } tr.hidden-md { display: table-row !important; } th.hidden-md, td.hidden-md { display: table-cell !important; } @media (max-width: 767px) { .hidden-md.hidden-xs { display: none !important; } tr.hidden-md.hidden-xs { display: none !important; } th.hidden-md.hidden-xs, td.hidden-md.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-md.hidden-sm { display: none !important; } tr.hidden-md.hidden-sm { display: none !important; } th.hidden-md.hidden-sm, td.hidden-md.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } tr.hidden-md { display: none !important; } th.hidden-md, td.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-md.hidden-lg { display: none !important; } tr.hidden-md.hidden-lg { display: none !important; } th.hidden-md.hidden-lg, td.hidden-md.hidden-lg { display: none !important; } } .hidden-lg { display: block !important; } tr.hidden-lg { display: table-row !important; } th.hidden-lg, td.hidden-lg { display: table-cell !important; } @media (max-width: 767px) { .hidden-lg.hidden-xs { display: none !important; } tr.hidden-lg.hidden-xs { display: none !important; } th.hidden-lg.hidden-xs, td.hidden-lg.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-lg.hidden-sm { display: none !important; } tr.hidden-lg.hidden-sm { display: none !important; } th.hidden-lg.hidden-sm, td.hidden-lg.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-lg.hidden-md { display: none !important; } tr.hidden-lg.hidden-md { display: none !important; } th.hidden-lg.hidden-md, td.hidden-lg.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } tr.hidden-lg { display: none !important; } th.hidden-lg, td.hidden-lg { display: none !important; } } .visible-print { display: none !important; } tr.visible-print { display: none !important; } th.visible-print, td.visible-print { display: none !important; } @media print { .visible-print { display: block !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } .hidden-print { display: none !important; } tr.hidden-print { display: none !important; } th.hidden-print, td.hidden-print { display: none !important; } } .navbar { border-bottom: 1px solid #282828; } h1, h2, h3, h4, h5, h6 { color: #fff; } .text-primary { color: #2a9fd6; } .text-success { color: #77b300; } .text-danger { color: #cc0000; } .text-warning { color: #ff8800; } .text-info { color: #9933cc; } .table tr.success, .table tr.warning, .table tr.danger { color: #fff; } .has-warning .help-block, .has-warning .control-label { color: #ff8800; } .has-warning .form-control, .has-warning .form-control:focus { border-color: #ff8800; } .has-error .help-block, .has-error .control-label { color: #cc0000; } .has-error .form-control, .has-error .form-control:focus { border-color: #cc0000; } .has-success .help-block, .has-success .control-label { color: #77b300; } .has-success .form-control, .has-success .form-control:focus { border-color: #77b300; } legend { color: #fff; } .input-group-addon { background-color: #424242; } .nav .caret, .nav a:hover .caret { border-top-color: #fff; border-bottom-color: #fff; } .nav-tabs a, .nav-pills a, .breadcrumb a, .pagination a, .pager a { color: #fff; } .alert .alert-link, .alert a { color: #ffffff; text-decoration: underline; } .jumbotron h1, .jumbotron h2, .jumbotron h3, .jumbotron h4, .jumbotron h5, .jumbotron h6 { color: #fff; } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .affix { position: fixed; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/bootstrap/themes/bootstrap-theme-flatly.css ================================================ @import url("//fonts.googleapis.com/css?family=Lato:400,700,400italic"); /*! * Bootswatch v3.1.1+1 * Homepage: http://bootswatch.com * Copyright 2012-2014 Thomas Park * Licensed under MIT * Based on Bootstrap */ /*! normalize.css v3.0.0 | MIT License | git.io/normalize */ html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { font-size: 2em; margin: 0.67em 0; } mark { background: #ff0; color: #000; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { color: inherit; font: inherit; margin: 0; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } legend { border: 0; padding: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-collapse: collapse; border-spacing: 0; } td, th { padding: 0; } @media print { * { text-shadow: none !important; color: #000 !important; background: transparent !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } select { background: #fff !important; } .navbar { display: none; } .table td, .table th { background-color: #fff !important; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 62.5%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 15px; line-height: 1.42857143; color: #2c3e50; background-color: #ffffff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #18bc9c; text-decoration: none; } a:hover, a:focus { color: #18bc9c; text-decoration: underline; } a:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 6px; } .img-thumbnail { padding: 4px; line-height: 1.42857143; background-color: #ffffff; border: 1px solid #ecf0f1; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; display: inline-block; max-width: 100%; height: auto; } .img-circle { border-radius: 50%; } hr { margin-top: 21px; margin-bottom: 21px; border: 0; border-top: 1px solid #ecf0f1; } .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 400; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #b4bcc2; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 21px; margin-bottom: 10.5px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 10.5px; margin-bottom: 10.5px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 39px; } h2, .h2 { font-size: 32px; } h3, .h3 { font-size: 26px; } h4, .h4 { font-size: 19px; } h5, .h5 { font-size: 15px; } h6, .h6 { font-size: 13px; } p { margin: 0 0 10.5px; } .lead { margin-bottom: 21px; font-size: 17px; font-weight: 200; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 22.5px; } } small, .small { font-size: 85%; } cite { font-style: normal; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-muted { color: #b4bcc2; } .text-primary { color: #2c3e50; } a.text-primary:hover { color: #1a242f; } .text-success { color: #ffffff; } a.text-success:hover { color: #e6e6e6; } .text-info { color: #ffffff; } a.text-info:hover { color: #e6e6e6; } .text-warning { color: #ffffff; } a.text-warning:hover { color: #e6e6e6; } .text-danger { color: #ffffff; } a.text-danger:hover { color: #e6e6e6; } .bg-primary { color: #fff; background-color: #2c3e50; } a.bg-primary:hover { background-color: #1a242f; } .bg-success { background-color: #18bc9c; } a.bg-success:hover { background-color: #128f76; } .bg-info { background-color: #3498db; } a.bg-info:hover { background-color: #217dbb; } .bg-warning { background-color: #f39c12; } a.bg-warning:hover { background-color: #c87f0a; } .bg-danger { background-color: #e74c3c; } a.bg-danger:hover { background-color: #d62c1a; } .page-header { padding-bottom: 9.5px; margin: 42px 0 21px; border-bottom: 1px solid transparent; } ul, ol { margin-top: 0; margin-bottom: 10.5px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; margin-left: -5px; } .list-inline > li { display: inline-block; padding-left: 5px; padding-right: 5px; } dl { margin-top: 0; margin-bottom: 21px; } dt, dd { line-height: 1.42857143; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #b4bcc2; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10.5px 21px; margin: 0 0 21px; font-size: 18.75px; border-left: 5px solid #ecf0f1; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #b4bcc2; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #ecf0f1; border-left: 0; text-align: right; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } blockquote:before, blockquote:after { content: ""; } address { margin-bottom: 21px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; white-space: nowrap; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #ffffff; background-color: #333333; border-radius: 3px; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } pre { display: block; padding: 10px; margin: 0 0 10.5px; font-size: 14px; line-height: 1.42857143; word-break: break-all; word-wrap: break-word; color: #7b8a8b; background-color: #ecf0f1; border: 1px solid #cccccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } .row { margin-left: -15px; margin-right: -15px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-left: 15px; padding-right: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: 0%; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: 0%; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0%; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: 0%; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: 0%; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0%; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: 0%; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: 0%; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0%; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: 0%; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: 0%; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0%; } } table { max-width: 100%; background-color: transparent; } th { text-align: left; } .table { width: 100%; margin-bottom: 21px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ecf0f1; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #ecf0f1; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #ecf0f1; } .table .table { background-color: #ffffff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #ecf0f1; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ecf0f1; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-child(odd) > td, .table-striped > tbody > tr:nth-child(odd) > th { background-color: #f9f9f9; } .table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th { background-color: #ecf0f1; } table col[class*="col-"] { position: static; float: none; display: table-column; } table td[class*="col-"], table th[class*="col-"] { position: static; float: none; display: table-cell; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #ecf0f1; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr.active:hover > th { background-color: #dde4e6; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #18bc9c; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr.success:hover > th { background-color: #15a589; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #3498db; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr.info:hover > th { background-color: #258cd1; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #f39c12; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr.warning:hover > th { background-color: #e08e0b; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #e74c3c; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr.danger:hover > th { background-color: #e43725; } @media (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15.75px; overflow-y: hidden; overflow-x: scroll; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ecf0f1; -webkit-overflow-scrolling: touch; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; min-width: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 21px; font-size: 22.5px; line-height: inherit; color: #2c3e50; border: 0; border-bottom: 1px solid transparent; } label { display: inline-block; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; /* IE8-9 */ line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 11px; font-size: 15px; line-height: 1.42857143; color: #2c3e50; } .form-control { display: block; width: 100%; height: 43px; padding: 10px 15px; font-size: 15px; line-height: 1.42857143; color: #2c3e50; background-color: #ffffff; background-image: none; border: 1px solid #dce4ec; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #2c3e50; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(44, 62, 80, 0.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(44, 62, 80, 0.6); } .form-control::-moz-placeholder { color: #acb6c0; opacity: 1; } .form-control:-ms-input-placeholder { color: #acb6c0; } .form-control::-webkit-input-placeholder { color: #acb6c0; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { cursor: not-allowed; background-color: #ecf0f1; opacity: 1; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } input[type="date"] { line-height: 43px; } .form-group { margin-bottom: 15px; } .radio, .checkbox { display: block; min-height: 21px; margin-top: 10px; margin-bottom: 10px; padding-left: 20px; } .radio label, .checkbox label { display: inline; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; vertical-align: middle; font-weight: normal; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], .radio[disabled], .radio-inline[disabled], .checkbox[disabled], .checkbox-inline[disabled], fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"], fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .input-sm { height: 33px; padding: 6px 9px; font-size: 13px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 33px; line-height: 33px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .input-lg { height: 64px; padding: 18px 27px; font-size: 19px; line-height: 1.33; border-radius: 6px; } select.input-lg { height: 64px; line-height: 64px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 53.75px; } .has-feedback .form-control-feedback { position: absolute; top: 26px; right: 0; display: block; width: 43px; height: 43px; line-height: 43px; text-align: center; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline { color: #ffffff; } .has-success .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-success .input-group-addon { color: #ffffff; border-color: #ffffff; background-color: #18bc9c; } .has-success .form-control-feedback { color: #ffffff; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline { color: #ffffff; } .has-warning .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-warning .input-group-addon { color: #ffffff; border-color: #ffffff; background-color: #f39c12; } .has-warning .form-control-feedback { color: #ffffff; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline { color: #ffffff; } .has-error .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-error .input-group-addon { color: #ffffff; border-color: #ffffff; background-color: #e74c3c; } .has-error .form-control-feedback { color: #ffffff; } .form-control-static { margin-bottom: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #597ea2; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; padding-left: 0; vertical-align: middle; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: none; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { margin-top: 0; margin-bottom: 0; padding-top: 11px; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 32px; } .form-horizontal .form-group { margin-left: -15px; margin-right: -15px; } .form-horizontal .form-control-static { padding-top: 11px; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; } } .form-horizontal .has-feedback .form-control-feedback { top: 0; right: 15px; } .btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; vertical-align: middle; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 10px 15px; font-size: 15px; line-height: 1.42857143; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .btn:focus, .btn:active:focus, .btn.active:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus { color: #ffffff; text-decoration: none; } .btn:active, .btn.active { outline: 0; background-image: none; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; pointer-events: none; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } .btn-default { color: #ffffff; background-color: #95a5a6; border-color: #95a5a6; } .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { color: #ffffff; background-color: #7f9293; border-color: #74898a; } .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #95a5a6; border-color: #95a5a6; } .btn-default .badge { color: #95a5a6; background-color: #ffffff; } .btn-primary { color: #ffffff; background-color: #2c3e50; border-color: #2c3e50; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { color: #ffffff; background-color: #1e2a36; border-color: #161f29; } .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #2c3e50; border-color: #2c3e50; } .btn-primary .badge { color: #2c3e50; background-color: #ffffff; } .btn-success { color: #ffffff; background-color: #18bc9c; border-color: #18bc9c; } .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { color: #ffffff; background-color: #13987e; border-color: #11866f; } .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #18bc9c; border-color: #18bc9c; } .btn-success .badge { color: #18bc9c; background-color: #ffffff; } .btn-info { color: #ffffff; background-color: #3498db; border-color: #3498db; } .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { color: #ffffff; background-color: #2383c4; border-color: #2077b2; } .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #3498db; border-color: #3498db; } .btn-info .badge { color: #3498db; background-color: #ffffff; } .btn-warning { color: #ffffff; background-color: #f39c12; border-color: #f39c12; } .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { color: #ffffff; background-color: #d2850b; border-color: #be780a; } .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #f39c12; border-color: #f39c12; } .btn-warning .badge { color: #f39c12; background-color: #ffffff; } .btn-danger { color: #ffffff; background-color: #e74c3c; border-color: #e74c3c; } .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { color: #ffffff; background-color: #df2e1b; border-color: #cd2a19; } .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #e74c3c; border-color: #e74c3c; } .btn-danger .badge { color: #e74c3c; background-color: #ffffff; } .btn-link { color: #18bc9c; font-weight: normal; cursor: pointer; border-radius: 0; } .btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #18bc9c; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #b4bcc2; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 18px 27px; font-size: 19px; line-height: 1.33; border-radius: 6px; } .btn-sm, .btn-group-sm > .btn { padding: 6px 9px; font-size: 13px; line-height: 1.5; border-radius: 3px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 13px; line-height: 1.5; border-radius: 3px; } .btn-block { display: block; width: 100%; padding-left: 0; padding-right: 0; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition: height 0.35s ease; transition: height 0.35s ease; } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px solid; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; list-style: none; font-size: 15px; background-color: #ffffff; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9.5px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #7b8a8b; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { text-decoration: none; color: #ffffff; background-color: #2c3e50; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; outline: 0; background-color: #2c3e50; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #b4bcc2; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); cursor: not-allowed; } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { left: auto; right: 0; } .dropdown-menu-left { left: 0; right: auto; } .dropdown-header { display: block; padding: 3px 20px; font-size: 13px; line-height: 1.42857143; color: #b4bcc2; } .dropdown-backdrop { position: fixed; left: 0; right: 0; bottom: 0; top: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0; border-bottom: 4px solid; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { left: auto; right: 0; } .navbar-right .dropdown-menu-left { left: 0; right: auto; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group > .btn:focus, .btn-group-vertical > .btn:focus { outline: none; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child > .btn:last-child, .btn-group > .btn-group:first-child > .dropdown-toggle { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn-group:last-child > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-left: 8px; padding-right: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-left: 12px; padding-right: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-bottom-left-radius: 4px; border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { float: none; display: table-cell; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } [data-toggle="buttons"] > .btn > input[type="radio"], [data-toggle="buttons"] > .btn > input[type="checkbox"] { display: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-left: 0; padding-right: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 64px; padding: 18px 27px; font-size: 19px; line-height: 1.33; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 64px; line-height: 64px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 33px; padding: 6px 9px; font-size: 13px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 33px; line-height: 33px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 10px 15px; font-size: 15px; font-weight: normal; line-height: 1; color: #2c3e50; text-align: center; background-color: #ecf0f1; border: 1px solid #dce4ec; border-radius: 4px; } .input-group-addon.input-sm { padding: 6px 9px; font-size: 13px; border-radius: 3px; } .input-group-addon.input-lg { padding: 18px 27px; font-size: 19px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-bottom-right-radius: 0; border-top-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { margin-left: -1px; } .nav { margin-bottom: 0; padding-left: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #ecf0f1; } .nav > li.disabled > a { color: #b4bcc2; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #b4bcc2; text-decoration: none; background-color: transparent; cursor: not-allowed; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #ecf0f1; border-color: #18bc9c; } .nav .nav-divider { height: 1px; margin: 9.5px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #ecf0f1; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #ecf0f1 #ecf0f1 #ecf0f1; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #2c3e50; background-color: #ffffff; border: 1px solid #ecf0f1; border-bottom-color: transparent; cursor: default; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #ecf0f1; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #ecf0f1; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #ffffff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #ffffff; background-color: #2c3e50; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #ecf0f1; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #ecf0f1; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #ffffff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; min-height: 60px; margin-bottom: 21px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { max-height: 340px; overflow-x: visible; padding-right: 15px; padding-left: 15px; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-left: 0; padding-right: 0; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; padding: 19.5px 15px; font-size: 19px; line-height: 21px; height: 60px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; margin-right: 15px; padding: 9px 10px; margin-top: 13px; margin-bottom: 13px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle:focus { outline: none; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 9.75px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 21px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 21px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 19.5px; padding-bottom: 19.5px; } .navbar-nav.navbar-right:last-child { margin-right: -15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; } } .navbar-form { margin-left: -15px; margin-right: -15px; padding: 10px 15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); margin-top: 8.5px; margin-bottom: 8.5px; } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; padding-left: 0; vertical-align: middle; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { float: none; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } } @media (min-width: 768px) { .navbar-form { width: auto; border: 0; margin-left: 0; margin-right: 0; padding-top: 0; padding-bottom: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-form.navbar-right:last-child { margin-right: -15px; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 8.5px; margin-bottom: 8.5px; } .navbar-btn.btn-sm { margin-top: 13.5px; margin-bottom: 13.5px; } .navbar-btn.btn-xs { margin-top: 19px; margin-bottom: 19px; } .navbar-text { margin-top: 19.5px; margin-bottom: 19.5px; } @media (min-width: 768px) { .navbar-text { float: left; margin-left: 15px; margin-right: 15px; } .navbar-text.navbar-right:last-child { margin-right: 0; } } .navbar-default { background-color: #2c3e50; border-color: transparent; } .navbar-default .navbar-brand { color: #ffffff; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #18bc9c; background-color: transparent; } .navbar-default .navbar-text { color: #777777; } .navbar-default .navbar-nav > li > a { color: #ffffff; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #18bc9c; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #ffffff; background-color: #1a242f; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #cccccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #1a242f; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #1a242f; } .navbar-default .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: transparent; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: #1a242f; color: #ffffff; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #ffffff; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #18bc9c; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: #1a242f; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #cccccc; background-color: transparent; } } .navbar-default .navbar-link { color: #ffffff; } .navbar-default .navbar-link:hover { color: #18bc9c; } .navbar-inverse { background-color: #18bc9c; border-color: transparent; } .navbar-inverse .navbar-brand { color: #ffffff; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #2c3e50; background-color: transparent; } .navbar-inverse .navbar-text { color: #ffffff; } .navbar-inverse .navbar-nav > li > a { color: #ffffff; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #2c3e50; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: #15a589; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #cccccc; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #128f76; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #128f76; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #149c82; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #15a589; color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #ffffff; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #2c3e50; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: #15a589; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #cccccc; background-color: transparent; } } .navbar-inverse .navbar-link { color: #ffffff; } .navbar-inverse .navbar-link:hover { color: #2c3e50; } .breadcrumb { padding: 8px 15px; margin-bottom: 21px; list-style: none; background-color: #ecf0f1; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; color: #cccccc; } .breadcrumb > .active { color: #95a5a6; } .pagination { display: inline-block; padding-left: 0; margin: 21px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 10px 15px; line-height: 1.42857143; text-decoration: none; color: #ffffff; background-color: #18bc9c; border: 1px solid transparent; margin-left: -1px; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 4px; border-top-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-bottom-right-radius: 4px; border-top-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { color: #ffffff; background-color: #0f7864; border-color: transparent; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #ffffff; background-color: #0f7864; border-color: transparent; cursor: default; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #ecf0f1; background-color: #3be6c4; border-color: transparent; cursor: not-allowed; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 18px 27px; font-size: 19px; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 6px; border-top-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-bottom-right-radius: 6px; border-top-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 6px 9px; font-size: 13px; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-bottom-right-radius: 3px; border-top-right-radius: 3px; } .pager { padding-left: 0; margin: 21px 0; list-style: none; text-align: center; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #18bc9c; border: 1px solid transparent; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #0f7864; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #ffffff; background-color: #18bc9c; cursor: not-allowed; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } .label[href]:hover, .label[href]:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #95a5a6; } .label-default[href]:hover, .label-default[href]:focus { background-color: #798d8f; } .label-primary { background-color: #2c3e50; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #1a242f; } .label-success { background-color: #18bc9c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #128f76; } .label-info { background-color: #3498db; } .label-info[href]:hover, .label-info[href]:focus { background-color: #217dbb; } .label-warning { background-color: #f39c12; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #c87f0a; } .label-danger { background-color: #e74c3c; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #d62c1a; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 13px; font-weight: bold; color: #ffffff; line-height: 1; vertical-align: baseline; white-space: nowrap; text-align: center; background-color: #2c3e50; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #2c3e50; background-color: #ffffff; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding: 30px; margin-bottom: 30px; color: inherit; background-color: #ecf0f1; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 23px; font-weight: 200; } .container .jumbotron { border-radius: 6px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron { padding-left: 60px; padding-right: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 67.5px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 21px; line-height: 1.42857143; background-color: #ffffff; border: 1px solid #ecf0f1; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-left: auto; margin-right: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #18bc9c; } .thumbnail .caption { padding: 9px; color: #2c3e50; } .alert { padding: 15px; margin-bottom: 21px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable { padding-right: 35px; } .alert-dismissable .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { background-color: #18bc9c; border-color: #18bc9c; color: #ffffff; } .alert-success hr { border-top-color: #15a589; } .alert-success .alert-link { color: #e6e6e6; } .alert-info { background-color: #3498db; border-color: #3498db; color: #ffffff; } .alert-info hr { border-top-color: #258cd1; } .alert-info .alert-link { color: #e6e6e6; } .alert-warning { background-color: #f39c12; border-color: #f39c12; color: #ffffff; } .alert-warning hr { border-top-color: #e08e0b; } .alert-warning .alert-link { color: #e6e6e6; } .alert-danger { background-color: #e74c3c; border-color: #e74c3c; color: #ffffff; } .alert-danger hr { border-top-color: #e43725; } .alert-danger .alert-link { color: #e6e6e6; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { overflow: hidden; height: 21px; margin-bottom: 21px; background-color: #ecf0f1; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0%; height: 100%; font-size: 13px; line-height: 21px; color: #ffffff; text-align: center; background-color: #2c3e50; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; } .progress.active .progress-bar { -webkit-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #18bc9c; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #3498db; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #f39c12; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #e74c3c; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .media, .media-body { overflow: hidden; zoom: 1; } .media, .media .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media-object { display: block; } .media-heading { margin: 0 0 5px; } .media > .pull-left { margin-right: 10px; } .media > .pull-right { margin-left: 10px; } .media-list { padding-left: 0; list-style: none; } .list-group { margin-bottom: 20px; padding-left: 0; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #ffffff; border: 1px solid #ecf0f1; } .list-group-item:first-child { border-top-right-radius: 4px; border-top-left-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } a.list-group-item { color: #555555; } a.list-group-item .list-group-item-heading { color: #333333; } a.list-group-item:hover, a.list-group-item:focus { text-decoration: none; background-color: #ecf0f1; } a.list-group-item.active, a.list-group-item.active:hover, a.list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #2c3e50; border-color: #2c3e50; } a.list-group-item.active .list-group-item-heading, a.list-group-item.active:hover .list-group-item-heading, a.list-group-item.active:focus .list-group-item-heading { color: inherit; } a.list-group-item.active .list-group-item-text, a.list-group-item.active:hover .list-group-item-text, a.list-group-item.active:focus .list-group-item-text { color: #8aa4be; } .list-group-item-success { color: #ffffff; background-color: #18bc9c; } a.list-group-item-success { color: #ffffff; } a.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, a.list-group-item-success:focus { color: #ffffff; background-color: #15a589; } a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-info { color: #ffffff; background-color: #3498db; } a.list-group-item-info { color: #ffffff; } a.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, a.list-group-item-info:focus { color: #ffffff; background-color: #258cd1; } a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-warning { color: #ffffff; background-color: #f39c12; } a.list-group-item-warning { color: #ffffff; } a.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, a.list-group-item-warning:focus { color: #ffffff; background-color: #e08e0b; } a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-danger { color: #ffffff; background-color: #e74c3c; } a.list-group-item-danger { color: #ffffff; } a.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, a.list-group-item-danger:focus { color: #ffffff; background-color: #e43725; } a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 21px; background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 17px; color: inherit; } .panel-title > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #ecf0f1; border-top: 1px solid #ecf0f1; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table { margin-bottom: 0; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive { border-top: 1px solid #ecf0f1; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { border: 0; margin-bottom: 0; } .panel-group { margin-bottom: 21px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; overflow: hidden; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse .panel-body { border-top: 1px solid #ecf0f1; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ecf0f1; } .panel-default { border-color: #ecf0f1; } .panel-default > .panel-heading { color: #2c3e50; background-color: #ecf0f1; border-color: #ecf0f1; } .panel-default > .panel-heading + .panel-collapse .panel-body { border-top-color: #ecf0f1; } .panel-default > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #ecf0f1; } .panel-primary { border-color: #2c3e50; } .panel-primary > .panel-heading { color: #ffffff; background-color: #2c3e50; border-color: #2c3e50; } .panel-primary > .panel-heading + .panel-collapse .panel-body { border-top-color: #2c3e50; } .panel-primary > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #2c3e50; } .panel-success { border-color: #18bc9c; } .panel-success > .panel-heading { color: #ffffff; background-color: #18bc9c; border-color: #18bc9c; } .panel-success > .panel-heading + .panel-collapse .panel-body { border-top-color: #18bc9c; } .panel-success > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #18bc9c; } .panel-info { border-color: #3498db; } .panel-info > .panel-heading { color: #ffffff; background-color: #3498db; border-color: #3498db; } .panel-info > .panel-heading + .panel-collapse .panel-body { border-top-color: #3498db; } .panel-info > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #3498db; } .panel-warning { border-color: #f39c12; } .panel-warning > .panel-heading { color: #ffffff; background-color: #f39c12; border-color: #f39c12; } .panel-warning > .panel-heading + .panel-collapse .panel-body { border-top-color: #f39c12; } .panel-warning > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #f39c12; } .panel-danger { border-color: #e74c3c; } .panel-danger > .panel-heading { color: #ffffff; background-color: #e74c3c; border-color: #e74c3c; } .panel-danger > .panel-heading + .panel-collapse .panel-body { border-top-color: #e74c3c; } .panel-danger > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #e74c3c; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #ecf0f1; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 22.5px; font-weight: bold; line-height: 1; color: #000000; text-shadow: none; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } .modal { display: none; overflow: auto; overflow-y: scroll; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0); } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #ffffff; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; outline: none; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { padding: 15px; border-bottom: 1px solid #e5e5e5; min-height: 16.42857143px; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 20px; } .modal-footer { margin-top: 15px; padding: 19px 20px 20px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1030; display: block; visibility: visible; font-size: 13px; line-height: 1.4; opacity: 0; filter: alpha(opacity=0); } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { margin-top: -3px; padding: 5px 0; } .tooltip.right { margin-left: 3px; padding: 0 5px; } .tooltip.bottom { margin-top: 3px; padding: 5px 0; } .tooltip.left { margin-left: -3px; padding: 0 5px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: rgba(0, 0, 0, 0.9); border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: rgba(0, 0, 0, 0.9); } .tooltip.top-left .tooltip-arrow { bottom: 0; left: 5px; border-width: 5px 5px 0; border-top-color: rgba(0, 0, 0, 0.9); } .tooltip.top-right .tooltip-arrow { bottom: 0; right: 5px; border-width: 5px 5px 0; border-top-color: rgba(0, 0, 0, 0.9); } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: rgba(0, 0, 0, 0.9); } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: rgba(0, 0, 0, 0.9); } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: rgba(0, 0, 0, 0.9); } .tooltip.bottom-left .tooltip-arrow { top: 0; left: 5px; border-width: 0 5px 5px; border-bottom-color: rgba(0, 0, 0, 0.9); } .tooltip.bottom-right .tooltip-arrow { top: 0; right: 5px; border-width: 0 5px 5px; border-bottom-color: rgba(0, 0, 0, 0.9); } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; max-width: 276px; padding: 1px; text-align: left; background-color: #ffffff; background-clip: padding-box; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); white-space: normal; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { margin: 0; padding: 8px 14px; font-size: 15px; font-weight: normal; line-height: 18px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { border-width: 10px; content: ""; } .popover.top > .arrow { left: 50%; margin-left: -11px; border-bottom-width: 0; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); bottom: -11px; } .popover.top > .arrow:after { content: " "; bottom: 1px; margin-left: -10px; border-bottom-width: 0; border-top-color: #ffffff; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-left-width: 0; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); } .popover.right > .arrow:after { content: " "; left: 1px; bottom: -10px; border-left-width: 0; border-right-color: #ffffff; } .popover.bottom > .arrow { left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); top: -11px; } .popover.bottom > .arrow:after { content: " "; top: 1px; margin-left: -10px; border-top-width: 0; border-bottom-color: #ffffff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); } .popover.left > .arrow:after { content: " "; right: 1px; border-right-width: 0; border-left-color: #ffffff; bottom: -10px; } .carousel { position: relative; } .carousel-inner { position: relative; overflow: hidden; width: 100%; } .carousel-inner > .item { display: none; position: relative; -webkit-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; left: 0; bottom: 0; width: 15%; opacity: 0.5; filter: alpha(opacity=50); font-size: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-control.left { background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { left: auto; right: 0; background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { outline: none; color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; margin-top: -10px; margin-left: -10px; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; margin-left: -30%; padding-left: 0; list-style: none; text-align: center; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; border: 1px solid #ffffff; border-radius: 10px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); } .carousel-indicators .active { margin: 0; width: 12px; height: 12px; background-color: #ffffff; } .carousel-caption { position: absolute; left: 15%; right: 15%; bottom: 20px; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; margin-left: -15px; font-size: 30px; } .carousel-caption { left: 20%; right: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-footer:before, .modal-footer:after { content: " "; display: table; } .clearfix:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-footer:after { clear: both; } .center-block { display: block; margin-left: auto; margin-right: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; visibility: hidden !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } @media print { .hidden-print { display: none !important; } } .navbar { border-width: 0; } .navbar-default .badge { background-color: #fff; color: #2c3e50; } .navbar-inverse .badge { background-color: #fff; color: #18bc9c; } .navbar-brand { padding: 18.5px 15px 20.5px; } .btn:active { -webkit-box-shadow: none; box-shadow: none; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: none; box-shadow: none; } .text-primary, .text-primary:hover { color: #2c3e50; } .text-success, .text-success:hover { color: #18bc9c; } .text-danger, .text-danger:hover { color: #e74c3c; } .text-warning, .text-warning:hover { color: #f39c12; } .text-info, .text-info:hover { color: #3498db; } table a, .table a { text-decoration: underline; } table .success, .table .success, table .warning, .table .warning, table .danger, .table .danger, table .info, .table .info { color: #fff; } table .success a, .table .success a, table .warning a, .table .warning a, table .danger a, .table .danger a, table .info a, .table .info a { color: #fff; } table > thead > tr > th, .table > thead > tr > th, table > tbody > tr > th, .table > tbody > tr > th, table > tfoot > tr > th, .table > tfoot > tr > th, table > thead > tr > td, .table > thead > tr > td, table > tbody > tr > td, .table > tbody > tr > td, table > tfoot > tr > td, .table > tfoot > tr > td { border: none; } table-bordered > thead > tr > th, .table-bordered > thead > tr > th, table-bordered > tbody > tr > th, .table-bordered > tbody > tr > th, table-bordered > tfoot > tr > th, .table-bordered > tfoot > tr > th, table-bordered > thead > tr > td, .table-bordered > thead > tr > td, table-bordered > tbody > tr > td, .table-bordered > tbody > tr > td, table-bordered > tfoot > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ecf0f1; } .form-control, input { border-width: 2px; -webkit-box-shadow: none; box-shadow: none; } .form-control:focus, input:focus { -webkit-box-shadow: none; box-shadow: none; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning .form-control-feedback { color: #f39c12; } .has-warning .form-control, .has-warning .form-control:focus { border: 2px solid #f39c12; } .has-warning .input-group-addon { border-color: #f39c12; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error .form-control-feedback { color: #e74c3c; } .has-error .form-control, .has-error .form-control:focus { border: 2px solid #e74c3c; } .has-error .input-group-addon { border-color: #e74c3c; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success .form-control-feedback { color: #18bc9c; } .has-success .form-control, .has-success .form-control:focus { border: 2px solid #18bc9c; } .has-success .input-group-addon { border-color: #18bc9c; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { border-color: transparent; } .pager a, .pager a:hover { color: #fff; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { background-color: #3be6c4; } .alert a, .alert .alert-link { color: #fff; text-decoration: underline; } .alert .close { color: #fff; text-decoration: none; opacity: 0.4; } .alert .close:hover, .alert .close:focus { color: #fff; opacity: 1; } .progress { height: 10px; -webkit-box-shadow: none; box-shadow: none; } .progress .progress-bar { font-size: 10px; line-height: 10px; } .well { -webkit-box-shadow: none; box-shadow: none; } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/bootstrap/themes/bootstrap-theme.css ================================================ .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn:active, .btn.active { background-image: none; } .btn-default { text-shadow: 0 1px 0 #fff; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#e6e6e6)); background-image: -webkit-linear-gradient(top, #ffffff, 0%, #e6e6e6, 100%); background-image: -moz-linear-gradient(top, #ffffff 0%, #e6e6e6 100%); background-image: linear-gradient(to bottom, #ffffff 0%, #e6e6e6 100%); background-repeat: repeat-x; border-color: #e0e0e0; border-color: #ccc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); } .btn-default:active, .btn-default.active { background-color: #e6e6e6; border-color: #e0e0e0; } .btn-primary { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); background-repeat: repeat-x; border-color: #2d6ca2; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); } .btn-primary:active, .btn-primary.active { background-color: #3071a9; border-color: #2d6ca2; } .btn-success { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%); background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); background-repeat: repeat-x; border-color: #419641; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); } .btn-success:active, .btn-success.active { background-color: #449d44; border-color: #419641; } .btn-warning { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%); background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); background-repeat: repeat-x; border-color: #eb9316; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); } .btn-warning:active, .btn-warning.active { background-color: #ec971f; border-color: #eb9316; } .btn-danger { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%); background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); background-repeat: repeat-x; border-color: #c12e2a; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); } .btn-danger:active, .btn-danger.active { background-color: #c9302c; border-color: #c12e2a; } .btn-info { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%); background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); background-repeat: repeat-x; border-color: #2aabd2; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); } .btn-info:active, .btn-info.active { background-color: #31b0d5; border-color: #2aabd2; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus, .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #357ebd; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); } .navbar { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#f8f8f8)); background-image: -webkit-linear-gradient(top, #ffffff, 0%, #f8f8f8, 100%); background-image: -moz-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); background-repeat: repeat-x; border-radius: 4px; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); } .navbar .navbar-nav > .active > a { background-color: #f8f8f8; } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); } .navbar-inverse { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3c3c3c), to(#222222)); background-image: -webkit-linear-gradient(top, #3c3c3c, 0%, #222222, 100%); background-image: -moz-linear-gradient(top, #3c3c3c 0%, #222222 100%); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); } .navbar-inverse .navbar-nav > .active > a { background-color: #222222; } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); } .alert-success { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#c8e5bc)); background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #c8e5bc, 100%); background-image: -moz-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); background-repeat: repeat-x; border-color: #b2dba1; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); } .alert-info { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#b9def0)); background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #b9def0, 100%); background-image: -moz-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); background-repeat: repeat-x; border-color: #9acfea; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); } .alert-warning { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#f8efc0)); background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #f8efc0, 100%); background-image: -moz-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); background-repeat: repeat-x; border-color: #f5e79e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); } .alert-danger { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#e7c3c3)); background-image: -webkit-linear-gradient(top, #f2dede, 0%, #e7c3c3, 100%); background-image: -moz-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); background-repeat: repeat-x; border-color: #dca7a7; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); } .progress { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f5f5f5)); background-image: -webkit-linear-gradient(top, #ebebeb, 0%, #f5f5f5, 100%); background-image: -moz-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); } .progress-bar { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); } .progress-bar-success { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%); background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); } .progress-bar-info { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%); background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); } .progress-bar-warning { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%); background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); } .progress-bar-danger { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%); background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #3071a9; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3278b3)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #3278b3, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #3278b3 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); background-repeat: repeat-x; border-color: #3278b3; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .panel-default > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8)); background-image: -webkit-linear-gradient(top, #f5f5f5, 0%, #e8e8e8, 100%); background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); } .panel-primary > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); } .panel-success > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#d0e9c6)); background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #d0e9c6, 100%); background-image: -moz-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); } .panel-info > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#c4e3f3)); background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #c4e3f3, 100%); background-image: -moz-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); } .panel-warning > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#faf2cc)); background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #faf2cc, 100%); background-image: -moz-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); } .panel-danger > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#ebcccc)); background-image: -webkit-linear-gradient(top, #f2dede, 0%, #ebcccc, 100%); background-image: -moz-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); } .well { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#e8e8e8), to(#f5f5f5)); background-image: -webkit-linear-gradient(top, #e8e8e8, 0%, #f5f5f5, 100%); background-image: -moz-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); background-repeat: repeat-x; border-color: #dcdcdc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); } ================================================ FILE: Open Judge System/Web/OJS.Web/Content/docs.css ================================================ body { font-weight: 300; } a:hover, a:focus { text-decoration: none; } .container { max-width: 700px; } h2 { text-align: center; font-weight: 300; } /* Header -------------------------------------------------- */ .jumbotron { position: relative; font-size: 16px; color: #fff; color: rgba(255,255,255,.75); text-align: center; background-color: #b94a48; border-radius: 0; } .jumbotron h1, .jumbotron .glyphicon-ok { margin-bottom: 15px; font-weight: 300; letter-spacing: -1px; color: #fff; } .jumbotron .glyphicon-ok { font-size: 40px; line-height: 1; } .btn-outline { margin-top: 15px; margin-bottom: 15px; padding: 18px 24px; font-size: inherit; font-weight: 500; color: #fff; /* redeclare to override the `.jumbotron a` */ background-color: transparent; border-color: #fff; border-color: rgba(255,255,255,.5); transition: all .1s ease-in-out; } .btn-outline:hover, .btn-outline:active { color: #b94a48; background-color: #fff; border-color: #fff; } .jumbotron:after { position: absolute; right: 0; bottom: 0; left: 0; z-index: 10; display: block; content: ""; height: 30px; background-image: -moz-linear-gradient(rgba(0, 0, 0, 0), rgba(0,0,0,.1)); background-image: -webkit-linear-gradient(rgba(0, 0, 0, 0), rgba(0,0,0,.1)); } .jumbotron p a, .jumbotron-links a { font-weight: 500; color: #fff; transition: all .1s ease-in-out; } .jumbotron p a:hover, .jumbotron-links a:hover { text-shadow: 0 0 10px rgba(255,255,255,.55); } /* Textual links */ .jumbotron-links { margin-top: 15px; margin-bottom: 0; padding-left: 0; list-style: none; font-size: 14px; } .jumbotron-links li { display: inline; } .jumbotron-links li + li { margin-left: 20px; } @media (min-width: 768px) { .jumbotron { padding-top: 100px; padding-bottom: 100px; font-size: 21px; } .jumbotron h1, .jumbotron .glyphicon-ok { font-size: 50px; } } /* Steps for setup -------------------------------------------------- */ .how-to { padding: 50px 20px; border-top: 1px solid #eee; } .how-to li { font-size: 21px; line-height: 1.5; margin-top: 20px; } .how-to li p { font-size: 16px; color: #555; } .how-to code { font-size: 85%; color: #b94a48; background-color: #fcf3f2; word-wrap: break-word; white-space: normal; } /* Icons -------------------------------------------------- */ .the-icons { padding: 40px 10px; font-size: 20px; line-height: 2; color: #333; text-align: center; } .the-icons .glyphicon { padding-left: 15px; padding-right: 15px; } /* Footer -------------------------------------------------- */ .footer { padding: 50px 30px; color: #777; text-align: center; border-top: 1px solid #eee; } ================================================ FILE: Open Judge System/Web/OJS.Web/Controllers/AccountController.cs ================================================ namespace OJS.Web.Controllers { using System; using System.Linq; using System.Net; using System.Security.Claims; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Web; using System.Web.Mvc; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Owin.Security; using OJS.Common; using OJS.Data; using OJS.Data.Models; using OJS.Web.Common; using OJS.Web.ViewModels.Account; using Recaptcha; [Authorize] public class AccountController : BaseController { // Used for XSRF protection when adding external logins private const string XsrfKey = "XsrfId"; public AccountController(IOjsData data) : this(data, new OjsUserManager(new UserStore(data.Context.DbContext))) { } public AccountController(IOjsData data, UserManager userManager) : base(data) { this.UserManager = userManager; } public UserManager UserManager { get; private set; } private IAuthenticationManager AuthenticationManager => this.HttpContext.GetOwinContext().Authentication; // GET: /Account/Login [AllowAnonymous] public ActionResult Login(string returnUrl) { this.ViewBag.ReturnUrl = returnUrl; return this.View(); } // POST: /Account/Login [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task Login(LoginViewModel model, string returnUrl) { if (this.ModelState.IsValid) { var user = await this.UserManager.FindAsync(model.UserName, model.Password); if (user != null) { await this.SignInAsync(user, model.RememberMe); return this.RedirectToLocal(returnUrl); } this.ModelState.AddModelError(string.Empty, Resources.Account.AccountViewModels.Invalid_username_or_password); } // If we got this far, something failed, redisplay form return this.View(model); } // GET: /Account/Register [AllowAnonymous] public ActionResult Register() { if (this.User.Identity.IsAuthenticated) { return this.RedirectToAction("Manage"); } return this.View(); } // POST: /Account/Register [HttpPost] [AllowAnonymous] [RecaptchaControlMvc.CaptchaValidator] [ValidateAntiForgeryToken] public async Task Register(RegisterViewModel model, bool captchaValid) { if (this.Data.Users.All().Any(x => x.Email == model.Email)) { this.ModelState.AddModelError("Email", Resources.Account.AccountViewModels.Email_already_registered); } if (this.Data.Users.All().Any(x => x.UserName == model.UserName)) { this.ModelState.AddModelError("UserName", Resources.Account.AccountViewModels.User_already_registered); } if (!captchaValid) { this.ModelState.AddModelError("Captcha", Resources.Account.Views.General.Captcha_invalid); } if (this.ModelState.IsValid) { var user = new UserProfile { UserName = model.UserName, Email = model.Email }; var result = await this.UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { await this.SignInAsync(user, isPersistent: false); return this.RedirectToAction(GlobalConstants.Index, "Home"); } this.AddErrors(result); } // If we got this far, something failed, redisplay form return this.View(model); } // POST: /Account/Disassociate [HttpPost] [ValidateAntiForgeryToken] public async Task Disassociate(string loginProvider, string providerKey) { IdentityResult result = await this.UserManager.RemoveLoginAsync(this.User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey)); if (result.Succeeded) { this.TempData[GlobalConstants.InfoMessage] = Resources.Account.Views.Disassociate.External_login_removed; } else { this.TempData[GlobalConstants.DangerMessage] = Resources.Account.Views.Disassociate.Error; } return this.RedirectToAction("Manage"); } // GET: /Account/Manage public ActionResult Manage() { this.ViewBag.HasLocalPassword = this.HasPassword(); this.ViewBag.ReturnUrl = this.Url.Action("Manage"); return this.View(); } // POST: /Account/Manage [HttpPost] [ValidateAntiForgeryToken] public async Task Manage(ManageUserViewModel model) { bool hasPassword = this.HasPassword(); this.ViewBag.HasLocalPassword = hasPassword; this.ViewBag.ReturnUrl = this.Url.Action("Manage"); if (hasPassword) { if (this.ModelState.IsValid) { IdentityResult result = await this.UserManager.ChangePasswordAsync(this.User.Identity.GetUserId(), model.OldPassword, model.NewPassword); if (result.Succeeded) { this.TempData[GlobalConstants.InfoMessage] = Resources.Account.Views.Manage.Password_updated; return this.RedirectToAction(GlobalConstants.Index, new { controller = "Settings", area = "Users" }); } this.ModelState.AddModelError(string.Empty, Resources.Account.AccountViewModels.Password_incorrect); } } else { // User does not have a password so remove any validation errors caused by a missing OldPassword field var state = this.ModelState["OldPassword"]; state?.Errors.Clear(); if (this.ModelState.IsValid) { var result = await this.UserManager.AddPasswordAsync(this.User.Identity.GetUserId(), model.NewPassword); if (result.Succeeded) { this.TempData[GlobalConstants.InfoMessage] = Resources.Account.Views.Manage.Password_updated; return this.RedirectToAction(GlobalConstants.Index, new { controller = "Settings", area = "Users" }); } this.AddErrors(result); } } // If we got this far, something failed, redisplay form return this.View(model); } // POST: /Account/ExternalLogin [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult ExternalLogin(string provider, string returnUrl) { // Request a redirect to the external login provider return new ChallengeResult( provider, this.Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl })); } // GET: /Account/ExternalLoginCallback [AllowAnonymous] public async Task ExternalLoginCallback(string returnUrl) { var loginInfo = await this.AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return this.RedirectToAction("Login"); } // Sign in the user with this external login provider if the user already has a login var user = await this.UserManager.FindAsync(loginInfo.Login); if (user != null) { await this.SignInAsync(user, isPersistent: false); return this.RedirectToLocal(returnUrl); } // If a user account was not found - check if he has already registered his email. ClaimsIdentity claimsIdentity = this.AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie).Result; var email = claimsIdentity.FindFirstValue(ClaimTypes.Email); if (this.Data.Users.All().Any(x => x.Email == email)) { this.TempData[GlobalConstants.DangerMessage] = Resources.Account.Views.ExternalLoginCallback.Email_already_registered; return this.RedirectToAction("Login"); } // If the user does not have an account, then prompt the user to create an account this.ViewBag.ReturnUrl = returnUrl; this.ViewBag.LoginProvider = loginInfo.Login.LoginProvider; return this.View( "ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { UserName = loginInfo.DefaultUserName, Email = email }); } // POST: /Account/LinkLogin [HttpPost] [ValidateAntiForgeryToken] public ActionResult LinkLogin(string provider) { // Request a redirect to the external login provider to link a login for the current user return new ChallengeResult(provider, this.Url.Action("LinkLoginCallback", "Account"), this.User.Identity.GetUserId()); } // GET: /Account/LinkLoginCallback public async Task LinkLoginCallback() { var loginInfo = await this.AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, this.User.Identity.GetUserId()); if (loginInfo != null) { var result = await this.UserManager.AddLoginAsync(this.User.Identity.GetUserId(), loginInfo.Login); if (result.Succeeded) { return this.RedirectToAction("Manage"); } } this.TempData[GlobalConstants.DangerMessage] = Resources.Account.Views.ExternalLoginConfirmation.Error; return this.RedirectToAction("Manage"); } // POST: /Account/ExternalLoginConfirmation [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task ExternalLoginConfirmation( ExternalLoginConfirmationViewModel model, string returnUrl) { if (this.User.Identity.IsAuthenticated) { return this.RedirectToAction("Manage"); } if (this.ModelState.IsValid) { // Get the information about the user from the external login provider var info = await this.AuthenticationManager.GetExternalLoginInfoAsync(); if (info == null) { return this.View("ExternalLoginFailure"); } if (this.Data.Users.All().Any(x => x.Email == model.Email)) { this.TempData[GlobalConstants.DangerMessage] = Resources.Account.Views.ExternalLoginConfirmation.Email_already_registered; return this.RedirectToAction("ForgottenPassword"); } if (this.Data.Users.All().Any(x => x.UserName == model.UserName)) { this.ModelState.AddModelError("Username", Resources.Account.Views.ExternalLoginConfirmation.User_already_registered); } if (!this.ModelState.IsValid) { return this.View(model); } var user = new UserProfile { UserName = model.UserName, Email = model.Email }; var result = await this.UserManager.CreateAsync(user); if (result.Succeeded) { result = await this.UserManager.AddLoginAsync(user.Id, info.Login); if (result.Succeeded) { await this.SignInAsync(user, isPersistent: false); return this.RedirectToLocal(returnUrl); } } this.AddErrors(result); } this.ViewBag.ReturnUrl = returnUrl; return this.View(model); } // POST: /Account/LogOff [HttpPost] [ValidateAntiForgeryToken] public ActionResult LogOff() { this.AuthenticationManager.SignOut(); return this.RedirectToAction(GlobalConstants.Index, "Home"); } // GET: /Account/ExternalLoginFailure [AllowAnonymous] public ActionResult ExternalLoginFailure() { return this.View(); } [ChildActionOnly] public ActionResult RemoveAccountList() { var linkedAccounts = this.UserManager.GetLogins(this.User.Identity.GetUserId()); this.ViewBag.ShowRemoveButton = this.HasPassword() || linkedAccounts.Count > 1; return this.PartialView("_RemoveAccountPartial", linkedAccounts); } [AllowAnonymous] public ActionResult ForgottenPassword() { return this.View(); } [HttpPost] [AllowAnonymous] public ActionResult ForgottenPassword(string emailOrUsername) { if (string.IsNullOrEmpty(emailOrUsername)) { this.ModelState.AddModelError("emailOrUsername", Resources.Account.Views.ForgottenPassword.Email_or_username_required); return this.View(); } var userByUsername = this.Data.Users.GetByUsername(emailOrUsername); if (userByUsername != null) { userByUsername.ForgottenPasswordToken = Guid.NewGuid(); this.Data.SaveChanges(); this.SendForgottenPasswordToUser(userByUsername); this.TempData[GlobalConstants.InfoMessage] = Resources.Account.Views.ForgottenPassword.Email_sent; return this.RedirectToAction("ForgottenPassword"); } // using Where() because duplicate email addresses were allowed in the previous // judge system var usersByEmail = this.Data.Users .All() .Where(x => x.Email == emailOrUsername).ToList(); var usersCount = usersByEmail.Count(); // notify the user if there are no users registered with this email or username if (usersCount == 0) { this.ModelState.AddModelError("emailOrUsername", Resources.Account.Views.ForgottenPassword.Email_or_username_not_registered); return this.View(); } // if there are users registered with this email - send a forgotten password email // to each one of them foreach (var user in usersByEmail) { user.ForgottenPasswordToken = Guid.NewGuid(); this.Data.SaveChanges(); this.SendForgottenPasswordToUser(user); } this.TempData[GlobalConstants.InfoMessage] = Resources.Account.Views.ForgottenPassword.Email_sent; return this.RedirectToAction("ForgottenPassword"); } [AllowAnonymous] public ActionResult ChangePassword(string token) { Guid guid; if (!Guid.TryParse(token, out guid)) { throw new HttpException((int)HttpStatusCode.BadRequest, "Invalid token!"); } var user = this.Data.Users.All().FirstOrDefault(x => x.ForgottenPasswordToken == guid); if (user == null) { throw new HttpException((int)HttpStatusCode.BadRequest, "Invalid token!"); } var forgottenPasswordModel = new ForgottenPasswordViewModel { Token = guid }; return this.View(forgottenPasswordModel); } [HttpPost] [AllowAnonymous] public async Task ChangePassword(ForgottenPasswordViewModel model) { var user = this.Data.Users.All() .FirstOrDefault(x => x.ForgottenPasswordToken == model.Token); if (user == null) { throw new HttpException((int)HttpStatusCode.BadRequest, "Invalid token!"); } if (this.ModelState.IsValid) { var removePassword = await this.UserManager.RemovePasswordAsync(user.Id); if (removePassword.Succeeded) { var changePassword = await this.UserManager.AddPasswordAsync(user.Id, model.Password); if (changePassword.Succeeded) { user.ForgottenPasswordToken = null; this.Data.SaveChanges(); this.TempData[GlobalConstants.InfoMessage] = Resources.Account.Views.ChangePasswordView.Password_updated; return this.RedirectToAction("Login"); } this.AddErrors(changePassword); } this.AddErrors(removePassword); } return this.View(model); } public ActionResult ChangeEmail() { return this.View(); } [HttpPost] public ActionResult ChangeEmail(ChangeEmailViewModel model) { if (this.ModelState.IsValid) { if (this.Data.Users.All().Any(x => x.Email == model.Email)) { this.ModelState.AddModelError("Email", Resources.Account.AccountViewModels.Email_already_registered); } var passwordVerificationResult = this.UserManager.PasswordHasher.VerifyHashedPassword(this.UserProfile.PasswordHash, model.Password); if (passwordVerificationResult != PasswordVerificationResult.Success) { this.ModelState.AddModelError("Password", Resources.Account.AccountViewModels.Incorrect_password); } if (this.ModelState.IsValid) { var currentUser = this.Data.Users.GetById(this.UserProfile.Id); currentUser.Email = model.Email; this.Data.SaveChanges(); this.TempData[GlobalConstants.InfoMessage] = "Success"; return this.RedirectToAction("Profile", new { controller = "Users", area = string.Empty }); } } return this.View(model); } [Authorize] [HttpGet] public ActionResult ChangeUsername() { if (Regex.IsMatch(this.UserProfile.UserName, GlobalConstants.UserNameRegEx) && this.UserProfile.UserName.Length >= GlobalConstants.UserNameMinLength && this.UserProfile.UserName.Length <= GlobalConstants.UserNameMaxLength) { return this.RedirectToAction(GlobalConstants.Index, new { controller = "Profile", area = "Users" }); } return this.View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult ChangeUsername(ChangeUsernameViewModel model) { if (Regex.IsMatch(this.UserProfile.UserName, GlobalConstants.UserNameRegEx) && this.UserProfile.UserName.Length >= GlobalConstants.UserNameMinLength && this.UserProfile.UserName.Length <= GlobalConstants.UserNameMaxLength) { return this.RedirectToAction(GlobalConstants.Index, new { controller = "Profile", area = "Users" }); } if (this.ModelState.IsValid) { if (this.Data.Users.All().Any(x => x.UserName == model.Username)) { this.ModelState.AddModelError("Username", "This username is not available"); return this.View(model); } this.UserProfile.UserName = model.Username; this.Data.SaveChanges(); this.TempData[GlobalConstants.InfoMessage] = Resources.Account.Views.ChangeUsernameView.Username_changed; this.AuthenticationManager.SignOut(); return this.RedirectToAction("Login", new { controller = "Account", area = string.Empty }); } return this.View(model); } protected override void Dispose(bool disposing) { if (disposing && this.UserManager != null) { this.UserManager.Dispose(); this.UserManager = null; } base.Dispose(disposing); } private void SendForgottenPasswordToUser(UserProfile user) { var mailSender = MailSender.Instance; var forgottenPasswordEmailTitle = string.Format( Resources.Account.AccountEmails.Forgotten_password_title, user.UserName); var forgottenPasswordEmailBody = string.Format( Resources.Account.AccountEmails.Forgotten_password_body, user.UserName, this.Url.Action("ChangePassword", "Account", new { token = user.ForgottenPasswordToken }, this.Request.Url.Scheme)); mailSender.SendMail(user.Email, forgottenPasswordEmailTitle, forgottenPasswordEmailBody); } private async Task SignInAsync(UserProfile user, bool isPersistent) { this.AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); var identity = await this.UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); this.AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, identity); } private void AddErrors(IdentityResult result) { foreach (var error in result.Errors) { this.ModelState.AddModelError(string.Empty, error); } } private bool HasPassword() { var user = this.UserManager.FindById(this.User.Identity.GetUserId()); return user?.PasswordHash != null; } private ActionResult RedirectToLocal(string returnUrl) { if (this.Url.IsLocalUrl(returnUrl)) { return this.Redirect(returnUrl); } return this.RedirectToAction(GlobalConstants.Index, "Home"); } private class ChallengeResult : HttpUnauthorizedResult { public ChallengeResult(string provider, string redirectUri, string userId = null) { this.LoginProvider = provider; this.RedirectUri = redirectUri; this.UserId = userId; } private string LoginProvider { get; set; } private string RedirectUri { get; set; } private string UserId { get; set; } public override void ExecuteResult(ControllerContext context) { var properties = new AuthenticationProperties { RedirectUri = this.RedirectUri }; if (this.UserId != null) { properties.Dictionary[AccountController.XsrfKey] = this.UserId; } context.HttpContext.GetOwinContext().Authentication.Challenge(properties, this.LoginProvider); } } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Controllers/AdministrationController.cs ================================================ namespace OJS.Web.Controllers { using System; using System.Collections; using System.ComponentModel.DataAnnotations; using System.IO; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using NPOI.HSSF.UserModel; using OJS.Common; using OJS.Common.DataAnnotations; using OJS.Data; using OJS.Web.Common.Attributes; [LogAccess] [Authorize(Roles = GlobalConstants.AdministratorRoleName)] public class AdministrationController : BaseController { public AdministrationController(IOjsData data) : base(data) { } [NonAction] protected FileResult ExportToExcel([DataSourceRequest]DataSourceRequest request, IEnumerable data) { if (data == null) { throw new Exception("GetData() and DataType must be overridden"); } // Get the data representing the current grid state - page, sort and filter request.PageSize = 0; IEnumerable items = data.ToDataSourceResult(request).Data; return this.CreateExcelFile(items); } [NonAction] protected FileResult CreateExcelFile(IEnumerable items) { Type dataType = items.GetType().GetGenericArguments()[0]; var dataTypeProperties = dataType.GetProperties(); // Create new Excel workbook var workbook = new HSSFWorkbook(); // Create new Excel sheet var sheet = workbook.CreateSheet(); // Create a header row var headerRow = sheet.CreateRow(0); int columnNumber = 0; foreach (var property in dataTypeProperties) { bool include = true; object[] excludeAttributes = property.GetCustomAttributes(typeof(ExcludeFromExcelAttribute), true); if (excludeAttributes.Any()) { include = false; } if (include) { string cellName = property.Name; object[] attributes = property.GetCustomAttributes(typeof(DisplayAttribute), true); if (attributes.Any()) { var attribute = attributes[0] as DisplayAttribute; if (attribute != null) { cellName = attribute.Name ?? property.Name; } } headerRow.CreateCell(columnNumber++).SetCellValue(cellName); } } // (Optional) freeze the header row so it is not scrolled sheet.CreateFreezePane(0, 1, 0, 1); int rowNumber = 1; // Populate the sheet with values from the grid data foreach (object item in items) { // Create a new row var row = sheet.CreateRow(rowNumber++); int cellNumber = 0; foreach (var property in dataTypeProperties) { bool include = true; object[] excludeAttributes = property.GetCustomAttributes(typeof(ExcludeFromExcelAttribute), true); if (excludeAttributes.Any()) { include = false; } if (include) { object propertyValue = item.GetType().GetProperty(property.Name).GetValue(item, null); if (propertyValue == null) { row.CreateCell(cellNumber).SetCellType(NPOI.SS.UserModel.CellType.Blank); } else { var cell = row.CreateCell(cellNumber); double value; var typeCode = Type.GetTypeCode(property.PropertyType); if (typeCode == TypeCode.Single || typeCode == TypeCode.Char) { cell.SetCellValue(propertyValue.ToString()); } if (double.TryParse(propertyValue.ToString(), out value)) { cell.SetCellValue(value); cell.SetCellType(NPOI.SS.UserModel.CellType.Numeric); } else if (typeCode == TypeCode.DateTime) { cell.SetCellValue((DateTime)propertyValue); } else { string propertyValueAsString = propertyValue.ToString(); if (propertyValue.ToString().Length > 10000) { propertyValueAsString = "THIS CELL DOES NOT CONTAIN FULL INFORMATION: " + propertyValueAsString.Substring(0, 10000); } cell.SetCellValue(propertyValueAsString); } } cellNumber++; } } } // Auto-size all columns for (int i = 0; i < columnNumber; i++) { sheet.AutoSizeColumn(i); } // Write the workbook to a memory stream var outputStream = new MemoryStream(); workbook.Write(outputStream); // Return the result to the end user return this.File( outputStream.ToArray(), // The binary data of the XLS file GlobalConstants.ExcelMimeType, // MIME type of Excel files string.Format("{0}.xls", this.GetType().Name)); // Suggested file name in the "Save as" dialog which will be displayed to the end user } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Controllers/BaseController.cs ================================================ namespace OJS.Web.Controllers { using System; using System.Linq; using System.Linq.Expressions; using System.Text.RegularExpressions; using System.Web; using System.Web.Mvc; using System.Web.Routing; using System.Web.Script.Serialization; using OJS.Common; using OJS.Data; using OJS.Data.Models; using OJS.Web.Common; using OJS.Web.ViewModels; public class BaseController : Controller { public BaseController(IOjsData data) { this.Data = data; } public BaseController(IOjsData data, UserProfile profile) : this(data) { this.UserProfile = profile; } protected IOjsData Data { get; set; } protected UserProfile UserProfile { get; set; } protected internal RedirectToRouteResult RedirectToAction(Expression> expression) where TController : Controller { var method = expression.Body as MethodCallExpression; if (method == null) { throw new ArgumentException("Expected method call"); } return this.RedirectToAction(method.Method.Name); } protected override IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state) { // Work with data before BeginExecute to prevent "NotSupportedException: A second operation started on this context before a previous asynchronous operation completed." this.UserProfile = this.Data.Users.GetByUsername(requestContext.HttpContext.User.Identity.Name); this.ViewBag.MainCategories = this.Data.ContestCategories.All() .Where(x => x.IsVisible && !x.ParentId.HasValue) .OrderBy(x => x.OrderBy) .Select(CategoryMenuItemViewModel.FromCategory); // Calling BeginExecute before PrepareSystemMessages for the TempData to has values var result = base.BeginExecute(requestContext, callback, state); var systemMessages = this.PrepareSystemMessages(); this.ViewBag.SystemMessages = systemMessages; return result; } protected override void OnException(ExceptionContext filterContext) { if (filterContext.ExceptionHandled) { return; } if (this.Request.IsAjaxRequest()) { var exception = filterContext.Exception as HttpException; if (exception != null) { this.Response.StatusCode = exception.GetHttpCode(); this.Response.StatusDescription = exception.Message; } } else { var controllerName = this.ControllerContext.RouteData.Values["Controller"].ToString(); var actionName = this.ControllerContext.RouteData.Values["Action"].ToString(); this.View("Error", new HandleErrorInfo(filterContext.Exception, controllerName, actionName)).ExecuteResult(this.ControllerContext); } filterContext.ExceptionHandled = true; } /// /// Creates a JSON object with maximum size. /// /// JSON data. /// Returns a JSON as content result. protected ContentResult LargeJson(object data) { var serializer = new JavaScriptSerializer { MaxJsonLength = int.MaxValue, RecursionLimit = 100 }; return new ContentResult { Content = serializer.Serialize(data), ContentType = GlobalConstants.JsonMimeType, }; } private SystemMessageCollection PrepareSystemMessages() { // Warning: always escape data to prevent XSS var messages = new SystemMessageCollection(); if (this.TempData.ContainsKey(GlobalConstants.InfoMessage)) { messages.Add(this.TempData[GlobalConstants.InfoMessage].ToString(), SystemMessageType.Success, 1000); } if (this.TempData.ContainsKey(GlobalConstants.DangerMessage)) { messages.Add(this.TempData[GlobalConstants.DangerMessage].ToString(), SystemMessageType.Error, 1000); } if (this.UserProfile != null) { if (this.UserProfile.PasswordHash == null) { messages.Add(Resources.Base.Main.Password_not_set, SystemMessageType.Warning, 0); } if (!Regex.IsMatch(this.UserProfile.UserName, GlobalConstants.UserNameRegEx) || this.UserProfile.UserName.Length < GlobalConstants.UserNameMinLength || this.UserProfile.UserName.Length > GlobalConstants.UserNameMaxLength) { messages.Add(Resources.Base.Main.Username_in_invalid_format, SystemMessageType.Warning, 0); } } return messages; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Controllers/FeedbackController.cs ================================================ namespace OJS.Web.Controllers { using System.Web.Mvc; using OJS.Common; using OJS.Data; using OJS.Data.Models; using OJS.Web.ViewModels.Feedback; using Recaptcha; using Resource = Resources.Feedback.Views; public class FeedbackController : BaseController { public FeedbackController(IOjsData data) : base(data) { } [HttpGet] public ActionResult Index() { return this.View(); } [HttpPost] [RecaptchaControlMvc.CaptchaValidator] public ActionResult Index(FeedbackViewModel model, bool captchaValid) { if (!captchaValid) { this.ModelState.AddModelError("Captcha", Resource.FeedbackIndex.Invalid_captcha); } if (this.ModelState.IsValid) { var report = new FeedbackReport { Content = model.Content, Email = model.Email, Name = model.Name }; if (this.User.Identity.IsAuthenticated) { var userProfile = this.Data.Users.GetByUsername(this.User.Identity.Name); report.User = userProfile; } this.Data.FeedbackReports.Add(report); this.Data.SaveChanges(); this.TempData[GlobalConstants.InfoMessage] = Resource.FeedbackIndex.Feedback_submitted; return this.RedirectToAction("Submitted"); } return this.View(model); } [HttpGet] public ActionResult Submitted() { return this.View(); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Controllers/HomeController.cs ================================================ namespace OJS.Web.Controllers { using System.Linq; using System.Text; using System.Web.Mvc; using OJS.Data; using OJS.Web.ViewModels.Home.Index; public class HomeController : BaseController { public HomeController(IOjsData data) : base(data) { } public ActionResult Index() { var indexViewModel = new IndexViewModel { ActiveContests = this.Data.Contests.AllActive() .OrderByDescending(x => x.StartTime) .Select(HomeContestViewModel.FromContest) .ToList(), FutureContests = this.Data.Contests.AllFuture() .OrderBy(x => x.StartTime) .Select(HomeContestViewModel.FromContest) .ToList(), PastContests = this.Data.Contests.AllPast() .OrderByDescending(x => x.StartTime) .Select(HomeContestViewModel.FromContest) .Take(5) .ToList() }; return this.View(indexViewModel); } /// /// Gets the robots.txt file. /// /// Returns a robots.txt file. [HttpGet] [OutputCache(Duration = 3600)] public FileResult RobotsTxt() { var robotsTxtContent = new StringBuilder(); robotsTxtContent.AppendLine("User-Agent: *"); robotsTxtContent.AppendLine("Allow: /"); return this.File(Encoding.ASCII.GetBytes(robotsTxtContent.ToString()), "text/plain"); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Controllers/KendoGridAdministrationController.cs ================================================ namespace OJS.Web.Controllers { using System; using System.Collections; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using Newtonsoft.Json; using OJS.Common; using OJS.Data; using OJS.Web.Common.Interfaces; public abstract class KendoGridAdministrationController : AdministrationController, IKendoGridAdministrationController { private const string CreatedOnPropertyName = "CreatedOn"; private const string ModifiedOnPropertyName = "ModifiedOn"; protected KendoGridAdministrationController(IOjsData data) : base(data) { } public abstract IEnumerable GetData(); public abstract object GetById(object id); public virtual string GetEntityKeyName() { throw new InvalidOperationException("GetEntityKeyName method required but not implemented in derived controller"); } [HttpPost] public virtual ActionResult Read([DataSourceRequest]DataSourceRequest request) { var data = this.GetData(); var serializationSettings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; var json = JsonConvert.SerializeObject(data.ToDataSourceResult(request), Formatting.None, serializationSettings); return this.Content(json, GlobalConstants.JsonMimeType); } [HttpGet] public FileResult ExportToExcel([DataSourceRequest] DataSourceRequest request) { return this.ExportToExcel(request, this.GetData()); } protected object BaseCreate(object model) { if (model != null && this.ModelState.IsValid) { var itemForAdding = this.Data.Context.Entry(model); itemForAdding.State = EntityState.Added; this.Data.SaveChanges(); var databaseValues = itemForAdding.GetDatabaseValues(); return databaseValues[this.GetEntityKeyName()]; } return null; } protected void BaseUpdate(object model) { if (model != null && this.ModelState.IsValid) { var itemForUpdating = this.Data.Context.Entry(model); itemForUpdating.State = EntityState.Modified; this.Data.SaveChanges(); } } protected void BaseDestroy(object id) { var model = this.GetById(id); if (model != null) { var itemForDeletion = this.Data.Context.Entry(model); if (itemForDeletion != null) { itemForDeletion.State = EntityState.Deleted; this.Data.SaveChanges(); } } } [NonAction] protected JsonResult GridOperation([DataSourceRequest]DataSourceRequest request, object model) { return this.Json(new[] { model }.ToDataSourceResult(request, this.ModelState)); } protected string GetEntityKeyNameByType(Type type) { return type.GetProperties() .FirstOrDefault(pr => pr.GetCustomAttributes(typeof(KeyAttribute), true).Any()) .Name; } protected void UpdateAuditInfoValues(IAdministrationViewModel viewModel, object databaseModel) where T : class, new() { var entry = this.Data.Context.Entry(databaseModel); viewModel.CreatedOn = (DateTime?)entry.Property(CreatedOnPropertyName).CurrentValue; viewModel.ModifiedOn = (DateTime?)entry.Property(ModifiedOnPropertyName).CurrentValue; } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Controllers/NewsController.cs ================================================ namespace OJS.Web.Controllers { using System.Collections.Generic; using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using OJS.Data; using OJS.Web.ViewModels.News; using Resource = Resources.News; public class NewsController : BaseController { public NewsController(IOjsData data) : base(data) { } public ActionResult All(int id = 1, int pageSize = 10) { var newsCount = this.Data.News.All().Count(x => x.IsVisible); IEnumerable news; int page = 0; int pages = 0; if (newsCount == 0) { news = new List(); } else { if (newsCount % pageSize == 0) { pages = newsCount / pageSize; } else { pages = (newsCount / pageSize) + 1; } if (id < 1) { id = 1; } else if (id > pages) { id = pages; } if (pageSize < 1) { pageSize = 10; } page = id; news = this.Data.News.All() .Where(x => x.IsVisible) .OrderByDescending(x => x.CreatedOn) .Skip((page - 1) * pageSize) .Take(pageSize) .Select(NewsViewModel.FromNews) .ToList(); } var allNewsModel = new AllNewsViewModel { AllNews = news, CurrentPage = page, PageSize = pageSize, AllPages = pages }; return this.View(allNewsModel); } public ActionResult Selected(int id = 1) { var currentNews = this.Data.News.GetById(id); if (currentNews == null || currentNews.IsDeleted) { throw new HttpException((int)HttpStatusCode.NotFound, Resource.Views.Selected.Invalid_news_id); } var previousNews = this.Data.News.All() .OrderByDescending(x => x.Id) .FirstOrDefault(x => x.Id < currentNews.Id && x.IsVisible && !x.IsDeleted) ?? this.Data.News.All().OrderByDescending(x => x.Id).First(x => x.IsVisible && !x.IsDeleted); var nextNews = this.Data.News.All() .OrderBy(x => x.Id) .FirstOrDefault(x => x.Id > currentNews.Id && x.IsVisible && !x.IsDeleted) ?? this.Data.News.All().OrderBy(x => x.Id).First(x => x.IsVisible && !x.IsDeleted); var newsContentViewModel = new SelectedNewsViewModel { Id = currentNews.Id, Title = currentNews.Title, Author = currentNews.Author, Source = currentNews.Source, TimeCreated = currentNews.CreatedOn, Content = currentNews.Content, PreviousId = previousNews.Id, NextId = nextNews.Id }; return this.View(newsContentViewModel); } [ChildActionOnly] public ActionResult LatestNews(int newsCount = 5) { var latestNews = this.Data.News.All() .OrderByDescending(x => x.CreatedOn) .Where(x => x.IsVisible && !x.IsDeleted) .Select(SelectedNewsViewModel.FromNews) .Take(newsCount) .ToList(); return this.PartialView("_LatestNews", latestNews); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Controllers/RedirectsController.cs ================================================ namespace OJS.Web.Controllers { using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using OJS.Common.Models; using OJS.Data; public class RedirectsController : BaseController { public RedirectsController(IOjsData data) : base(data) { } public static List> OldSystemRedirects { get; } = new List> { new KeyValuePair("Contest/List", "/Contests"), new KeyValuePair("Home/SubmissionLog", "/Submissions"), new KeyValuePair("Home/ReportBug", "/Feedback"), new KeyValuePair("Home/SendBugReport", "/Feedback"), new KeyValuePair("Account/LogOn", "/Account/Login"), new KeyValuePair("Account/Profile", "/Users/Profile"), }; public RedirectResult Index(int id) { return this.RedirectPermanent(OldSystemRedirects[id].Value); } public RedirectResult ProfileView(int id) { var username = this.Data.Users.All().Where(x => x.OldId == id).Select(x => x.UserName).FirstOrDefault(); return this.RedirectPermanent($"/Users/{username}"); } public RedirectResult ContestCompete(int id) { var newId = this.Data.Contests.All().Where(x => x.OldId == id).Select(x => x.Id).FirstOrDefault(); return this.RedirectPermanent($"/Contests/Compete/Index/{newId}"); } public RedirectResult ContestPractice(int id) { var newId = this.Data.Contests.All().Where(x => x.OldId == id).Select(x => x.Id).FirstOrDefault(); return this.RedirectPermanent($"/Contests/Practice/Index/{newId}"); } public RedirectResult ContestResults(int id) { var newId = this.Data.Contests.All().Where(x => x.OldId == id).Select(x => x.Id).FirstOrDefault(); return this.RedirectPermanent($"/Contests/Compete/Results/Simple/{newId}"); } public RedirectResult PracticeResults(int id) { var newId = this.Data.Contests.All().Where(x => x.OldId == id).Select(x => x.Id).FirstOrDefault(); return this.RedirectPermanent($"/Contests/Practice/Results/Simple/{newId}"); } public RedirectResult DownloadTask(int id) { var resourceId = this.Data.Resources.All() .Where(x => x.Problem.OldId == id && x.Type == ProblemResourceType.ProblemDescription) .Select(x => x.Id) .FirstOrDefault(); return this.RedirectPermanent($"/Contests/Practice/DownloadResource/{resourceId}"); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Controllers/SearchController.cs ================================================ namespace OJS.Web.Controllers { using System.Data.Entity; using System.Linq; using System.Web.Mvc; using OJS.Data; using OJS.Web.Common; using OJS.Web.ViewModels.Search; public class SearchController : BaseController { public SearchController(IOjsData data) : base(data) { } public ActionResult Index() { return this.View(); } public ActionResult Results(string searchTerm) { var searchResult = new SearchResultGroupViewModel(searchTerm); if (searchResult.IsSearchTermValid) { var problemSearchResults = this.Data.Problems.All().Include(x => x.Contest) .Where(x => !x.IsDeleted && x.Name.Contains(searchResult.SearchTerm)) .ToList() .AsQueryable() .Where(x => x.Contest.CanBeCompeted || x.Contest.CanBePracticed) .Select(SearchResultViewModel.FromProblem); searchResult.SearchResults.Add(SearchResultType.Problem, problemSearchResults); var contestSearchResults = this.Data.Contests.All() .Where(x => x.IsVisible && !x.IsDeleted && x.Name.Contains(searchResult.SearchTerm)) .ToList() .AsQueryable() .Where(x => x.CanBeCompeted || x.CanBePracticed) .Select(SearchResultViewModel.FromContest); searchResult.SearchResults.Add(SearchResultType.Contest, contestSearchResults); var userSearchResults = this.Data.Users.All() .Where(x => !x.IsDeleted && x.UserName.Contains(searchResult.SearchTerm)) .Select(SearchResultViewModel.FromUser); searchResult.SearchResults.Add(SearchResultType.User, userSearchResults); } return this.View(searchResult); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Controllers/SubmissionsController.cs ================================================ namespace OJS.Web.Controllers { using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using Newtonsoft.Json; using OJS.Common; using OJS.Data; using OJS.Data.Models; using OJS.Web.Common.Extensions; using OJS.Web.ViewModels.Submission; public class SubmissionsController : BaseController { public SubmissionsController(IOjsData data) : base(data) { } public ActionResult Index() { if (this.User.Identity.IsAuthenticated) { return this.View("AdvancedSubmissions"); } var submissions = this.Data.Submissions .GetLastFiftySubmissions() .Select(SubmissionViewModel.FromSubmission) .ToList(); return this.View("BasicSubmissions", submissions.ToList()); } [HttpPost] public ActionResult ReadSubmissions([DataSourceRequest] DataSourceRequest request, string userId) { IQueryable data; if (this.User.IsAdmin()) { data = this.Data.Submissions.All(); if (userId != null) { data = data.Where(s => s.Participant.UserId == userId); } } else { data = this.Data.Submissions.AllPublic(); if (userId != null) { data = data.Where(s => s.Participant.UserId == userId); } } var result = data.Select(SubmissionViewModel.FromSubmission); var serializationSettings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; string json = JsonConvert.SerializeObject(result.ToDataSourceResult(request), Formatting.None, serializationSettings); return this.Content(json, GlobalConstants.JsonMimeType); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/Global.asax ================================================ <%@ Application Codebehind="Global.asax.cs" Inherits="OJS.Web.MvcApplication" Language="C#" %> ================================================ FILE: Open Judge System/Web/OJS.Web/Global.asax.cs ================================================ namespace OJS.Web { using System.Data.Entity; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using OJS.Data; using OJS.Data.Migrations; using OJS.Data.Providers.Registries; #pragma warning disable SA1649 // File name must match first type name public class MvcApplication : System.Web.HttpApplication #pragma warning restore SA1649 // File name must match first type name { protected void Application_Start() { // Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); Database.SetInitializer(new MigrateDatabaseToLatestVersion()); EfBulkInsertGlimpseProviderRegistry.Execute(); AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); ViewEngineConfig.RegisterViewEngines(ViewEngines.Engines); } } } ================================================ FILE: Open Judge System/Web/OJS.Web/JSLintNet.json ================================================ { "output": "Error", "runOnSave": false, "runOnBuild": false, "cancelBuild": false, "ignore": [ "\\Scripts\\Administration\\Tests\\tests-details.js" ] } ================================================ FILE: Open Judge System/Web/OJS.Web/OJS.Web.csproj ================================================  Debug AnyCPU 2.0 {C2EF4F1B-A694-4E52-935C-7872F6CAD37C} {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties OJS.Web OJS.Web v4.5 true true ..\..\ true full false bin\ DEBUG;TRACE prompt 4 ..\..\Rules.ruleset pdbonly true bin\ TRACE prompt 4 ..\..\Rules.ruleset False ..\..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll True ..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll True False ..\..\packages\Glimpse.Ado.1.7.3\lib\net45\Glimpse.Ado.dll ..\..\packages\Glimpse.AspNet.1.9.2\lib\net45\Glimpse.AspNet.dll True False ..\..\packages\Glimpse.1.8.6\lib\net45\Glimpse.Core.dll ..\..\packages\Glimpse.EF6.1.6.5\lib\net45\Glimpse.EF6.dll True False ..\..\packages\Glimpse.Mvc4.1.5.3\lib\net40\Glimpse.Mvc4.dll False ..\..\packages\HtmlAgilityPack.1.4.9\lib\Net45\HtmlAgilityPack.dll ..\..\packages\NPOI.2.1.3.1\lib\net40\ICSharpCode.SharpZipLib.dll True ..\..\packages\DotNetZip.1.9.8\lib\net20\Ionic.Zip.dll True False ..\..\External Libraries\Kendo.Mvc.dll False ..\..\packages\Microsoft.AspNet.Identity.Core.1.0.0\lib\net45\Microsoft.AspNet.Identity.Core.dll False ..\..\packages\Microsoft.AspNet.Identity.EntityFramework.1.0.0\lib\net45\Microsoft.AspNet.Identity.EntityFramework.dll False ..\..\packages\Microsoft.AspNet.Identity.Owin.1.0.0\lib\net45\Microsoft.AspNet.Identity.Owin.dll False ..\..\packages\Microsoft.Owin.2.1.0\lib\net45\Microsoft.Owin.dll False ..\..\packages\Microsoft.Owin.Host.SystemWeb.2.1.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll False ..\..\packages\Microsoft.Owin.Security.2.1.0\lib\net45\Microsoft.Owin.Security.dll False ..\..\packages\Microsoft.Owin.Security.Cookies.2.1.0\lib\net45\Microsoft.Owin.Security.Cookies.dll False ..\..\packages\Microsoft.Owin.Security.Facebook.2.1.0\lib\net45\Microsoft.Owin.Security.Facebook.dll False ..\..\packages\Microsoft.Owin.Security.Google.2.1.0\lib\net45\Microsoft.Owin.Security.Google.dll False ..\..\packages\Microsoft.Owin.Security.MicrosoftAccount.2.1.0\lib\net45\Microsoft.Owin.Security.MicrosoftAccount.dll False ..\..\packages\Microsoft.Owin.Security.OAuth.2.1.0\lib\net45\Microsoft.Owin.Security.OAuth.dll False ..\..\packages\Microsoft.Owin.Security.Twitter.2.1.0\lib\net45\Microsoft.Owin.Security.Twitter.dll ..\..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll True False ..\..\packages\Ninject.3.2.2.0\lib\net45-full\Ninject.dll False ..\..\packages\Ninject.Web.Common.3.2.3.0\lib\net45-full\Ninject.Web.Common.dll ..\..\packages\Ninject.MVC5.3.2.1.0\lib\net45-full\Ninject.Web.Mvc.dll True ..\..\packages\NPOI.2.1.3.1\lib\net40\NPOI.dll True ..\..\packages\NPOI.2.1.3.1\lib\net40\NPOI.OOXML.dll True ..\..\packages\NPOI.2.1.3.1\lib\net40\NPOI.OpenXml4Net.dll True ..\..\packages\NPOI.2.1.3.1\lib\net40\NPOI.OpenXmlFormats.dll True ..\..\packages\Owin.1.0\lib\net40\Owin.dll ..\..\packages\recaptcha.1.0.5.0\lib\.NetFramework 4.0\Recaptcha.dll ..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll True ..\..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll True False ..\..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll ..\..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll True ..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll True ..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll True ..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll True True ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll ..\..\packages\WebActivatorEx.2.1.0\lib\net40\WebActivatorEx.dll True False ..\..\packages\WebGrease.1.6.0\lib\WebGrease.dll AccountEmails.bg.resx True True True True AccountEmails.resx AccountViewModels.bg.resx True True True True AccountViewModels.resx ChangeEmailView.bg.resx True True True True ChangeEmailView.resx ChangeUsernameView.bg.resx True True ChangeUsernameView.resx True True ChangePasswordView.bg.resx True True True True ChangePasswordView.resx Disassociate.bg.resx True True ExternalLoginCallback.bg.resx True True ExternalLoginConfirmation.resx True True ExternalLoginConfirmation.bg.resx True True True True Disassociate.resx ExternalLoginCallback.resx True True ExternalLoginFailure.bg.resx True True True True ExternalLoginFailure.resx ForgottenPassword.bg.resx True True True True ForgottenPassword.resx General.bg.resx True True True True General.resx Login.bg.resx True True True True Login.resx Manage.bg.resx True True True True Manage.resx ChangePassword.bg.resx True True True True ChangePassword.resx ExternalLoginsList.bg.resx True True True True ExternalLoginsList.resx RemoveAccount.bg.resx True True True True RemoveAccount.resx SetPassword.bg.resx True True True True SetPassword.resx Register.bg.resx True True True True Register.resx True True AccessLogGridViewModel.bg.resx True True AccessLogGridViewModel.resx True True AccessLogsIndex.bg.resx True True AccessLogsIndex.resx True True AdministrationGeneral.bg.resx True True AdministrationGeneral.resx True True AntiCheatViews.bg.resx True True AntiCheatViews.resx True True CheckerAdministrationViewModel.bg.resx True True CheckerAdministrationViewModel.resx True True CheckersIndex.bg.resx True True CheckersIndex.resx True True ContestCategoryAdministrationViewModel.bg.resx True True ContestCategoryAdministrationViewModel.resx True True ContestCategoriesViews.bg.resx True True ContestCategoriesViews.resx True True ContestsControllers.bg.resx True True ContestsControllers.resx True True ContestCreate.bg.resx True True ContestCreate.resx True True ContestEdit.bg.resx True True ContestEdit.resx True True ContestIndex.bg.resx True True ContestIndex.resx True True ContestAdministration.bg.resx True True ContestAdministration.resx True True ContestQuestion.bg.resx True True ContestQuestion.resx True True ContestQuestionAnswer.bg.resx True True ContestQuestionAnswer.resx True True ShortContestAdministration.bg.resx True True ShortContestAdministration.resx True True CategoryDropDown.bg.resx True True CategoryDropDown.resx True True SubmissionTypeCheckBoxes.bg.resx True True SubmissionTypeCheckBoxes.resx True True ContestEditor.bg.resx True True ContestEditor.resx True True FeedbackReport.bg.resx True True FeedbackReport.resx True True FeedbackIndexAdmin.bg.resx True True FeedbackIndexAdmin.resx True True NewsAdministration.bg.resx True True NewsAdministration.resx True True NewsIndex.bg.resx True True NewsIndex.resx True True ParticipantViewModels.bg.resx True True ParticipantViewModels.resx True True ParticipantEditorTemplates.bg.resx True True ParticipantEditorTemplates.resx True True Participants.bg.resx True True Participants.resx True True ParticipantsContest.bg.resx True True ParticipantsContest.resx True True ParticipantsIndex.bg.resx True True ParticipantsIndex.resx True True ProblemsControllers.bg.resx True True ProblemsControllers.resx True True DetailedProblem.bg.resx True True DetailedProblem.resx True True ProblemResources.bg.resx True True ProblemResources.resx True True ProblemsPartials.bg.resx True True ProblemsPartials.resx True True ProblemsCreate.bg.resx True True ProblemsCreate.resx True True ProblemsDelete.bg.resx True True ProblemsDelete.resx True True ProblemsDeleteAll.bg.resx True True ProblemsDeleteAll.resx True True ProblemsDetails.bg.resx True True ProblemsDetails.resx True True ProblemsEdit.bg.resx True True ProblemsEdit.resx True True ProblemsIndex.bg.resx True True ProblemsIndex.resx True True ResourcesControllers.bg.resx True True ResourcesControllers.resx True True ResourcesCreate.bg.resx True True ResourcesCreate.resx True True ResourcesEdit.bg.resx True True ResourcesEdit.resx True True RolesViewModels.bg.resx True True RolesViewModels.resx True True RolesIndex.bg.resx True True RolesIndex.resx True True SettingAdministration.bg.resx True True SettingAdministration.resx True True SettingsAdministrationIndex.bg.resx True True SettingsAdministrationIndex.resx True True Partials.bg.resx True True Partials.resx True True SubmissionsControllers.bg.resx True True SubmissionsControllers.resx True True SubmissionAdministration.bg.resx True True SubmissionAdministration.resx True True SubmissionsGrid.bg.resx True True SubmissionsGrid.resx True True SubmissionTypeAdministration.bg.resx True True SubmissionTypeAdministration.resx True True SubmissionsEditorTemplates.bg.resx True True SubmissionsEditorTemplates.resx True True SubmissionForm.bg.resx True True SubmissionForm.resx True True SubmissionsCreate.bg.resx True True SubmissionsCreate.resx True True SubmissionsDelete.bg.resx True True SubmissionsDelete.resx True True SubmissionsIndex.bg.resx True True SubmissionsIndex.resx True True SubmissionsUpdate.bg.resx True True SubmissionsUpdate.resx True True SubmissionTypesIndex.bg.resx True True SubmissionTypesIndex.resx True True TestsControllers.bg.resx True True TestsControllers.resx True True TestAdministration.bg.resx True True TestAdministration.resx True True TestsCreate.bg.resx True True TestsDelete.bg.resx True True TestsDeleteAll.bg.resx True True TestsDetails.bg.resx True True TestsDetails.resx True True TestsCreate.resx True True TestsDelete.resx True True TestsDeleteAll.resx True True TestsEdit.bg.resx True True TestsEdit.resx True True TestsIndex.bg.resx True True TestsIndex.resx True True UserProfileAdministration.bg.resx True True UserProfileAdministration.resx True True UsersIndex.bg.resx True True UsersIndex.resx ContestsGeneral.bg.resx True True True True ContestsGeneral.resx ContestsAllContestSubmissionsByUser.bg.resx True True True True ContestsAllContestSubmissionsByUser.resx ContestsProblemPartial.bg.resx True True True True ContestsProblemPartial.resx ContestsViewModels.bg.resx True True True True ContestsViewModels.resx ProblemsViewModels.bg.resx True True True True ProblemsViewModels.resx SubmissionsViewModels.bg.resx True True True True SubmissionsViewModels.resx CompeteIndex.bg.resx True True True True CompeteIndex.resx CompeteRegister.bg.resx True True True True CompeteRegister.resx True True StatsPartial.bg.resx True True StatsPartial.resx ContestsDetails.bg.resx True True True True ContestsDetails.resx ListIndex.bg.resx True True ListIndex.resx True True ListByType.bg.resx True True ListByType.resx True True ListByCategory.bg.resx True True True True ListByCategory.resx ResultsFull.bg.resx True True ResultsFull.resx True True ResultsSimple.bg.resx True True True True ResultsSimple.resx SubmissionsView.bg.resx True True True True SubmissionsView.resx ProfileViewModels.bg.resx True True True True ProfileViewModels.resx True True ProfileIndex.bg.resx True True ProfileIndex.resx ProfileProfileInfo.bg.resx True True True True ProfileProfileInfo.resx SettingsIndex.bg.resx True True True True SettingsIndex.resx FeedbackViewModels.bg.resx True True True True FeedbackViewModels.resx FeedbackIndex.bg.resx True True True True FeedbackIndex.resx FeedbackSubmitted.bg.resx True True True True FeedbackSubmitted.resx True True ContestQuestionTypeResource.resx True True ContestQuestionTypeResource.bg.resx All.bg.resx True True True True All.resx LatestNews.bg.resx True True True True LatestNews.resx Selected.bg.resx True True True True Selected.resx SearchIndex.bg.resx True True SearchIndex.resx True True SearchResults.bg.resx True True True True SearchResults.resx True True AdvancedSubmissions.bg.resx True True AdvancedSubmissions.resx True True BasicSubmissions.bg.resx True True BasicSubmissions.resx True True AdvancedSubmissionsGridPartial.bg.resx True True AdvancedSubmissionsGridPartial.resx LoginPartial.bg.resx True True LoginPartial.resx True True Layout.bg.resx True True True True Layout.resx Main.bg.resx True True True True Main.resx True True Global.resx Index.resx True True True True Index.bg.resx False Global.asax PublicResXFileCodeGenerator AccessLogsIndex.Designer.cs Resources.Areas.Administration.AccessLogs.Views PublicResXFileCodeGenerator AccessLogsIndex.bg.Designer.cs Resources.Areas.Administration.AccessLogs.Views PublicResXFileCodeGenerator AccessLogGridViewModel.Designer.cs Resources.Areas.Administration.AccessLogs.ViewModels PublicResXFileCodeGenerator AccessLogGridViewModel.bg.designer.cs Resources.Areas.Administration.AccessLogs.ViewModels PublicResXFileCodeGenerator AdministrationGeneral.Designer.cs Resources.Areas.Administration PublicResXFileCodeGenerator AdministrationGeneral.bg.designer.cs Resources.Areas.Administration PublicResXFileCodeGenerator AntiCheatViews.Designer.cs Resources.Areas.Administration.AntiCheat.Views PublicResXFileCodeGenerator AntiCheatViews.bg.designer.cs Resources.Areas.Administration.AntiCheat.Views PublicResXFileCodeGenerator CheckersIndex.Designer.cs Resources.Areas.Administration.Checkers.Views PublicResXFileCodeGenerator CheckersIndex.bg.designer.cs Resources.Areas.Administration.Checkers.Views PublicResXFileCodeGenerator CheckerAdministrationViewModel.Designer.cs Resources.Areas.Administration.Checkers.ViewModels PublicResXFileCodeGenerator CheckerAdministrationViewModel.bg.designer.cs Resources.Areas.Administration.Checkers.Views PublicResXFileCodeGenerator ContestCategoryAdministrationViewModel.Designer.cs Resources.Areas.Administration.ContestCategories.ViewModels PublicResXFileCodeGenerator ContestCategoryAdministrationViewModel.bg.designer.cs Resources.Areas.Administration.ContestCategories.ViewModels PublicResXFileCodeGenerator ContestCategoriesViews.Designer.cs Resources.Areas.Administration.ContestCategories.Views PublicResXFileCodeGenerator ContestCategoriesViews.bg.designer.cs Resources.Areas.Administration.ContestCategories.Views PublicResXFileCodeGenerator ContestsControllers.Designer.cs Resources.Areas.Administration.Contests PublicResXFileCodeGenerator ContestsControllers.bg.designer.cs Resources.Areas.Administration.Contests PublicResXFileCodeGenerator ContestCreate.designer.cs Resources.Areas.Administration.Contests.Views PublicResXFileCodeGenerator ContestCreate.bg.designer.cs Resources.Areas.Administration.Contests.Views PublicResXFileCodeGenerator ContestEdit.Designer.cs Resources.Areas.Administration.Contests.Views PublicResXFileCodeGenerator ContestEdit.bg.designer.cs Resources.Areas.Administration.Contests.Views PublicResXFileCodeGenerator ContestIndex.Designer.cs Resources.Areas.Administration.Contests.Views PublicResXFileCodeGenerator ContestIndex.bg.designer.cs Resources.Areas.Administration.Contests.Views PublicResXFileCodeGenerator ContestAdministration.Designer.cs Resources.Areas.Administration.Contests.ViewModels PublicResXFileCodeGenerator ContestAdministration.bg.Designer.cs Resources.Areas.Administration.Contests.ViewModels PublicResXFileCodeGenerator ContestQuestion.Designer.cs Resources.Areas.Administration.Contests.ViewModels PublicResXFileCodeGenerator ContestQuestion.bg.designer.cs Resources.Areas.Administration.Contests.ViewModels PublicResXFileCodeGenerator ContestQuestionAnswer.bg.designer.cs Resources.Areas.Administration.Contests.ViewModels PublicResXFileCodeGenerator ContestQuestionAnswer.Designer.cs Resources.Areas.Administration.Contests.ViewModels PublicResXFileCodeGenerator ShortContestAdministration.Designer.cs Resources.Areas.Administration.Contests.ViewModels PublicResXFileCodeGenerator ShortContestAdministration.bg.Designer.cs Resources.Areas.Administration.Contests.ViewModels PublicResXFileCodeGenerator CategoryDropDown.Designer.cs Resources.Areas.Administration.Contests.Views.EditorTemplates PublicResXFileCodeGenerator CategoryDropDown.bg.designer.cs Resources.Areas.Administration.Contests.Views.EditorTemplates PublicResXFileCodeGenerator SubmissionTypeCheckBoxes.Designer.cs Resources.Areas.Administration.Contests.Views.EditorTemplates PublicResXFileCodeGenerator SubmissionTypeCheckBoxes.bg.designer.cs Resources.Areas.Administration.Contests.Views.EditorTemplates PublicResXFileCodeGenerator ContestEditor.Designer.cs Resources.Areas.Administration.Contests.Views.Partials PublicResXFileCodeGenerator ContestEditor.bg.designer.cs Resources.Areas.Administration.Contests.Views.Partials PublicResXFileCodeGenerator FeedbackIndexAdmin.Designer.cs Resources.Areas.Administration.Feedback.Views PublicResXFileCodeGenerator FeedbackIndexAdmin.bg.Designer.cs Resources.Areas.Administration.Feedback.Views PublicResXFileCodeGenerator FeedbackReport.Designer.cs Resources.Areas.Administration.Feedback.ViewModels PublicResXFileCodeGenerator FeedbackReport.bg.designer.cs Resources.Areas.Administration.Feedback.ViewModels PublicResXFileCodeGenerator NewsIndex.Designer.cs Resources.Areas.Administration.News.Views PublicResXFileCodeGenerator NewsIndex.bg.designer.cs Resources.Areas.Administration.News.Views PublicResXFileCodeGenerator NewsAdministration.Designer.cs Resources.Areas.Administration.News.ViewModels PublicResXFileCodeGenerator NewsAdministration.bg.designer.cs Resources.Areas.Administration.News.ViewModels PublicResXFileCodeGenerator ParticipantViewModels.Designer.cs Resources.Areas.Administration.Participants.ViewModels PublicResXFileCodeGenerator ParticipantViewModels.bg.designer.cs Resources.Areas.Administration.Participants.ViewModels PublicResXFileCodeGenerator ParticipantEditorTemplates.Designer.cs Resources.Areas.Administration.Participants.Views.EditorTemplates PublicResXFileCodeGenerator ParticipantEditorTemplates.bg.designer.cs Resources.Areas.Administration.Participants.Views.EditorTemplates PublicResXFileCodeGenerator Participants.Designer.cs Resources.Areas.Administration.Participants.Views.Partials PublicResXFileCodeGenerator Participants.bg.designer.cs Resources.Areas.Administration.Participants.Views.Partials PublicResXFileCodeGenerator ParticipantsContest.designer.cs Resources.Areas.Administration.Participants.Views PublicResXFileCodeGenerator ParticipantsContest.bg.designer.cs Resources.Areas.Administration.Participants.Views PublicResXFileCodeGenerator ParticipantsIndex.Designer.cs Resources.Areas.Administration.Participants.Views PublicResXFileCodeGenerator ParticipantsIndex.bg.designer.cs Resources.Areas.Administration.Participants.Views PublicResXFileCodeGenerator ProblemsControllers.Designer.cs Resources.Areas.Administration.Problems PublicResXFileCodeGenerator ProblemsControllers.bg.designer.cs Resources.Areas.Administration.Problems PublicResXFileCodeGenerator DetailedProblem.Designer.cs Resources.Areas.Administration.Problems.ViewModels PublicResXFileCodeGenerator DetailedProblem.bg.designer.cs Resources.Areas.Administration.Problems.ViewModels PublicResXFileCodeGenerator ProblemResources.designer.cs Resources.Areas.Administration.Problems.ViewModels PublicResXFileCodeGenerator ProblemResources.bg.designer.cs Resources.Areas.Administration.Problems.ViewModels PublicResXFileCodeGenerator ProblemsPartials.Designer.cs Resources.Areas.Administration.Problems.Views.Partials PublicResXFileCodeGenerator ProblemsPartials.bg.designer.cs Resources.Areas.Administration.Problems.Views.Partials PublicResXFileCodeGenerator ProblemsCreate.Designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsCreate.bg.designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsDelete.Designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsDelete.bg.designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsDeleteAll.Designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsDeleteAll.bg.designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsDetails.Designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsDetails.bg.designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsEdit.Designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsEdit.bg.designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsIndex.Designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ProblemsIndex.bg.designer.cs Resources.Areas.Administration.Problems.Views PublicResXFileCodeGenerator ResourcesControllers.Designer.cs Resources.Areas.Administration.Resources PublicResXFileCodeGenerator ResourcesControllers.bg.designer.cs Resources.Areas.Administration.Resources PublicResXFileCodeGenerator ResourcesCreate.Designer.cs Resources.Areas.Administration.Resources.Views PublicResXFileCodeGenerator ResourcesEdit.Designer.cs Resources.Areas.Administration.Resources.Views PublicResXFileCodeGenerator ResourcesCreate.bg.designer.cs Resources.Areas.Administration.Resources.Views PublicResXFileCodeGenerator ResourcesEdit.bg.designer.cs Resources.Areas.Administration.Resources.Views PublicResXFileCodeGenerator RolesViewModels.Designer.cs Resources.Areas.Administration.Roles.ViewModels PublicResXFileCodeGenerator RolesViewModels.bg.designer.cs Resources.Areas.Administration.Roles.ViewModels PublicResXFileCodeGenerator RolesIndex.Designer.cs Resources.Areas.Administration.Roles.Views PublicResXFileCodeGenerator RolesIndex.bg.designer.cs Resources.Areas.Administration.Roles.Views PublicResXFileCodeGenerator SettingAdministration.Designer.cs Resources.Areas.Administration.Settings.ViewModels PublicResXFileCodeGenerator SettingAdministration.bg.designer.cs Resources.Areas.Administration.Settings.ViewModels PublicResXFileCodeGenerator SettingsAdministrationIndex.Designer.cs Resources.Areas.Administration.Settings.Views PublicResXFileCodeGenerator SettingsAdministrationIndex.bg.Designer.cs Resources.Areas.Administration.Settings.Views PublicResXFileCodeGenerator Partials.Designer.cs Resources.Areas.Administration.Shared.Views.Partials PublicResXFileCodeGenerator Partials.bg.designer.cs Resources.Areas.Administration.Shared.Views.Partials PublicResXFileCodeGenerator SubmissionsControllers.Designer.cs Resources.Areas.Administration.Submissions PublicResXFileCodeGenerator SubmissionsControllers.bg.designer.cs Resources.Areas.Administration.Submissions PublicResXFileCodeGenerator SubmissionAdministration.Designer.cs Resources.Areas.Administration.Submissions.ViewModels PublicResXFileCodeGenerator SubmissionAdministration.bg.designer.cs Resources.Areas.Administration.Submissions.ViewModels PublicResXFileCodeGenerator SubmissionsGrid.Designer.cs Resources.Areas.Administration.Submissions.Views.Partials PublicResXFileCodeGenerator SubmissionsGrid.bg.designer.cs Resources.Areas.Administration.Submissions.Views.Partials PublicResXFileCodeGenerator SubmissionTypeAdministration.Designer.cs Resources.Areas.Administration.SubmissionTypes.ViewModels Designer PublicResXFileCodeGenerator SubmissionTypeAdministration.bg.designer.cs Resources.Areas.Administration.SubmissionTypes.ViewModels PublicResXFileCodeGenerator SubmissionsEditorTemplates.Designer.cs Resources.Areas.Administration.Submissions.Views.EditorTemplates PublicResXFileCodeGenerator SubmissionsEditorTemplates.bg.Designer.cs Resources.Areas.Administration.Submissions.Views.EditorTemplates PublicResXFileCodeGenerator SubmissionForm.Designer.cs Resources.Areas.Administration.Submissions.Views.Partials PublicResXFileCodeGenerator SubmissionForm.bg.designer.cs Resources.Areas.Administration.Submissions.Views.Partials PublicResXFileCodeGenerator SubmissionsCreate.Designer.cs Resources.Areas.Administration.Submissions.Views PublicResXFileCodeGenerator SubmissionsDelete.Designer.cs Resources.Areas.Administration.Submissions.Views PublicResXFileCodeGenerator SubmissionsIndex.Designer.cs Resources.Areas.Administration.Submissions.Views PublicResXFileCodeGenerator SubmissionsUpdate.Designer.cs Resources.Areas.Administration.Submissions.Views PublicResXFileCodeGenerator SubmissionsCreate.bg.designer.cs Resources.Areas.Administration.Submissions.Views PublicResXFileCodeGenerator SubmissionsDelete.bg.designer.cs Resources.Areas.Administration.Submissions.Views PublicResXFileCodeGenerator SubmissionsIndex.bg.designer.cs Resources.Areas.Administration.Submissions.Views PublicResXFileCodeGenerator SubmissionsUpdate.bg.designer.cs Resources.Areas.Administration.Submissions.Views PublicResXFileCodeGenerator SubmissionTypesIndex.Designer.cs Resources.Areas.Administration.SubmissionTypes.Views PublicResXFileCodeGenerator SubmissionTypesIndex.bg.designer.cs Resources.Areas.Administration.SubmissionTypes.Views PublicResXFileCodeGenerator TestsControllers.designer.cs Resources.Areas.Administration.Tests GlobalResourceProxyGenerator TestsControllers.bg.designer.cs Resources.Areas.Administration.Tests PublicResXFileCodeGenerator TestAdministration.Designer.cs Resources.Areas.Administration.Tests.ViewModels PublicResXFileCodeGenerator TestAdministration.bg.designer.cs Resources.Areas.Administration.Tests.ViewModels PublicResXFileCodeGenerator TestsCreate.Designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsDelete.Designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsDeleteAll.Designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsEdit.Designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsDetails.designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsIndex.Designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsCreate.bg.designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsDelete.bg.designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsDeleteAll.bg.designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsDetails.bg.designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsEdit.bg.designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator TestsIndex.bg.designer.cs Resources.Areas.Administration.Tests.Views PublicResXFileCodeGenerator UserProfileAdministration.Designer.cs Resources.Areas.Administration.Users.ViewModels PublicResXFileCodeGenerator UserProfileAdministration.bg.designer.cs Resources.Areas.Administration.Users.ViewModels PublicResXFileCodeGenerator UsersIndex.Designer.cs Resources.Areas.Administration.Users.Views PublicResXFileCodeGenerator UsersIndex.bg.designer.cs Resources.Areas.Administration.Users.Views PublicResXFileCodeGenerator StatsPartial.Designer.cs Resources.Areas.Contests.Views.Partials PublicResXFileCodeGenerator StatsPartial.bg.designer.cs Resources.Areas.Contests.Views.Partials ResXFileCodeGenerator ContestQuestionTypeResource.bg.Designer.cs Designer Designer Web.config Web.config GlobalResourceProxyGenerator Global.Designer.cs PublicResXFileCodeGenerator AccountEmails.bg.Designer.cs Resources.Account PublicResXFileCodeGenerator AccountEmails.Designer.cs Resources.Account PublicResXFileCodeGenerator AccountViewModels.bg.Designer.cs Resources.Account PublicResXFileCodeGenerator AccountViewModels.Designer.cs Resources.Account PublicResXFileCodeGenerator ChangeEmailView.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator ChangeEmailView.Designer.cs Resources.Account.Views PublicResXFileCodeGenerator ChangeUsernameView.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator ChangeUsernameView.designer.cs Resources.Account.Views PublicResXFileCodeGenerator ChangePasswordView.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator ChangePasswordView.Designer.cs Resources.Account.Views PublicResXFileCodeGenerator ExternalLoginCallback.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator ExternalLoginConfirmation.designer.cs Resources.Account.Views PublicResXFileCodeGenerator Disassociate.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator ExternalLoginConfirmation.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator Disassociate.Designer.cs Resources.Account.Views PublicResXFileCodeGenerator ExternalLoginCallback.designer.cs Resources.Account.Views PublicResXFileCodeGenerator ExternalLoginFailure.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator ExternalLoginFailure.Designer.cs Resources.Account.Views PublicResXFileCodeGenerator ForgottenPassword.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator ForgottenPassword.Designer.cs Resources.Account.Views PublicResXFileCodeGenerator General.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator General.Designer.cs Resources.Account.Views PublicResXFileCodeGenerator Login.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator Login.Designer.cs Resources.Account.Views PublicResXFileCodeGenerator Manage.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator Manage.Designer.cs Resources.Account.Views PublicResXFileCodeGenerator ChangePassword.bg.designer.cs Resources.Account.Views.Partial PublicResXFileCodeGenerator ChangePassword.Designer.cs Resources.Account.Views.Partial PublicResXFileCodeGenerator ExternalLoginsList.bg.designer.cs Resources.Account.Views.Partial PublicResXFileCodeGenerator ExternalLoginsList.Designer.cs Resources.Account.Views.Partial PublicResXFileCodeGenerator RemoveAccount.bg.designer.cs Resources.Account.Views.Partial PublicResXFileCodeGenerator RemoveAccount.Designer.cs Resources.Account.Views.Partial PublicResXFileCodeGenerator SetPassword.bg.designer.cs Resources.Account.Views.Partial PublicResXFileCodeGenerator SetPassword.Designer.cs Resources.Account.Views.Partial PublicResXFileCodeGenerator Register.bg.designer.cs Resources.Account.Views PublicResXFileCodeGenerator Register.Designer.cs Resources.Account.Views PublicResXFileCodeGenerator ContestsGeneral.bg.Designer.cs Resources.Areas.Contests PublicResXFileCodeGenerator ContestsGeneral.Designer.cs Resources.Areas.Contests PublicResXFileCodeGenerator ContestsAllContestSubmissionsByUser.bg.designer.cs Resources.Areas.Contests.Shared PublicResXFileCodeGenerator ContestsAllContestSubmissionsByUser.Designer.cs Resources.Areas.Contests.Shared PublicResXFileCodeGenerator ContestsProblemPartial.bg.Designer.cs Resources.Areas.Contests.Shared PublicResXFileCodeGenerator ContestsProblemPartial.Designer.cs Resources.Areas.Contests.Shared PublicResXFileCodeGenerator ContestsViewModels.bg.designer.cs Resources.Areas.Contests.ViewModels PublicResXFileCodeGenerator ContestsViewModels.Designer.cs Resources.Areas.Contests.ViewModels PublicResXFileCodeGenerator ProblemsViewModels.bg.designer.cs Resources.Areas.Contests.ViewModels PublicResXFileCodeGenerator ProblemsViewModels.Designer.cs Resources.Areas.Contests.ViewModels PublicResXFileCodeGenerator SubmissionsViewModels.bg.designer.cs Resources.Areas.Contests.ViewModels PublicResXFileCodeGenerator SubmissionsViewModels.Designer.cs Resources.Areas.Contests.ViewModels PublicResXFileCodeGenerator CompeteIndex.bg.designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator CompeteIndex.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator CompeteRegister.bg.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator CompeteRegister.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ContestsDetails.bg.designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ContestsDetails.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ListIndex.bg.designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ListIndex.designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ListByType.bg.designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ListByType.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ListByCategory.bg.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ListByCategory.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ResultsFull.bg.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ResultsFull.designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ResultsSimple.bg.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ResultsSimple.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator SubmissionsView.bg.designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator SubmissionsView.Designer.cs Resources.Areas.Contests.Views PublicResXFileCodeGenerator ProfileViewModels.bg.Designer.cs Resources.Areas.Users.ViewModels PublicResXFileCodeGenerator ProfileViewModels.Designer.cs Resources.Areas.Users.ViewModels PublicResXFileCodeGenerator ProfileIndex.bg.Designer.cs Resources.Areas.Users.Views.Profile PublicResXFileCodeGenerator ProfileIndex.Designer.cs Resources.Areas.Users.Views.Profile PublicResXFileCodeGenerator ProfileProfileInfo.bg.Designer.cs Resources.Areas.Users.Shared PublicResXFileCodeGenerator ProfileProfileInfo.Designer.cs Resources.Areas.Users.Shared PublicResXFileCodeGenerator SettingsIndex.Designer.cs Resources.Areas.Users.Views.Settings PublicResXFileCodeGenerator SettingsIndex.bg.designer.cs Resources.Areas.Users.Views.Settings PublicResXFileCodeGenerator FeedbackViewModels.bg.designer.cs Resources.Feedback.ViewModels PublicResXFileCodeGenerator FeedbackViewModels.Designer.cs Resources.Feedback.ViewModels PublicResXFileCodeGenerator FeedbackIndex.bg.designer.cs Resources.Feedback.Views PublicResXFileCodeGenerator FeedbackIndex.Designer.cs Resources.Feedback.Views PublicResXFileCodeGenerator FeedbackSubmitted.bg.designer.cs Resources.Feedback.Views PublicResXFileCodeGenerator FeedbackSubmitted.Designer.cs Resources.Feedback.Views GlobalResourceProxyGenerator ContestQuestionTypeResource.designer.cs PublicResXFileCodeGenerator All.Designer.cs Resources.News.Views PublicResXFileCodeGenerator LatestNews.Designer.cs Resources.News.Views PublicResXFileCodeGenerator LatestNews.bg.designer.cs Resources.News.Views PublicResXFileCodeGenerator Selected.bg.designer.cs Resources.News.Views PublicResXFileCodeGenerator All.bg.designer.cs Resources.News.Views PublicResXFileCodeGenerator Selected.Designer.cs Resources.News.Views PublicResXFileCodeGenerator SearchIndex.bg.Designer.cs Resources.Search.Views PublicResXFileCodeGenerator SearchIndex.designer.cs Resources.Search.Views PublicResXFileCodeGenerator SearchResults.bg.Designer.cs Resources.Search.Views PublicResXFileCodeGenerator SearchResults.Designer.cs Resources.Search.Views PublicResXFileCodeGenerator AdvancedSubmissions.Designer.cs Resources.Submissions.Views PublicResXFileCodeGenerator AdvancedSubmissions.bg.designer.cs Resources.Submissions.Views PublicResXFileCodeGenerator BasicSubmissions.Designer.cs Resources.Submissions.Views PublicResXFileCodeGenerator BasicSubmissions.bg.designer.cs Resources.Submissions.Views PublicResXFileCodeGenerator AdvancedSubmissionsGridPartial.Designer.cs Resources.Submissions.Views.Partial PublicResXFileCodeGenerator AdvancedSubmissionsGridPartial.bg.designer.cs Resources.Submissions.Views.Partial PublicResXFileCodeGenerator LoginPartial.bg.designer.cs Resources.Base.Views.Shared PublicResXFileCodeGenerator LoginPartial.designer.cs Resources.Views.Shared PublicResXFileCodeGenerator Layout.Designer.cs Resources.Views.Shared PublicResXFileCodeGenerator Layout.bg.designer.cs Resources.Views.Shared PublicResXFileCodeGenerator Main.Designer.cs Resources.Base PublicResXFileCodeGenerator Main.bg.Designer.cs Resources.Base PublicResXFileCodeGenerator Index.designer.cs Resources.Home.Views PublicResXFileCodeGenerator Index.bg.designer.cs Resources.Home.Views {8c4bf453-24ef-46f3-b947-31505fb905de} OJS.Data.Contracts {341ca732-d483-4487-923e-27ed2a6e9a4f} OJS.Data.Models {1807194c-9e25-4365-b3be-fe1df627612b} OJS.Data {69b10b02-22cf-47d6-b5f3-8a5ffb7dc771} OJS.Common {a1f48412-495a-434c-bdd0-e70aedad6897} OJS.Workers.Tools {2e08e0af-0e51-47ca-947b-4c66086fa030} OJS.Web.Common 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) False True 1721 / http://localhost:5414/ False False False ================================================ FILE: Open Judge System/Web/OJS.Web/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("OJS.Web")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OJS.Web")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("4853a279-a968-461e-a246-7760e7ec5e0e")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Open Judge System/Web/OJS.Web/Properties/PublishProfiles/File System.pubxml ================================================  FileSystem Release Any CPU True False C:\Temp\OJS False ================================================ FILE: Open Judge System/Web/OJS.Web/Properties/PublishProfiles/bgcoder.com.pubxml ================================================  MSDeploy Release Any CPU http://bgcoder.com True False https://79.124.44.83:8172/MsDeploy.axd bgcoder.com True WMSVC True acadwebadmin <_SavePWD>False ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Administration/Contests/contests-index.js ================================================ function getTypeName(type) { switch (type) { case 0: return "Default"; case 1: return "Drop-down list"; case 2: return "Single line text"; case 3: return "Multi-line text"; } } function copyFromContest(ev, contestId) { ev.preventDefault(); var copyWindow = $('#CopyFromContestWindow_' + contestId); copyWindow.data('kendoWindow').open().center(); var form = copyWindow.children('form'); form.one('submit', function () { $.post('/Administration/ContestQuestions/CopyTo/' + contestId, form.serialize(), function () { copyWindow.data('kendoWindow').close(); var grid = $('#DetailQuestionsGrid_' + contestId).data("kendoGrid"); grid.dataSource.read(); grid.refresh(); }); return false; }); } $(document).ready(function () { $('table').on('click', "#delete-all-answers", function(e) { e.preventDefault(); var confirmation = confirm("Are you sure you want to delete all answers?"); if (confirmation) { var questionId = $(e.target).attr('data-question-id'); $.get('/Administration/ContestQuestionAnswers/DeleteAllAnswers/' + questionId, function() { var grid = $('#DetailAnswerGrid_' + questionId).data("kendoGrid"); grid.dataSource.read(); grid.refresh(); }); } }); }) ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Administration/Problems/problems-create.js ================================================ // TODO: Convert these events to unobtrusive with $(parent).on('click')... function startUploadForm(e) { var id = $(e).data('id'); $("#Resources_" + id + "__File").click(); } function selectedFile(e) { var id = $(e).data('id'); var fileName = e.files[0].name; $('#file-button-' + id).text(fileName.length > 20 ? fileName.substring(0, 20) + '...' : fileName); } function onResourceTypeSelect() { var val = this.value(); var id = this.element.attr('modelid'); var resourceContainer = $('#resource-row-' + id + ' [data-type="resource-content"]'); // TODO: Refactor these either with methods to generate HTML or better - use hidden div and .hide()/.show() if (val == 3) { resourceContainer.html('
' + '' + '' + '
'); } else { resourceContainer.html('
Файл
' + '
Избери ресурс
' + '
' + '' + '
'); } } $(document).ready(function () { $.validator.setDefaults({ ignore: '' }); $('#enable-sclimit').change(function () { var input = $("#SourceCodeSizeLimit"); var numericTextBox = input.data("kendoNumericTextBox"); if ($(this).is(':checked')) { numericTextBox.enable(true); numericTextBox.value(1024); input.attr("data-val-required", "Лимита е задължителен!"); $("form").removeData("validator"); $("form").removeData("unobtrusiveValidation"); $.validator.unobtrusive.parse($('form')); } else { numericTextBox.value(null); numericTextBox.enable(false); input.removeAttr("data-val-required"); $("form").removeData("validator"); $("form").removeData("unobtrusiveValidation"); $.validator.unobtrusive.parse($('form')); } }); $('#checkers-tooltip').kendoTooltip({ content: kendo.template($("#checkers-template").html()), width: 580, position: "bottom" }); $('#tests-tooltip').kendoTooltip({ content: kendo.template($("#tests-template").html()), width: 440, position: "bottom" }); $('#add-resource').click(function (e) { e.preventDefault(); var itemIndex = $("#resources input.hidden-field").length; $.get("/Administration/Problems/AddResourceForm/" + itemIndex, function (data) { $("#resources").append(data); $('#remove-resource').removeAttr('disabled'); $('#resources .required-resource-field').each(function() { $(this).rules("add", { required: true, messages: { required: "Задължително поле" } }); }); }); }); $('#remove-resource').click(function (e) { e.preventDefault(); if ($(this).is(':disabled')) { return false; } var itemIndex = $("#resources input.hidden-field").length - 1; $('#resource-row-' + itemIndex).remove(); if (itemIndex == 0) { $('#remove-resource').attr('disabled', 'disabled'); } }); $('#tests-file-button').click(function (e) { $('#tests-upload-input').click(); }); $('#tests-upload-input').change(function (e) { var fileName = this.files[0].name; $('#tests-file-button').text(fileName.length > 30 ? fileName.substring(0, 30) + '...' : fileName); }); }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Administration/Problems/problems-edit.js ================================================ $(document).ready(function () { $.validator.setDefaults({ ignore: '' }); var input = $("#SourceCodeSizeLimit"); var numericTextBox = input.data("kendoNumericTextBox"); var checkbox = $('#enable-sclimit'); if (numericTextBox.value() != null && numericTextBox.value() != 0) { checkbox.attr('checked', true); numericTextBox.enable(true); input.attr("data-val-required", "Лимита е задължителен!"); $("form").removeData("validator"); $("form").removeData("unobtrusiveValidation"); $.validator.unobtrusive.parse($('form')); } checkbox.change(function () { if ($(this).is(':checked')) { numericTextBox.enable(true); input.attr("data-val-required", "Лимита е задължителен!"); $("form").removeData("validator"); $("form").removeData("unobtrusiveValidation"); $.validator.unobtrusive.parse($('form')); } else { numericTextBox.enable(false); input.removeAttr("data-val-required"); $("form").removeData("validator"); $("form").removeData("unobtrusiveValidation"); $.validator.unobtrusive.parse($('form')); } }); $('#checkers-tooltip').kendoTooltip({ content: kendo.template($("#checkers-template").html()), width: 580, position: "bottom" }); }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Administration/Problems/problems-index.js ================================================ function onAdditionalData() { return { text: $("#search").val() }; } function onSearchSelect(e) { var contestId = this.dataItem(e.item.index()).Id; populateDropDowns(contestId); } function onContestSelect() { initializeGrid(parseInt($('#contests').val())); } function filterContests() { return { categories: $("#categories").val() }; } function populateDropDowns(contestIdAsString) { var response; $.get('/Administration/Problems/GetContestInformation/' + contestIdAsString, function(data) { response = data; var categoryId = response.category; var contestId = response.contest; var categories = $("#categories").data("kendoDropDownList"); var contests = $("#contests").data("kendoDropDownList"); var categoriesData = new kendo.data.DataSource({ transport: { read: { url: '/Administration/Problems/GetCascadeCategories', dataType: 'json' } } }); var contestsData = new kendo.data.DataSource({ transport: { read: { url: '/Administration/Problems/GetCascadeContests/' + categoryId.toString(), dataType: 'json' } } }); categoriesData.fetch(function() { categories.dataSource.data(categoriesData); categories.setDataSource(categoriesData); categories.refresh(); contestsData.fetch(function() { contests.dataSource.data(contestsData); contests.refresh(); categories.select(function(dataItem) { return dataItem.Id === categoryId; }); // TODO: Improve by using success callback or promises, not setTimeout - Cascade event on widgets might work too window.setTimeout(function() { contests.select(function(dataItem) { return dataItem.Id === contestId; }); }, 500); }); }); initializeGrid(contestId); }); } function initializeGrid(contestId) { var response; var grid; $('#status').show(); var request = $.get('/Administration/Problems/ByContest/' + contestId, function (data) { response = data; }) .then(function () { $('#status').hide(); $('#problems-grid').html(''); $('#problems-grid').kendoGrid({ dataSource: new kendo.data.DataSource({ data: response }), scrollable: false, toolbar: [{ template: 'Добавяне' + ' Изтриване на всички' + ' Експорт към Excel', }], columns: [ { field: "Id", title: "Номер" }, { field: "Name", title: "Име" }, { field: "ContestName", title: "Състезание" }, { title: "Тестове", template: '
Пробни: #= TrialTests #
Състезателни: #= CompeteTests #
' }, { title: "Операции", width: '50%', template: '' } ], detailInit: detailInit, }); function detailInit(e) { $("
").appendTo(e.detailCell).kendoGrid({ dataSource: { transport: { read: "/Administration/Resources/GetAll/" + e.data.Id, destroy: "/Administration/Resources/Delete" }, type: "aspnetmvc-ajax", pageSize: 5, schema: { data: "Data", total: "Total", errors: "Errors", model: { id: "Id", fields: { Id: { type: "number", editable: false }, Name: { type: "string" }, Type: { type: "number" }, TypeName: { type: "string" }, OrderBy: { type: "number" }, Link: { type: "string" }, } }, }, sort: { field: "OrderBy", dir: "asc" }, serverSorting: true, serverPaging: true, serverFiltering: true, }, editable: "popup", pagable: true, sortable: true, filterable: true, scrollable: false, toolbar: [{ template: 'Добави ресурс' }], columns: [ { field: "Id", title: "Номер" }, { field: "Name", title: "Име" }, { field: "Type", title: "Тип", template: "#= TypeName #" }, { field: "OrderBy", title: "Подредба" }, { title: "Линк", template: '# if(Type == 3) { # Видео # } else { # Свали # } #' }, { title: "Операции", template: "Промяна Изтрий" } ] }); } $('.resource-btn').click(function(e) { var target = $(e.target); var tr = target.closest("tr"); var grid = $("#problems-grid").data("kendoGrid"); if (target.data('expanded') == false) { grid.collapseRow(tr); target.removeData('expanded'); } else { grid.expandRow(tr); target.data('expanded', false); } }); if ($('#problemId').val()) { $('#resource-btn-' + $('#problemId').val()).click(); } }); } function hideTheadFromGrid() { $('#future-grid thead').hide(); $('[data-clickable="grid-click"]').click(function () { var id = $(this).data('id'); populateDropDowns(id); }); }; $(document).ready(function () { $('#status').hide(); if ($('#contestId').val()) { populateDropDowns($('#contestId').val()); } }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Administration/Resources/resources-create.js ================================================ function onEditResourceTypeSelect() { var val = this.value(); if (val == 3) { $('#file-select').hide(); $('#link-input').show(); } else { $('#link-input').hide(); $('#file-select').show(); } } $(document).ready(function () { $('#link-input').hide(); $('#file-button-resource').click(function() { $('#input-file-resource').click(); }); $('#input-file-resource').change(function() { var fileName = this.files[0].name; $('#file-button-resource').text(fileName.length > 20 ? fileName.substring(0, 20) + '...' : fileName); }); }) ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Administration/Resources/resources-edit.js ================================================ function onEditResourceTypeSelect() { var val = this.value(); hideInput(val); } function hideInput(val) { if (val == 3) { $('#file-select').hide(); $('#link-input').show(); } else { $('#link-input').hide(); $('#file-select').show(); } } $(document).ready(function () { var value = $('#Type').data('kendoDropDownList').value(); hideInput(value); $('#file-button-resource').click(function() { $('#input-file-resource').click(); }); $('#input-file-resource').change(function() { var fileName = this.files[0].name; $('#file-button-resource').text(fileName.length > 20 ? fileName.substring(0, 20) + '...' : fileName); }); }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Administration/Tests/tests-details.js ================================================ function removeOutputAjaxLink() { $('#ajax-output-link').hide(); } function removeInputAjaxLink() { $('#ajax-input-link').hide(); } function testResult(test) { var result = ''; switch (test) { case 0: result += ''; break; case 1: result += ''; break; case 2: result += ''; break; case 3: result += ''; break; case 4: result += ''; break; } return result; }; function initilizeTestRuns(response) { $('#test-runs-button').hide(); $('#test-runs-grid').kendoGrid({ dataSource: new kendo.data.DataSource({ data: response.responseJSON, pageSize: 25, }), pageable: true, scrollable: false, columns: [ { field: "Id", title: "Номер" }, { field: "TimeUsed", title: "Време" }, { field: "MemoryUsed", title: "Памет" }, { title: "Резултат", template: '
#= testResult(ExecutionResult) #
' }, { field: "CheckerComment", title: "Чекер" }, { field: "ExecutionComment", title: "Екзекютор" }, { title: "Решение", template: '№#= SubmissionId #' } ], }); } ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Administration/Tests/tests-index.js ================================================ function onAdditionalData() { return { text: $("#search").val() }; } function onSearchSelect(e) { var problemId = this.dataItem(e.item.index()).Id; $('#problemId').val(problemId); populateDropDowns(problemId); } function filterContests() { return { id: $("#categories").val() }; } function filterProblems() { return { id: $("#contests").val() }; } function onProblemSelect(e) { var problemId = $('#problems').val(); if (problemId != "") { $('#controls').show(); $('#problemId').val(problemId); $('#exportFile').attr('href', '/Administration/Tests/Export/' + problemId); initializeGrid(parseInt(problemId), parseInt($("#contests").val())); $('#grid').show(); } else { $('#controls').hide(); $('#grid').hide(); } } function populateDropDowns(problemIdAsString) { $('#controls').show(); $('#exportFile').attr('href', '/Administration/Tests/Export/' + problemIdAsString); var response; $.get('/Administration/Tests/GetProblemInformation/' + problemIdAsString, function(data) { response = data; var categoryId = response.Category; var contestId = response.Contest; var problemId = parseInt(problemIdAsString); var categories = $("#categories").data("kendoDropDownList"); var contests = $("#contests").data("kendoDropDownList"); var problems = $("#problems").data("kendoDropDownList"); var categoriesData = new kendo.data.DataSource({ transport: { read: { url: '/Administration/Tests/GetCascadeCategories', dataType: 'json' } } }); var contestsData = new kendo.data.DataSource({ transport: { read: { url: '/Administration/Tests/GetCascadeContests/' + categoryId.toString(), dataType: 'json' } } }); var problemsData = new kendo.data.DataSource({ transport: { read: { url: '/Administration/Tests/GetCascadeProblems/' + contestId.toString(), dataType: 'json' } } }); function categoriesCascade() { contests.dataSource.fetch(function() { contests.dataSource.read(); contests.select(function(dataItem) { return dataItem.Id == contestId; }); }); } function contestsCascade() { problems.dataSource.fetch(function() { problems.dataSource.read(); problems.select(function(dataItem) { return dataItem.Id == problemId; }); }); } categories.bind("cascade", categoriesCascade); contests.bind("cascade", contestsCascade); categoriesData.fetch(function() { categories.dataSource.data(categoriesData); categories.setDataSource(categoriesData); categories.refresh(); }); categories.select(function(dataItem) { return dataItem.Id === categoryId; }); initializeGrid(problemId, contestId); }); } function initializeGrid(problemId, contestId) { var response; var grid; $('#status').show(); var request = $.get('/Administration/Tests/ProblemTests/' + problemId, function (data) { response = data; }) .then(function () { $('#status').hide(); $('#grid').html(''); $('#grid').kendoGrid({ dataSource: new kendo.data.DataSource({ data: response }), scrollable: false, toolbar: [{ template: 'Добавяне' + ' Изтриване на всички' + ' Към задачата' + ' Експорт към Excel' + ' Експортиране към ZIP файл', }], columns: [ { field: "Input", title: "Вход" }, { field: "Output", title: "Изход" }, { field: "TrialTestName", title: "Вид тест" }, { field: "OrderBy", title: "Подредба" }, { field: "TestRunsCount", title: "Изпълнения" }, { title: "Операции", width: "25%", template: 'Детайли Промяна Изтриване' } ], sortable: true }); }); } $(document).ready(function () { $('#status').hide(); $('#controls').hide(); $('#problemId').hide(); if ($('#problemId').val() != '') { populateDropDowns($('#problemId').val()); } }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Administration/administration-global.js ================================================ function validateModelStateErrors(args) { if (args.errors) { var grid = $("#DataGrid").data("kendoGrid"); var validationTemplate = kendo.template($("#model-state-errors-template").html()); $('.k-edit-form-container').prepend('
'); grid.one("dataBinding", function(e) { e.preventDefault(); $.each(args.errors, function(propertyName) { var renderedTemplate = validationTemplate({ field: propertyName, errors: this.errors }); grid.editable.element.find("#errors").append(renderedTemplate); }); $('.k-grid-update').click(function(ev) { ev.preventDefault(); $('#errors').remove(); }); }); } }; ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/CodeMirror/addon/diff_match_patch.js ================================================ (function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32} diff_match_patch.prototype.diff_main=function(a,b,c,d){"undefined"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);var f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a, b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a}; diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c):1==f.length?[[-1,a],[1,b]]:(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100c);v++){for(var n=-v+r;n<=v-t;n+=2){var l=g+n,m;m=n==-v||n!=v&&j[l-1]d)t+=2;else if(s>e)r+=2;else if(q&&(l=g+k-n,0<=l&&l= u)return this.diff_bisectSplit_(a,b,m,s,c)}}for(n=-v+p;n<=v-w;n+=2){l=g+n;u=n==-v||n!=v&&i[l-1]d)w+=2;else if(m>e)p+=2;else if(!q&&(l=g+k-n,0<=l&&(l=u)))return this.diff_bisectSplit_(a,b,m,s,c)}}return[[-1,a],[1,b]]}; diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)}; diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;fd?a=a.substring(c-d):c=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null; var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.lengthd[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]}; diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}}; diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_); return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]= h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/; diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;fb)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)}; diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=//g,f=/\n/g,g=0;g");switch(h){case 1:b[g]=''+j+"";break;case -1:b[g]=''+j+"";break;case 0:b[g]=""+j+""}}return b.join("")}; diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;cthis.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<=i;p--){var w=e[a.charAt(p-1)];k[p]=0===t?(k[p+1]<<1|1)&w:(k[p+1]<<1|1)&w|((r[p+1]|r[p])<<1|1)|r[p+1];if(k[p]&j&&(w=d(t,p-1),w<=g))if(g=w,h=p-1,h>c)i=Math.max(1,2*c-h);else break}if(d(t+1,c)>g)break;r=k}return h}; diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c=2*this.Patch_Margin&& e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;cthis.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g); if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;ie[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0, c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c}; diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&& (h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c now) return false; var sInfo = editor.getScrollInfo(); if (dv.mv.options.connect == "align") { targetPos = sInfo.top; } else { var halfScreen = .5 * sInfo.clientHeight, midY = sInfo.top + halfScreen; var mid = editor.lineAtHeight(midY, "local"); var around = chunkBoundariesAround(dv.chunks, mid, type == DIFF_INSERT); var off = getOffsets(editor, type == DIFF_INSERT ? around.edit : around.orig); var offOther = getOffsets(other, type == DIFF_INSERT ? around.orig : around.edit); var ratio = (midY - off.top) / (off.bot - off.top); var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top); var botDist, mix; // Some careful tweaking to make sure no space is left out of view // when scrolling to top or bottom. if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) { targetPos = targetPos * mix + sInfo.top * (1 - mix); } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) { var otherInfo = other.getScrollInfo(); var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos; if (botDistOther > botDist && (mix = botDist / halfScreen) < 1) targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix); } } other.scrollTo(sInfo.left, targetPos); other.state.scrollSetAt = now; other.state.scrollSetBy = dv; return true; } function getOffsets(editor, around) { var bot = around.after; if (bot == null) bot = editor.lastLine() + 1; return {top: editor.heightAtLine(around.before || 0, "local"), bot: editor.heightAtLine(bot, "local")}; } function setScrollLock(dv, val, action) { dv.lockScroll = val; if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv); dv.lockButton.innerHTML = val ? "\u21db\u21da" : "\u21db  \u21da"; } // Updating the marks for editor content function clearMarks(editor, arr, classes) { for (var i = 0; i < arr.length; ++i) { var mark = arr[i]; if (mark instanceof CodeMirror.TextMarker) { mark.clear(); } else if (mark.parent) { editor.removeLineClass(mark, "background", classes.chunk); editor.removeLineClass(mark, "background", classes.start); editor.removeLineClass(mark, "background", classes.end); } } arr.length = 0; } // FIXME maybe add a margin around viewport to prevent too many updates function updateMarks(editor, diff, state, type, classes) { var vp = editor.getViewport(); editor.operation(function() { if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { clearMarks(editor, state.marked, classes); markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes); state.from = vp.from; state.to = vp.to; } else { if (vp.from < state.from) { markChanges(editor, diff, type, state.marked, vp.from, state.from, classes); state.from = vp.from; } if (vp.to > state.to) { markChanges(editor, diff, type, state.marked, state.to, vp.to, classes); state.to = vp.to; } } }); } function markChanges(editor, diff, type, marks, from, to, classes) { var pos = Pos(0, 0); var top = Pos(from, 0), bot = editor.clipPos(Pos(to - 1)); var cls = type == DIFF_DELETE ? classes.del : classes.insert; function markChunk(start, end) { var bfrom = Math.max(from, start), bto = Math.min(to, end); for (var i = bfrom; i < bto; ++i) { var line = editor.addLineClass(i, "background", classes.chunk); if (i == start) editor.addLineClass(line, "background", classes.start); if (i == end - 1) editor.addLineClass(line, "background", classes.end); marks.push(line); } // When the chunk is empty, make sure a horizontal line shows up if (start == end && bfrom == end && bto == end) { if (bfrom) marks.push(editor.addLineClass(bfrom - 1, "background", classes.end)); else marks.push(editor.addLineClass(bfrom, "background", classes.start)); } } var chunkStart = 0; for (var i = 0; i < diff.length; ++i) { var part = diff[i], tp = part[0], str = part[1]; if (tp == DIFF_EQUAL) { var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1); moveOver(pos, str); var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0); if (cleanTo > cleanFrom) { if (i) markChunk(chunkStart, cleanFrom); chunkStart = cleanTo; } } else { if (tp == type) { var end = moveOver(pos, str, true); var a = posMax(top, pos), b = posMin(bot, end); if (!posEq(a, b)) marks.push(editor.markText(a, b, {className: cls})); pos = end; } } } if (chunkStart <= pos.line) markChunk(chunkStart, pos.line + 1); } // Updating the gap between editor and original function makeConnections(dv) { if (!dv.showDifferences) return; if (dv.svg) { clear(dv.svg); var w = dv.gap.offsetWidth; attrs(dv.svg, "width", w, "height", dv.gap.offsetHeight); } if (dv.copyButtons) clear(dv.copyButtons); var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport(); var sTopEdit = dv.edit.getScrollInfo().top, sTopOrig = dv.orig.getScrollInfo().top; for (var i = 0; i < dv.chunks.length; i++) { var ch = dv.chunks[i]; if (ch.editFrom <= vpEdit.to && ch.editTo >= vpEdit.from && ch.origFrom <= vpOrig.to && ch.origTo >= vpOrig.from) drawConnectorsForChunk(dv, ch, sTopOrig, sTopEdit, w); } } function getMatchingOrigLine(editLine, chunks) { var editStart = 0, origStart = 0; for (var i = 0; i < chunks.length; i++) { var chunk = chunks[i]; if (chunk.editTo > editLine && chunk.editFrom <= editLine) return null; if (chunk.editFrom > editLine) break; editStart = chunk.editTo; origStart = chunk.origTo; } return origStart + (editLine - editStart); } function findAlignedLines(dv, other) { var linesToAlign = []; for (var i = 0; i < dv.chunks.length; i++) { var chunk = dv.chunks[i]; linesToAlign.push([chunk.origTo, chunk.editTo, other ? getMatchingOrigLine(chunk.editTo, other.chunks) : null]); } if (other) { for (var i = 0; i < other.chunks.length; i++) { var chunk = other.chunks[i]; for (var j = 0; j < linesToAlign.length; j++) { var align = linesToAlign[j]; if (align[1] == chunk.editTo) { j = -1; break; } else if (align[1] > chunk.editTo) { break; } } if (j > -1) linesToAlign.splice(j - 1, 0, [getMatchingOrigLine(chunk.editTo, dv.chunks), chunk.editTo, chunk.origTo]); } } return linesToAlign; } function alignChunks(dv, force) { if (!dv.dealigned && !force) return; if (!dv.orig.curOp) return dv.orig.operation(function() { alignChunks(dv, force); }); dv.dealigned = false; var other = dv.mv.left == dv ? dv.mv.right : dv.mv.left; if (other) { ensureDiff(other); other.dealigned = false; } var linesToAlign = findAlignedLines(dv, other); // Clear old aligners var aligners = dv.mv.aligners; for (var i = 0; i < aligners.length; i++) aligners[i].clear(); aligners.length = 0; var cm = [dv.orig, dv.edit], scroll = []; if (other) cm.push(other.orig); for (var i = 0; i < cm.length; i++) scroll.push(cm[i].getScrollInfo().top); for (var ln = 0; ln < linesToAlign.length; ln++) alignLines(cm, linesToAlign[ln], aligners); for (var i = 0; i < cm.length; i++) cm[i].scrollTo(null, scroll[i]); } function alignLines(cm, lines, aligners) { var maxOffset = 0, offset = []; for (var i = 0; i < cm.length; i++) if (lines[i] != null) { var off = cm[i].heightAtLine(lines[i], "local"); offset[i] = off; maxOffset = Math.max(maxOffset, off); } for (var i = 0; i < cm.length; i++) if (lines[i] != null) { var diff = maxOffset - offset[i]; if (diff > 1) aligners.push(padAbove(cm[i], lines[i], diff)); } } function padAbove(cm, line, size) { var above = true; if (line > cm.lastLine()) { line--; above = false; } var elt = document.createElement("div"); elt.className = "CodeMirror-merge-spacer"; elt.style.height = size + "px"; elt.style.minWidth = "1px"; return cm.addLineWidget(line, elt, {height: size, above: above}); } function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) { var flip = dv.type == "left"; var top = dv.orig.heightAtLine(chunk.origFrom, "local") - sTopOrig; if (dv.svg) { var topLpx = top; var topRpx = dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit; if (flip) { var tmp = topLpx; topLpx = topRpx; topRpx = tmp; } var botLpx = dv.orig.heightAtLine(chunk.origTo, "local") - sTopOrig; var botRpx = dv.edit.heightAtLine(chunk.editTo, "local") - sTopEdit; if (flip) { var tmp = botLpx; botLpx = botRpx; botRpx = tmp; } var curveTop = " C " + w/2 + " " + topRpx + " " + w/2 + " " + topLpx + " " + (w + 2) + " " + topLpx; var curveBot = " C " + w/2 + " " + botLpx + " " + w/2 + " " + botRpx + " -1 " + botRpx; attrs(dv.svg.appendChild(document.createElementNS(svgNS, "path")), "d", "M -1 " + topRpx + curveTop + " L " + (w + 2) + " " + botLpx + curveBot + " z", "class", dv.classes.connect); } if (dv.copyButtons) { var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc", "CodeMirror-merge-copy")); var editOriginals = dv.mv.options.allowEditingOriginals; copy.title = editOriginals ? "Push to left" : "Revert chunk"; copy.chunk = chunk; copy.style.top = top + "px"; if (editOriginals) { var topReverse = dv.orig.heightAtLine(chunk.editFrom, "local") - sTopEdit; var copyReverse = dv.copyButtons.appendChild(elt("div", dv.type == "right" ? "\u21dd" : "\u21dc", "CodeMirror-merge-copy-reverse")); copyReverse.title = "Push to right"; copyReverse.chunk = {editFrom: chunk.origFrom, editTo: chunk.origTo, origFrom: chunk.editFrom, origTo: chunk.editTo}; copyReverse.style.top = topReverse + "px"; dv.type == "right" ? copyReverse.style.left = "2px" : copyReverse.style.right = "2px"; } } } function copyChunk(dv, to, from, chunk) { if (dv.diffOutOfDate) return; to.replaceRange(from.getRange(Pos(chunk.origFrom, 0), Pos(chunk.origTo, 0)), Pos(chunk.editFrom, 0), Pos(chunk.editTo, 0)); } // Merge view, containing 0, 1, or 2 diff views. var MergeView = CodeMirror.MergeView = function(node, options) { if (!(this instanceof MergeView)) return new MergeView(node, options); this.options = options; var origLeft = options.origLeft, origRight = options.origRight == null ? options.orig : options.origRight; var hasLeft = origLeft != null, hasRight = origRight != null; var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0); var wrap = [], left = this.left = null, right = this.right = null; var self = this; if (hasLeft) { left = this.left = new DiffView(this, "left"); var leftPane = elt("div", null, "CodeMirror-merge-pane"); wrap.push(leftPane); wrap.push(buildGap(left)); } var editPane = elt("div", null, "CodeMirror-merge-pane"); wrap.push(editPane); if (hasRight) { right = this.right = new DiffView(this, "right"); wrap.push(buildGap(right)); var rightPane = elt("div", null, "CodeMirror-merge-pane"); wrap.push(rightPane); } (hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost"; wrap.push(elt("div", null, null, "height: 0; clear: both;")); var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane")); this.edit = CodeMirror(editPane, copyObj(options)); if (left) left.init(leftPane, origLeft, options); if (right) right.init(rightPane, origRight, options); if (options.collapseIdentical) { updating = true; this.editor().operation(function() { collapseIdenticalStretches(self, options.collapseIdentical); }); updating = false; } if (options.connect == "align") { this.aligners = []; alignChunks(this.left || this.right, true); } var onResize = function() { if (left) makeConnections(left); if (right) makeConnections(right); }; CodeMirror.on(window, "resize", onResize); var resizeInterval = setInterval(function() { for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {} if (!p) { clearInterval(resizeInterval); CodeMirror.off(window, "resize", onResize); } }, 5000); }; function buildGap(dv) { var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock"); lock.title = "Toggle locked scrolling"; var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap"); CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); }); var gapElts = [lockWrap]; if (dv.mv.options.revertButtons !== false) { dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type); CodeMirror.on(dv.copyButtons, "click", function(e) { var node = e.target || e.srcElement; if (!node.chunk) return; if (node.className == "CodeMirror-merge-copy-reverse") { copyChunk(dv, dv.orig, dv.edit, node.chunk); return; } copyChunk(dv, dv.edit, dv.orig, node.chunk); }); gapElts.unshift(dv.copyButtons); } if (dv.mv.options.connect != "align") { var svg = document.createElementNS && document.createElementNS(svgNS, "svg"); if (svg && !svg.createSVGRect) svg = null; dv.svg = svg; if (svg) gapElts.push(svg); } return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap"); } MergeView.prototype = { constuctor: MergeView, editor: function() { return this.edit; }, rightOriginal: function() { return this.right && this.right.orig; }, leftOriginal: function() { return this.left && this.left.orig; }, setShowDifferences: function(val) { if (this.right) this.right.setShowDifferences(val); if (this.left) this.left.setShowDifferences(val); }, rightChunks: function() { if (this.right) { ensureDiff(this.right); return this.right.chunks; } }, leftChunks: function() { if (this.left) { ensureDiff(this.left); return this.left.chunks; } } }; function asString(obj) { if (typeof obj == "string") return obj; else return obj.getValue(); } // Operations on diffs var dmp = new diff_match_patch(); function getDiff(a, b) { var diff = dmp.diff_main(a, b); dmp.diff_cleanupSemantic(diff); // The library sometimes leaves in empty parts, which confuse the algorithm for (var i = 0; i < diff.length; ++i) { var part = diff[i]; if (!part[1]) { diff.splice(i--, 1); } else if (i && diff[i - 1][0] == part[0]) { diff.splice(i--, 1); diff[i][1] += part[1]; } } return diff; } function getChunks(diff) { var chunks = []; var startEdit = 0, startOrig = 0; var edit = Pos(0, 0), orig = Pos(0, 0); for (var i = 0; i < diff.length; ++i) { var part = diff[i], tp = part[0]; if (tp == DIFF_EQUAL) { var startOff = startOfLineClean(diff, i) ? 0 : 1; var cleanFromEdit = edit.line + startOff, cleanFromOrig = orig.line + startOff; moveOver(edit, part[1], null, orig); var endOff = endOfLineClean(diff, i) ? 1 : 0; var cleanToEdit = edit.line + endOff, cleanToOrig = orig.line + endOff; if (cleanToEdit > cleanFromEdit) { if (i) chunks.push({origFrom: startOrig, origTo: cleanFromOrig, editFrom: startEdit, editTo: cleanFromEdit}); startEdit = cleanToEdit; startOrig = cleanToOrig; } } else { moveOver(tp == DIFF_INSERT ? edit : orig, part[1]); } } if (startEdit <= edit.line || startOrig <= orig.line) chunks.push({origFrom: startOrig, origTo: orig.line + 1, editFrom: startEdit, editTo: edit.line + 1}); return chunks; } function endOfLineClean(diff, i) { if (i == diff.length - 1) return true; var next = diff[i + 1][1]; if (next.length == 1 || next.charCodeAt(0) != 10) return false; if (i == diff.length - 2) return true; next = diff[i + 2][1]; return next.length > 1 && next.charCodeAt(0) == 10; } function startOfLineClean(diff, i) { if (i == 0) return true; var last = diff[i - 1][1]; if (last.charCodeAt(last.length - 1) != 10) return false; if (i == 1) return true; last = diff[i - 2][1]; return last.charCodeAt(last.length - 1) == 10; } function chunkBoundariesAround(chunks, n, nInEdit) { var beforeE, afterE, beforeO, afterO; for (var i = 0; i < chunks.length; i++) { var chunk = chunks[i]; var fromLocal = nInEdit ? chunk.editFrom : chunk.origFrom; var toLocal = nInEdit ? chunk.editTo : chunk.origTo; if (afterE == null) { if (fromLocal > n) { afterE = chunk.editFrom; afterO = chunk.origFrom; } else if (toLocal > n) { afterE = chunk.editTo; afterO = chunk.origTo; } } if (toLocal <= n) { beforeE = chunk.editTo; beforeO = chunk.origTo; } else if (fromLocal <= n) { beforeE = chunk.editFrom; beforeO = chunk.origFrom; } } return {edit: {before: beforeE, after: afterE}, orig: {before: beforeO, after: afterO}}; } function collapseSingle(cm, from, to) { cm.addLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); var widget = document.createElement("span"); widget.className = "CodeMirror-merge-collapsed-widget"; widget.title = "Identical text collapsed. Click to expand."; var mark = cm.markText(Pos(from, 0), Pos(to - 1), { inclusiveLeft: true, inclusiveRight: true, replacedWith: widget, clearOnEnter: true }); function clear() { mark.clear(); cm.removeLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); } widget.addEventListener("click", clear); return {mark: mark, clear: clear}; } function collapseStretch(size, editors) { var marks = []; function clear() { for (var i = 0; i < marks.length; i++) marks[i].clear(); } for (var i = 0; i < editors.length; i++) { var editor = editors[i]; var mark = collapseSingle(editor.cm, editor.line, editor.line + size); marks.push(mark); mark.mark.on("clear", clear); } return marks[0].mark; } function unclearNearChunks(dv, margin, off, clear) { for (var i = 0; i < dv.chunks.length; i++) { var chunk = dv.chunks[i]; for (var l = chunk.editFrom - margin; l < chunk.editTo + margin; l++) { var pos = l + off; if (pos >= 0 && pos < clear.length) clear[pos] = false; } } } function collapseIdenticalStretches(mv, margin) { if (typeof margin != "number") margin = 2; var clear = [], edit = mv.editor(), off = edit.firstLine(); for (var l = off, e = edit.lastLine(); l <= e; l++) clear.push(true); if (mv.left) unclearNearChunks(mv.left, margin, off, clear); if (mv.right) unclearNearChunks(mv.right, margin, off, clear); for (var i = 0; i < clear.length; i++) { if (clear[i]) { var line = i + off; for (var size = 1; i < clear.length - 1 && clear[i + 1]; i++, size++) {} if (size > margin) { var editors = [{line: line, cm: edit}]; if (mv.left) editors.push({line: getMatchingOrigLine(line, mv.left.chunks), cm: mv.left.orig}); if (mv.right) editors.push({line: getMatchingOrigLine(line, mv.right.chunks), cm: mv.right.orig}); var mark = collapseStretch(size, editors); if (mv.options.onCollapse) mv.options.onCollapse(mv, line, size, mark); } } } } // General utilities function elt(tag, content, className, style) { var e = document.createElement(tag); if (className) e.className = className; if (style) e.style.cssText = style; if (typeof content == "string") e.appendChild(document.createTextNode(content)); else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); return e; } function clear(node) { for (var count = node.childNodes.length; count > 0; --count) node.removeChild(node.firstChild); } function attrs(elt) { for (var i = 1; i < arguments.length; i += 2) elt.setAttribute(arguments[i], arguments[i+1]); } function copyObj(obj, target) { if (!target) target = {}; for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop]; return target; } function moveOver(pos, str, copy, other) { var out = copy ? Pos(pos.line, pos.ch) : pos, at = 0; for (;;) { var nl = str.indexOf("\n", at); if (nl == -1) break; ++out.line; if (other) ++other.line; at = nl + 1; } out.ch = (at ? 0 : out.ch) + (str.length - at); if (other) other.ch = (at ? 0 : other.ch) + (str.length - at); return out; } function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; } function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; } function posEq(a, b) { return a.line == b.line && a.ch == b.ch; } }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/CodeMirror/codemirror.js ================================================ // CodeMirror version 3.22 // // CodeMirror is the only global var we claim window.CodeMirror = (function() { "use strict"; // BROWSER SNIFFING // Crude, but necessary to handle a number of hard-to-feature-detect // bugs and behavior differences. var gecko = /gecko\/\d/i.test(navigator.userAgent); // IE11 currently doesn't count as 'ie', since it has almost none of // the same bugs as earlier versions. Use ie_gt10 to handle // incompatibilities in that version. var old_ie = /MSIE \d/.test(navigator.userAgent); var ie_lt8 = old_ie && (document.documentMode == null || document.documentMode < 8); var ie_lt9 = old_ie && (document.documentMode == null || document.documentMode < 9); var ie_lt10 = old_ie && (document.documentMode == null || document.documentMode < 10); var ie_gt10 = /Trident\/([7-9]|\d{2,})\./.test(navigator.userAgent); var ie = old_ie || ie_gt10; var webkit = /WebKit\//.test(navigator.userAgent); var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent); var chrome = /Chrome\//.test(navigator.userAgent); var opera = /Opera\//.test(navigator.userAgent); var safari = /Apple Computer/.test(navigator.vendor); var khtml = /KHTML\//.test(navigator.userAgent); var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent); var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent); var phantom = /PhantomJS/.test(navigator.userAgent); var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent); // This is woefully incomplete. Suggestions for alternative methods welcome. var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent); var mac = ios || /Mac/.test(navigator.platform); var windows = /win/i.test(navigator.platform); var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/); if (opera_version) opera_version = Number(opera_version[1]); if (opera_version && opera_version >= 15) { opera = false; webkit = true; } // Some browsers use the wrong event properties to signal cmd/ctrl on OS X var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11)); var captureMiddleClick = gecko || (ie && !ie_lt9); // Optimize some code when these features are not used var sawReadOnlySpans = false, sawCollapsedSpans = false; // CONSTRUCTOR function CodeMirror(place, options) { if (!(this instanceof CodeMirror)) return new CodeMirror(place, options); this.options = options = options || {}; // Determine effective options based on given values and defaults. for (var opt in defaults) if (!options.hasOwnProperty(opt) && defaults.hasOwnProperty(opt)) options[opt] = defaults[opt]; setGuttersForLineNumbers(options); var docStart = typeof options.value == "string" ? 0 : options.value.first; var display = this.display = makeDisplay(place, docStart); display.wrapper.CodeMirror = this; updateGutters(this); if (options.autofocus && !mobile) focusInput(this); this.state = {keyMaps: [], overlays: [], modeGen: 0, overwrite: false, focused: false, suppressEdits: false, pasteIncoming: false, cutIncoming: false, draggingText: false, highlight: new Delayed()}; themeChanged(this); if (options.lineWrapping) this.display.wrapper.className += " CodeMirror-wrap"; var doc = options.value; if (typeof doc == "string") doc = new Doc(options.value, options.mode); operation(this, attachDoc)(this, doc); // Override magic textarea content restore that IE sometimes does // on our hidden textarea on reload if (old_ie) setTimeout(bind(resetInput, this, true), 20); registerEventHandlers(this); // IE throws unspecified error in certain cases, when // trying to access activeElement before onload var hasFocus; try { hasFocus = (document.activeElement == display.input); } catch(e) { } if (hasFocus || (options.autofocus && !mobile)) setTimeout(bind(onFocus, this), 20); else onBlur(this); operation(this, function() { for (var opt in optionHandlers) if (optionHandlers.propertyIsEnumerable(opt)) optionHandlers[opt](this, options[opt], Init); for (var i = 0; i < initHooks.length; ++i) initHooks[i](this); })(); } // DISPLAY CONSTRUCTOR function makeDisplay(place, docStart) { var d = {}; var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none"); if (webkit) input.style.width = "1000px"; else input.setAttribute("wrap", "off"); // if border: 0; -- iOS fails to open keyboard (issue #1287) if (ios) input.style.border = "1px solid black"; input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); input.setAttribute("spellcheck", "false"); // Wraps and hides input textarea d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); // The actual fake scrollbars. d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar"); d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar"); d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); // DIVs containing the selection and the actual code d.lineDiv = elt("div", null, "CodeMirror-code"); d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); // Blinky cursor, and element used to ensure cursor fits at the end of a line d.cursor = elt("div", "\u00a0", "CodeMirror-cursor"); // Secondary cursor, shown when on a 'jump' in bi-directional text d.otherCursor = elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"); // Used to measure text size d.measure = elt("div", null, "CodeMirror-measure"); // Wraps everything that needs to exist inside the vertically-padded coordinate system d.lineSpace = elt("div", [d.measure, d.selectionDiv, d.lineDiv, d.cursor, d.otherCursor], null, "position: relative; outline: none"); // Moved around its parent to cover visible view d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative"); // Set to the height of the text, causes scrolling d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); // D is needed because behavior of elts with overflow: auto and padding is inconsistent across browsers d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerCutOff + "px; width: 1px;"); // Will contain the gutters, if any d.gutters = elt("div", null, "CodeMirror-gutters"); d.lineGutter = null; // Provides scrolling d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); d.scroller.setAttribute("tabIndex", "-1"); // The element in which the editor lives. d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV, d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); // Work around IE7 z-index bug if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper); // Needed to hide big blue blinking cursor on Mobile Safari if (ios) input.style.width = "0px"; if (!webkit) d.scroller.draggable = true; // Needed to handle Tab key in KHTML if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; } // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). else if (ie_lt8) d.scrollbarH.style.minWidth = d.scrollbarV.style.minWidth = "18px"; // Current visible range (may be bigger than the view window). d.viewOffset = d.lastSizeC = 0; d.showingFrom = d.showingTo = docStart; // Used to only resize the line number gutter when necessary (when // the amount of lines crosses a boundary that makes its width change) d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; // See readInput and resetInput d.prevInput = ""; // Set to true when a non-horizontal-scrolling widget is added. As // an optimization, widget aligning is skipped when d is false. d.alignWidgets = false; // Flag that indicates whether we currently expect input to appear // (after some event like 'keypress' or 'input') and are polling // intensively. d.pollingFast = false; // Self-resetting timeout for the poller d.poll = new Delayed(); d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; d.measureLineCache = []; d.measureLineCachePos = 0; // Tracks when resetInput has punted to just putting a short // string instead of the (large) selection. d.inaccurateSelection = false; // Tracks the maximum line length so that the horizontal scrollbar // can be kept static when scrolling. d.maxLine = null; d.maxLineLength = 0; d.maxLineChanged = false; // Used for measuring wheel scrolling granularity d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; return d; } // STATE UPDATES // Used to get the editor into a consistent state again when options change. function loadMode(cm) { cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption); resetModeState(cm); } function resetModeState(cm) { cm.doc.iter(function(line) { if (line.stateAfter) line.stateAfter = null; if (line.styles) line.styles = null; }); cm.doc.frontier = cm.doc.first; startWorker(cm, 100); cm.state.modeGen++; if (cm.curOp) regChange(cm); } function wrappingChanged(cm) { if (cm.options.lineWrapping) { cm.display.wrapper.className += " CodeMirror-wrap"; cm.display.sizer.style.minWidth = ""; } else { cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-wrap", ""); computeMaxLength(cm); } estimateLineHeights(cm); regChange(cm); clearCaches(cm); setTimeout(function(){updateScrollbars(cm);}, 100); } function estimateHeight(cm) { var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); return function(line) { if (lineIsHidden(cm.doc, line)) return 0; else if (wrapping) return (Math.ceil(line.text.length / perLine) || 1) * th; else return th; }; } function estimateLineHeights(cm) { var doc = cm.doc, est = estimateHeight(cm); doc.iter(function(line) { var estHeight = est(line); if (estHeight != line.height) updateLineHeight(line, estHeight); }); } function keyMapChanged(cm) { var map = keyMap[cm.options.keyMap], style = map.style; cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") + (style ? " cm-keymap-" + style : ""); } function themeChanged(cm) { cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); clearCaches(cm); } function guttersChanged(cm) { updateGutters(cm); regChange(cm); setTimeout(function(){alignHorizontally(cm);}, 20); } function updateGutters(cm) { var gutters = cm.display.gutters, specs = cm.options.gutters; removeChildren(gutters); for (var i = 0; i < specs.length; ++i) { var gutterClass = specs[i]; var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass)); if (gutterClass == "CodeMirror-linenumbers") { cm.display.lineGutter = gElt; gElt.style.width = (cm.display.lineNumWidth || 1) + "px"; } } gutters.style.display = i ? "" : "none"; } function lineLength(doc, line) { if (line.height == 0) return 0; var len = line.text.length, merged, cur = line; while (merged = collapsedSpanAtStart(cur)) { var found = merged.find(); cur = getLine(doc, found.from.line); len += found.from.ch - found.to.ch; } cur = line; while (merged = collapsedSpanAtEnd(cur)) { var found = merged.find(); len -= cur.text.length - found.from.ch; cur = getLine(doc, found.to.line); len += cur.text.length - found.to.ch; } return len; } function computeMaxLength(cm) { var d = cm.display, doc = cm.doc; d.maxLine = getLine(doc, doc.first); d.maxLineLength = lineLength(doc, d.maxLine); d.maxLineChanged = true; doc.iter(function(line) { var len = lineLength(doc, line); if (len > d.maxLineLength) { d.maxLineLength = len; d.maxLine = line; } }); } // Make sure the gutters options contains the element // "CodeMirror-linenumbers" when the lineNumbers option is true. function setGuttersForLineNumbers(options) { var found = indexOf(options.gutters, "CodeMirror-linenumbers"); if (found == -1 && options.lineNumbers) { options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]); } else if (found > -1 && !options.lineNumbers) { options.gutters = options.gutters.slice(0); options.gutters.splice(found, 1); } } // SCROLLBARS // Re-synchronize the fake scrollbars with the actual size of the // content. Optionally force a scrollTop. function updateScrollbars(cm) { var d = cm.display, docHeight = cm.doc.height; var totalHeight = docHeight + paddingVert(d); d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px"; d.gutters.style.height = Math.max(totalHeight, d.scroller.clientHeight - scrollerCutOff) + "px"; var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight); var needsH = d.scroller.scrollWidth > (d.scroller.clientWidth + 1); var needsV = scrollHeight > (d.scroller.clientHeight + 1); if (needsV) { d.scrollbarV.style.display = "block"; d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0"; // A bug in IE8 can cause this value to be negative, so guard it. d.scrollbarV.firstChild.style.height = Math.max(0, scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px"; } else { d.scrollbarV.style.display = ""; d.scrollbarV.firstChild.style.height = "0"; } if (needsH) { d.scrollbarH.style.display = "block"; d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + "px" : "0"; d.scrollbarH.firstChild.style.width = (d.scroller.scrollWidth - d.scroller.clientWidth + d.scrollbarH.clientWidth) + "px"; } else { d.scrollbarH.style.display = ""; d.scrollbarH.firstChild.style.width = "0"; } if (needsH && needsV) { d.scrollbarFiller.style.display = "block"; d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px"; } else d.scrollbarFiller.style.display = ""; if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { d.gutterFiller.style.display = "block"; d.gutterFiller.style.height = scrollbarWidth(d.measure) + "px"; d.gutterFiller.style.width = d.gutters.offsetWidth + "px"; } else d.gutterFiller.style.display = ""; if (mac_geLion && scrollbarWidth(d.measure) === 0) { d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px"; d.scrollbarV.style.pointerEvents = d.scrollbarH.style.pointerEvents = "none"; } } function visibleLines(display, doc, viewPort) { var top = display.scroller.scrollTop, height = display.wrapper.clientHeight; if (typeof viewPort == "number") top = viewPort; else if (viewPort) {top = viewPort.top; height = viewPort.bottom - viewPort.top;} top = Math.floor(top - paddingTop(display)); var bottom = Math.ceil(top + height); return {from: lineAtHeight(doc, top), to: lineAtHeight(doc, bottom)}; } // LINE NUMBERS function alignHorizontally(cm) { var display = cm.display; if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return; var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; var gutterW = display.gutters.offsetWidth, l = comp + "px"; for (var n = display.lineDiv.firstChild; n; n = n.nextSibling) if (n.alignable) { for (var i = 0, a = n.alignable; i < a.length; ++i) a[i].style.left = l; } if (cm.options.fixedGutter) display.gutters.style.left = (comp + gutterW) + "px"; } function maybeUpdateLineNumberWidth(cm) { if (!cm.options.lineNumbers) return false; var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; if (last.length != display.lineNumChars) { var test = display.measure.appendChild(elt("div", [elt("div", last)], "CodeMirror-linenumber CodeMirror-gutter-elt")); var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; display.lineGutter.style.width = ""; display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding); display.lineNumWidth = display.lineNumInnerWidth + padding; display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; display.lineGutter.style.width = display.lineNumWidth + "px"; return true; } return false; } function lineNumberFor(options, i) { return String(options.lineNumberFormatter(i + options.firstLineNumber)); } function compensateForHScroll(display) { return getRect(display.scroller).left - getRect(display.sizer).left; } // DISPLAY DRAWING function updateDisplay(cm, changes, viewPort, forced) { var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo, updated; var visible = visibleLines(cm.display, cm.doc, viewPort); for (var first = true;; first = false) { var oldWidth = cm.display.scroller.clientWidth; if (!updateDisplayInner(cm, changes, visible, forced)) break; updated = true; changes = []; updateSelection(cm); updateScrollbars(cm); if (first && cm.options.lineWrapping && oldWidth != cm.display.scroller.clientWidth) { forced = true; continue; } forced = false; // Clip forced viewport to actual scrollable area if (viewPort) viewPort = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, typeof viewPort == "number" ? viewPort : viewPort.top); visible = visibleLines(cm.display, cm.doc, viewPort); if (visible.from >= cm.display.showingFrom && visible.to <= cm.display.showingTo) break; } if (updated) { signalLater(cm, "update", cm); if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo) signalLater(cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo); } return updated; } // Uses a set of changes plus the current scroll position to // determine which DOM updates have to be made, and makes the // updates. function updateDisplayInner(cm, changes, visible, forced) { var display = cm.display, doc = cm.doc; if (!display.wrapper.offsetWidth) { display.showingFrom = display.showingTo = doc.first; display.viewOffset = 0; return; } // Bail out if the visible area is already rendered and nothing changed. if (!forced && changes.length == 0 && visible.from > display.showingFrom && visible.to < display.showingTo) return; if (maybeUpdateLineNumberWidth(cm)) changes = [{from: doc.first, to: doc.first + doc.size}]; var gutterW = display.sizer.style.marginLeft = display.gutters.offsetWidth + "px"; display.scrollbarH.style.left = cm.options.fixedGutter ? gutterW : "0"; // Used to determine which lines need their line numbers updated var positionsChangedFrom = Infinity; if (cm.options.lineNumbers) for (var i = 0; i < changes.length; ++i) if (changes[i].diff && changes[i].from < positionsChangedFrom) { positionsChangedFrom = changes[i].from; } var end = doc.first + doc.size; var from = Math.max(visible.from - cm.options.viewportMargin, doc.first); var to = Math.min(end, visible.to + cm.options.viewportMargin); if (display.showingFrom < from && from - display.showingFrom < 20) from = Math.max(doc.first, display.showingFrom); if (display.showingTo > to && display.showingTo - to < 20) to = Math.min(end, display.showingTo); if (sawCollapsedSpans) { from = lineNo(visualLine(doc, getLine(doc, from))); while (to < end && lineIsHidden(doc, getLine(doc, to))) ++to; } // Create a range of theoretically intact lines, and punch holes // in that using the change info. var intact = [{from: Math.max(display.showingFrom, doc.first), to: Math.min(display.showingTo, end)}]; if (intact[0].from >= intact[0].to) intact = []; else intact = computeIntact(intact, changes); // When merged lines are present, we might have to reduce the // intact ranges because changes in continued fragments of the // intact lines do require the lines to be redrawn. if (sawCollapsedSpans) for (var i = 0; i < intact.length; ++i) { var range = intact[i], merged; while (merged = collapsedSpanAtEnd(getLine(doc, range.to - 1))) { var newTo = merged.find().from.line; if (newTo > range.from) range.to = newTo; else { intact.splice(i--, 1); break; } } } // Clip off the parts that won't be visible var intactLines = 0; for (var i = 0; i < intact.length; ++i) { var range = intact[i]; if (range.from < from) range.from = from; if (range.to > to) range.to = to; if (range.from >= range.to) intact.splice(i--, 1); else intactLines += range.to - range.from; } if (!forced && intactLines == to - from && from == display.showingFrom && to == display.showingTo) { updateViewOffset(cm); return; } intact.sort(function(a, b) {return a.from - b.from;}); // Avoid crashing on IE's "unspecified error" when in iframes try { var focused = document.activeElement; } catch(e) {} if (intactLines < (to - from) * .7) display.lineDiv.style.display = "none"; patchDisplay(cm, from, to, intact, positionsChangedFrom); display.lineDiv.style.display = ""; if (focused && document.activeElement != focused && focused.offsetHeight) focused.focus(); var different = from != display.showingFrom || to != display.showingTo || display.lastSizeC != display.wrapper.clientHeight; // This is just a bogus formula that detects when the editor is // resized or the font size changes. if (different) { display.lastSizeC = display.wrapper.clientHeight; startWorker(cm, 400); } display.showingFrom = from; display.showingTo = to; display.gutters.style.height = ""; updateHeightsInViewport(cm); updateViewOffset(cm); return true; } function updateHeightsInViewport(cm) { var display = cm.display; var prevBottom = display.lineDiv.offsetTop; for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) { if (ie_lt8) { var bot = node.offsetTop + node.offsetHeight; height = bot - prevBottom; prevBottom = bot; } else { var box = getRect(node); height = box.bottom - box.top; } var diff = node.lineObj.height - height; if (height < 2) height = textHeight(display); if (diff > .001 || diff < -.001) { updateLineHeight(node.lineObj, height); var widgets = node.lineObj.widgets; if (widgets) for (var i = 0; i < widgets.length; ++i) widgets[i].height = widgets[i].node.offsetHeight; } } } function updateViewOffset(cm) { var off = cm.display.viewOffset = heightAtLine(cm, getLine(cm.doc, cm.display.showingFrom)); // Position the mover div to align with the current virtual scroll position cm.display.mover.style.top = off + "px"; } function computeIntact(intact, changes) { for (var i = 0, l = changes.length || 0; i < l; ++i) { var change = changes[i], intact2 = [], diff = change.diff || 0; for (var j = 0, l2 = intact.length; j < l2; ++j) { var range = intact[j]; if (change.to <= range.from && change.diff) { intact2.push({from: range.from + diff, to: range.to + diff}); } else if (change.to <= range.from || change.from >= range.to) { intact2.push(range); } else { if (change.from > range.from) intact2.push({from: range.from, to: change.from}); if (change.to < range.to) intact2.push({from: change.to + diff, to: range.to + diff}); } } intact = intact2; } return intact; } function getDimensions(cm) { var d = cm.display, left = {}, width = {}; for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { left[cm.options.gutters[i]] = n.offsetLeft; width[cm.options.gutters[i]] = n.offsetWidth; } return {fixedPos: compensateForHScroll(d), gutterTotalWidth: d.gutters.offsetWidth, gutterLeft: left, gutterWidth: width, wrapperWidth: d.wrapper.clientWidth}; } function patchDisplay(cm, from, to, intact, updateNumbersFrom) { var dims = getDimensions(cm); var display = cm.display, lineNumbers = cm.options.lineNumbers; if (!intact.length && (!webkit || !cm.display.currentWheelTarget)) removeChildren(display.lineDiv); var container = display.lineDiv, cur = container.firstChild; function rm(node) { var next = node.nextSibling; if (webkit && mac && cm.display.currentWheelTarget == node) { node.style.display = "none"; node.lineObj = null; } else { node.parentNode.removeChild(node); } return next; } var nextIntact = intact.shift(), lineN = from; cm.doc.iter(from, to, function(line) { if (nextIntact && nextIntact.to == lineN) nextIntact = intact.shift(); if (lineIsHidden(cm.doc, line)) { if (line.height != 0) updateLineHeight(line, 0); if (line.widgets && cur && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) { var w = line.widgets[i]; if (w.showIfHidden) { var prev = cur.previousSibling; if (/pre/i.test(prev.nodeName)) { var wrap = elt("div", null, null, "position: relative"); prev.parentNode.replaceChild(wrap, prev); wrap.appendChild(prev); prev = wrap; } var wnode = prev.appendChild(elt("div", [w.node], "CodeMirror-linewidget")); if (!w.handleMouseEvents) wnode.ignoreEvents = true; positionLineWidget(w, wnode, prev, dims); } } } else if (nextIntact && nextIntact.from <= lineN && nextIntact.to > lineN) { // This line is intact. Skip to the actual node. Update its // line number if needed. while (cur.lineObj != line) cur = rm(cur); if (lineNumbers && updateNumbersFrom <= lineN && cur.lineNumber) setTextContent(cur.lineNumber, lineNumberFor(cm.options, lineN)); cur = cur.nextSibling; } else { // For lines with widgets, make an attempt to find and reuse // the existing element, so that widgets aren't needlessly // removed and re-inserted into the dom if (line.widgets) for (var j = 0, search = cur, reuse; search && j < 20; ++j, search = search.nextSibling) if (search.lineObj == line && /div/i.test(search.nodeName)) { reuse = search; break; } // This line needs to be generated. var lineNode = buildLineElement(cm, line, lineN, dims, reuse); if (lineNode != reuse) { container.insertBefore(lineNode, cur); } else { while (cur != reuse) cur = rm(cur); cur = cur.nextSibling; } lineNode.lineObj = line; } ++lineN; }); while (cur) cur = rm(cur); } function buildLineElement(cm, line, lineNo, dims, reuse) { var built = buildLineContent(cm, line), lineElement = built.pre; var markers = line.gutterMarkers, display = cm.display, wrap; var bgClass = built.bgClass ? built.bgClass + " " + (line.bgClass || "") : line.bgClass; if (!cm.options.lineNumbers && !markers && !bgClass && !line.wrapClass && !line.widgets) return lineElement; // Lines with gutter elements, widgets or a background class need // to be wrapped again, and have the extra elements added to the // wrapper div if (reuse) { reuse.alignable = null; var isOk = true, widgetsSeen = 0, insertBefore = null; for (var n = reuse.firstChild, next; n; n = next) { next = n.nextSibling; if (!/\bCodeMirror-linewidget\b/.test(n.className)) { reuse.removeChild(n); } else { for (var i = 0; i < line.widgets.length; ++i) { var widget = line.widgets[i]; if (widget.node == n.firstChild) { if (!widget.above && !insertBefore) insertBefore = n; positionLineWidget(widget, n, reuse, dims); ++widgetsSeen; break; } } if (i == line.widgets.length) { isOk = false; break; } } } reuse.insertBefore(lineElement, insertBefore); if (isOk && widgetsSeen == line.widgets.length) { wrap = reuse; reuse.className = line.wrapClass || ""; } } if (!wrap) { wrap = elt("div", null, line.wrapClass, "position: relative"); wrap.appendChild(lineElement); } // Kludge to make sure the styled element lies behind the selection (by z-index) if (bgClass) wrap.insertBefore(elt("div", null, bgClass + " CodeMirror-linebackground"), wrap.firstChild); if (cm.options.lineNumbers || markers) { var gutterWrap = wrap.insertBefore(elt("div", null, "CodeMirror-gutter-wrapper", "position: absolute; left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"), lineElement); if (cm.options.fixedGutter) (wrap.alignable || (wrap.alignable = [])).push(gutterWrap); if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) wrap.lineNumber = gutterWrap.appendChild( elt("div", lineNumberFor(cm.options, lineNo), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + display.lineNumInnerWidth + "px")); if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) { var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id]; if (found) gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " + dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px")); } } if (ie_lt8) wrap.style.zIndex = 2; if (line.widgets && wrap != reuse) for (var i = 0, ws = line.widgets; i < ws.length; ++i) { var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); if (!widget.handleMouseEvents) node.ignoreEvents = true; positionLineWidget(widget, node, wrap, dims); if (widget.above) wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement); else wrap.appendChild(node); signalLater(widget, "redraw"); } return wrap; } function positionLineWidget(widget, node, wrap, dims) { if (widget.noHScroll) { (wrap.alignable || (wrap.alignable = [])).push(node); var width = dims.wrapperWidth; node.style.left = dims.fixedPos + "px"; if (!widget.coverGutter) { width -= dims.gutterTotalWidth; node.style.paddingLeft = dims.gutterTotalWidth + "px"; } node.style.width = width + "px"; } if (widget.coverGutter) { node.style.zIndex = 5; node.style.position = "relative"; if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px"; } } // SELECTION / CURSOR function updateSelection(cm) { var display = cm.display; var collapsed = posEq(cm.doc.sel.from, cm.doc.sel.to); if (collapsed || cm.options.showCursorWhenSelecting) updateSelectionCursor(cm); else display.cursor.style.display = display.otherCursor.style.display = "none"; if (!collapsed) updateSelectionRange(cm); else display.selectionDiv.style.display = "none"; // Move the hidden textarea near the cursor to prevent scrolling artifacts if (cm.options.moveInputWithCursor) { var headPos = cursorCoords(cm, cm.doc.sel.head, "div"); var wrapOff = getRect(display.wrapper), lineOff = getRect(display.lineDiv); display.inputDiv.style.top = Math.max(0, Math.min(display.wrapper.clientHeight - 10, headPos.top + lineOff.top - wrapOff.top)) + "px"; display.inputDiv.style.left = Math.max(0, Math.min(display.wrapper.clientWidth - 10, headPos.left + lineOff.left - wrapOff.left)) + "px"; } } // No selection, plain cursor function updateSelectionCursor(cm) { var display = cm.display, pos = cursorCoords(cm, cm.doc.sel.head, "div"); display.cursor.style.left = pos.left + "px"; display.cursor.style.top = pos.top + "px"; display.cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; display.cursor.style.display = ""; if (pos.other) { display.otherCursor.style.display = ""; display.otherCursor.style.left = pos.other.left + "px"; display.otherCursor.style.top = pos.other.top + "px"; display.otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; } else { display.otherCursor.style.display = "none"; } } // Highlight selection function updateSelectionRange(cm) { var display = cm.display, doc = cm.doc, sel = cm.doc.sel; var fragment = document.createDocumentFragment(); var padding = paddingH(cm.display), leftSide = padding.left, rightSide = display.lineSpace.offsetWidth - padding.right; function add(left, top, width, bottom) { if (top < 0) top = 0; fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px; height: " + (bottom - top) + "px")); } function drawForLine(line, fromArg, toArg) { var lineObj = getLine(doc, line); var lineLen = lineObj.text.length; var start, end; function coords(ch, bias) { return charCoords(cm, Pos(line, ch), "div", lineObj, bias); } iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) { var leftPos = coords(from, "left"), rightPos, left, right; if (from == to) { rightPos = leftPos; left = right = leftPos.left; } else { rightPos = coords(to - 1, "right"); if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; } left = leftPos.left; right = rightPos.right; } if (fromArg == null && from == 0) left = leftSide; if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part add(left, leftPos.top, null, leftPos.bottom); left = leftSide; if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top); } if (toArg == null && to == lineLen) right = rightSide; if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left) start = leftPos; if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right) end = rightPos; if (left < leftSide + 1) left = leftSide; add(left, rightPos.top, right - left, rightPos.bottom); }); return {start: start, end: end}; } if (sel.from.line == sel.to.line) { drawForLine(sel.from.line, sel.from.ch, sel.to.ch); } else { var fromLine = getLine(doc, sel.from.line), toLine = getLine(doc, sel.to.line); var singleVLine = visualLine(doc, fromLine) == visualLine(doc, toLine); var leftEnd = drawForLine(sel.from.line, sel.from.ch, singleVLine ? fromLine.text.length : null).end; var rightStart = drawForLine(sel.to.line, singleVLine ? 0 : null, sel.to.ch).start; if (singleVLine) { if (leftEnd.top < rightStart.top - 2) { add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); } else { add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); } } if (leftEnd.bottom < rightStart.top) add(leftSide, leftEnd.bottom, null, rightStart.top); } removeChildrenAndAdd(display.selectionDiv, fragment); display.selectionDiv.style.display = ""; } // Cursor-blinking function restartBlink(cm) { if (!cm.state.focused) return; var display = cm.display; clearInterval(display.blinker); var on = true; display.cursor.style.visibility = display.otherCursor.style.visibility = ""; if (cm.options.cursorBlinkRate > 0) display.blinker = setInterval(function() { display.cursor.style.visibility = display.otherCursor.style.visibility = (on = !on) ? "" : "hidden"; }, cm.options.cursorBlinkRate); } // HIGHLIGHT WORKER function startWorker(cm, time) { if (cm.doc.mode.startState && cm.doc.frontier < cm.display.showingTo) cm.state.highlight.set(time, bind(highlightWorker, cm)); } function highlightWorker(cm) { var doc = cm.doc; if (doc.frontier < doc.first) doc.frontier = doc.first; if (doc.frontier >= cm.display.showingTo) return; var end = +new Date + cm.options.workTime; var state = copyState(doc.mode, getStateBefore(cm, doc.frontier)); var changed = [], prevChange; doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.showingTo + 500), function(line) { if (doc.frontier >= cm.display.showingFrom) { // Visible var oldStyles = line.styles; line.styles = highlightLine(cm, line, state, true); var ischange = !oldStyles || oldStyles.length != line.styles.length; for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i]; if (ischange) { if (prevChange && prevChange.end == doc.frontier) prevChange.end++; else changed.push(prevChange = {start: doc.frontier, end: doc.frontier + 1}); } line.stateAfter = copyState(doc.mode, state); } else { processLine(cm, line.text, state); line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null; } ++doc.frontier; if (+new Date > end) { startWorker(cm, cm.options.workDelay); return true; } }); if (changed.length) operation(cm, function() { for (var i = 0; i < changed.length; ++i) regChange(this, changed[i].start, changed[i].end); })(); } // Finds the line to start with when starting a parse. Tries to // find a line with a stateAfter, so that it can start with a // valid state. If that fails, it returns the line with the // smallest indentation, which tends to need the least context to // parse correctly. function findStartLine(cm, n, precise) { var minindent, minline, doc = cm.doc; var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); for (var search = n; search > lim; --search) { if (search <= doc.first) return doc.first; var line = getLine(doc, search - 1); if (line.stateAfter && (!precise || search <= doc.frontier)) return search; var indented = countColumn(line.text, null, cm.options.tabSize); if (minline == null || minindent > indented) { minline = search - 1; minindent = indented; } } return minline; } function getStateBefore(cm, n, precise) { var doc = cm.doc, display = cm.display; if (!doc.mode.startState) return true; var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter; if (!state) state = startState(doc.mode); else state = copyState(doc.mode, state); doc.iter(pos, n, function(line) { processLine(cm, line.text, state); var save = pos == n - 1 || pos % 5 == 0 || pos >= display.showingFrom && pos < display.showingTo; line.stateAfter = save ? copyState(doc.mode, state) : null; ++pos; }); if (precise) doc.frontier = pos; return state; } // POSITION MEASUREMENT function paddingTop(display) {return display.lineSpace.offsetTop;} function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;} function paddingH(display) { if (display.cachedPaddingH) return display.cachedPaddingH; var e = removeChildrenAndAdd(display.measure, elt("pre", "x")); var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; return display.cachedPaddingH = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; } function measureChar(cm, line, ch, data, bias) { var dir = -1; data = data || measureLine(cm, line); if (data.crude) { var left = data.left + ch * data.width; return {left: left, right: left + data.width, top: data.top, bottom: data.bottom}; } for (var pos = ch;; pos += dir) { var r = data[pos]; if (r) break; if (dir < 0 && pos == 0) dir = 1; } bias = pos > ch ? "left" : pos < ch ? "right" : bias; if (bias == "left" && r.leftSide) r = r.leftSide; else if (bias == "right" && r.rightSide) r = r.rightSide; return {left: pos < ch ? r.right : r.left, right: pos > ch ? r.left : r.right, top: r.top, bottom: r.bottom}; } function findCachedMeasurement(cm, line) { var cache = cm.display.measureLineCache; for (var i = 0; i < cache.length; ++i) { var memo = cache[i]; if (memo.text == line.text && memo.markedSpans == line.markedSpans && cm.display.scroller.clientWidth == memo.width && memo.classes == line.textClass + "|" + line.wrapClass) return memo; } } function clearCachedMeasurement(cm, line) { var exists = findCachedMeasurement(cm, line); if (exists) exists.text = exists.measure = exists.markedSpans = null; } function measureLine(cm, line) { // First look in the cache var cached = findCachedMeasurement(cm, line); if (cached) return cached.measure; // Failing that, recompute and store result in cache var measure = measureLineInner(cm, line); var cache = cm.display.measureLineCache; var memo = {text: line.text, width: cm.display.scroller.clientWidth, markedSpans: line.markedSpans, measure: measure, classes: line.textClass + "|" + line.wrapClass}; if (cache.length == 16) cache[++cm.display.measureLineCachePos % 16] = memo; else cache.push(memo); return measure; } function measureLineInner(cm, line) { if (!cm.options.lineWrapping && line.text.length >= cm.options.crudeMeasuringFrom) return crudelyMeasureLine(cm, line); var display = cm.display, measure = emptyArray(line.text.length); var pre = buildLineContent(cm, line, measure, true).pre; // IE does not cache element positions of inline elements between // calls to getBoundingClientRect. This makes the loop below, // which gathers the positions of all the characters on the line, // do an amount of layout work quadratic to the number of // characters. When line wrapping is off, we try to improve things // by first subdividing the line into a bunch of inline blocks, so // that IE can reuse most of the layout information from caches // for those blocks. This does interfere with line wrapping, so it // doesn't work when wrapping is on, but in that case the // situation is slightly better, since IE does cache line-wrapping // information and only recomputes per-line. if (old_ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) { var fragment = document.createDocumentFragment(); var chunk = 10, n = pre.childNodes.length; for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) { var wrap = elt("div", null, null, "display: inline-block"); for (var j = 0; j < chunk && n; ++j) { wrap.appendChild(pre.firstChild); --n; } fragment.appendChild(wrap); } pre.appendChild(fragment); } removeChildrenAndAdd(display.measure, pre); var outer = getRect(display.lineDiv); var vranges = [], data = emptyArray(line.text.length), maxBot = pre.offsetHeight; // Work around an IE7/8 bug where it will sometimes have randomly // replaced our pre with a clone at this point. if (ie_lt9 && display.measure.first != pre) removeChildrenAndAdd(display.measure, pre); function measureRect(rect) { var top = rect.top - outer.top, bot = rect.bottom - outer.top; if (bot > maxBot) bot = maxBot; if (top < 0) top = 0; for (var i = vranges.length - 2; i >= 0; i -= 2) { var rtop = vranges[i], rbot = vranges[i+1]; if (rtop > bot || rbot < top) continue; if (rtop <= top && rbot >= bot || top <= rtop && bot >= rbot || Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) { vranges[i] = Math.min(top, rtop); vranges[i+1] = Math.max(bot, rbot); break; } } if (i < 0) { i = vranges.length; vranges.push(top, bot); } return {left: rect.left - outer.left, right: rect.right - outer.left, top: i, bottom: null}; } function finishRect(rect) { rect.bottom = vranges[rect.top+1]; rect.top = vranges[rect.top]; } for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) { var node = cur, rect = null; // A widget might wrap, needs special care if (/\bCodeMirror-widget\b/.test(cur.className) && cur.getClientRects) { if (cur.firstChild.nodeType == 1) node = cur.firstChild; var rects = node.getClientRects(); if (rects.length > 1) { rect = data[i] = measureRect(rects[0]); rect.rightSide = measureRect(rects[rects.length - 1]); } } if (!rect) rect = data[i] = measureRect(getRect(node)); if (cur.measureRight) rect.right = getRect(cur.measureRight).left - outer.left; if (cur.leftSide) rect.leftSide = measureRect(getRect(cur.leftSide)); } removeChildren(cm.display.measure); for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) { finishRect(cur); if (cur.leftSide) finishRect(cur.leftSide); if (cur.rightSide) finishRect(cur.rightSide); } return data; } function crudelyMeasureLine(cm, line) { var copy = new Line(line.text.slice(0, 100), null); if (line.textClass) copy.textClass = line.textClass; var measure = measureLineInner(cm, copy); var left = measureChar(cm, copy, 0, measure, "left"); var right = measureChar(cm, copy, 99, measure, "right"); return {crude: true, top: left.top, left: left.left, bottom: left.bottom, width: (right.right - left.left) / 100}; } function measureLineWidth(cm, line) { var hasBadSpan = false; if (line.markedSpans) for (var i = 0; i < line.markedSpans; ++i) { var sp = line.markedSpans[i]; if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true; } var cached = !hasBadSpan && findCachedMeasurement(cm, line); if (cached || line.text.length >= cm.options.crudeMeasuringFrom) return measureChar(cm, line, line.text.length, cached && cached.measure, "right").right; var pre = buildLineContent(cm, line, null, true).pre; var end = pre.appendChild(zeroWidthElement(cm.display.measure)); removeChildrenAndAdd(cm.display.measure, pre); return getRect(end).right - getRect(cm.display.lineDiv).left; } function clearCaches(cm) { cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0; cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; if (!cm.options.lineWrapping) cm.display.maxLineChanged = true; cm.display.lineNumChars = null; } function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; } function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; } // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page" function intoCoordSystem(cm, lineObj, rect, context) { if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) { var size = widgetHeight(lineObj.widgets[i]); rect.top += size; rect.bottom += size; } if (context == "line") return rect; if (!context) context = "local"; var yOff = heightAtLine(cm, lineObj); if (context == "local") yOff += paddingTop(cm.display); else yOff -= cm.display.viewOffset; if (context == "page" || context == "window") { var lOff = getRect(cm.display.lineSpace); yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); rect.left += xOff; rect.right += xOff; } rect.top += yOff; rect.bottom += yOff; return rect; } // Context may be "window", "page", "div", or "local"/null // Result is in "div" coords function fromCoordSystem(cm, coords, context) { if (context == "div") return coords; var left = coords.left, top = coords.top; // First move into "page" coordinate system if (context == "page") { left -= pageScrollX(); top -= pageScrollY(); } else if (context == "local" || !context) { var localBox = getRect(cm.display.sizer); left += localBox.left; top += localBox.top; } var lineSpaceBox = getRect(cm.display.lineSpace); return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}; } function charCoords(cm, pos, context, lineObj, bias) { if (!lineObj) lineObj = getLine(cm.doc, pos.line); return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, null, bias), context); } function cursorCoords(cm, pos, context, lineObj, measurement) { lineObj = lineObj || getLine(cm.doc, pos.line); if (!measurement) measurement = measureLine(cm, lineObj); function get(ch, right) { var m = measureChar(cm, lineObj, ch, measurement, right ? "right" : "left"); if (right) m.left = m.right; else m.right = m.left; return intoCoordSystem(cm, lineObj, m, context); } function getBidi(ch, partPos) { var part = order[partPos], right = part.level % 2; if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) { part = order[--partPos]; ch = bidiRight(part) - (part.level % 2 ? 0 : 1); right = true; } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) { part = order[++partPos]; ch = bidiLeft(part) - part.level % 2; right = false; } if (right && ch == part.to && ch > part.from) return get(ch - 1); return get(ch, right); } var order = getOrder(lineObj), ch = pos.ch; if (!order) return get(ch); var partPos = getBidiPartAt(order, ch); var val = getBidi(ch, partPos); if (bidiOther != null) val.other = getBidi(ch, bidiOther); return val; } function PosWithInfo(line, ch, outside, xRel) { var pos = new Pos(line, ch); pos.xRel = xRel; if (outside) pos.outside = true; return pos; } // Coords must be lineSpace-local function coordsChar(cm, x, y) { var doc = cm.doc; y += cm.display.viewOffset; if (y < 0) return PosWithInfo(doc.first, 0, true, -1); var lineNo = lineAtHeight(doc, y), last = doc.first + doc.size - 1; if (lineNo > last) return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1); if (x < 0) x = 0; for (;;) { var lineObj = getLine(doc, lineNo); var found = coordsCharInner(cm, lineObj, lineNo, x, y); var merged = collapsedSpanAtEnd(lineObj); var mergedPos = merged && merged.find(); if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0)) lineNo = mergedPos.to.line; else return found; } } function coordsCharInner(cm, lineObj, lineNo, x, y) { var innerOff = y - heightAtLine(cm, lineObj); var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth; var measurement = measureLine(cm, lineObj); function getX(ch) { var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, measurement); wrongLine = true; if (innerOff > sp.bottom) return sp.left - adjust; else if (innerOff < sp.top) return sp.left + adjust; else wrongLine = false; return sp.left; } var bidi = getOrder(lineObj), dist = lineObj.text.length; var from = lineLeft(lineObj), to = lineRight(lineObj); var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine; if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1); // Do a binary search between these bounds. for (;;) { if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) { var ch = x < fromX || x - fromX <= toX - x ? from : to; var xDiff = x - (ch == from ? fromX : toX); while (isExtendingChar(lineObj.text.charAt(ch))) ++ch; var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside, xDiff < 0 ? -1 : xDiff ? 1 : 0); return pos; } var step = Math.ceil(dist / 2), middle = from + step; if (bidi) { middle = from; for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1); } var middleX = getX(middle); if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;} else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;} } } var measureText; function textHeight(display) { if (display.cachedTextHeight != null) return display.cachedTextHeight; if (measureText == null) { measureText = elt("pre"); // Measure a bunch of lines, for browsers that compute // fractional heights. for (var i = 0; i < 49; ++i) { measureText.appendChild(document.createTextNode("x")); measureText.appendChild(elt("br")); } measureText.appendChild(document.createTextNode("x")); } removeChildrenAndAdd(display.measure, measureText); var height = measureText.offsetHeight / 50; if (height > 3) display.cachedTextHeight = height; removeChildren(display.measure); return height || 1; } function charWidth(display) { if (display.cachedCharWidth != null) return display.cachedCharWidth; var anchor = elt("span", "x"); var pre = elt("pre", [anchor]); removeChildrenAndAdd(display.measure, pre); var width = anchor.offsetWidth; if (width > 2) display.cachedCharWidth = width; return width || 10; } // OPERATIONS // Operations are used to wrap changes in such a way that each // change won't have to update the cursor and display (which would // be awkward, slow, and error-prone), but instead updates are // batched and then all combined and executed at once. var nextOpId = 0; function startOperation(cm) { cm.curOp = { // An array of ranges of lines that have to be updated. See // updateDisplay. changes: [], forceUpdate: false, updateInput: null, userSelChange: null, textChanged: null, selectionChanged: false, cursorActivity: false, updateMaxLine: false, updateScrollPos: false, id: ++nextOpId }; if (!delayedCallbackDepth++) delayedCallbacks = []; } function endOperation(cm) { var op = cm.curOp, doc = cm.doc, display = cm.display; cm.curOp = null; if (op.updateMaxLine) computeMaxLength(cm); if (display.maxLineChanged && !cm.options.lineWrapping && display.maxLine) { var width = measureLineWidth(cm, display.maxLine); display.sizer.style.minWidth = Math.max(0, width + 3) + "px"; display.maxLineChanged = false; var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth); if (maxScrollLeft < doc.scrollLeft && !op.updateScrollPos) setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true); } var newScrollPos, updated; if (op.updateScrollPos) { newScrollPos = op.updateScrollPos; } else if (op.selectionChanged && display.scroller.clientHeight) { // don't rescroll if not visible var coords = cursorCoords(cm, doc.sel.head); newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom); } if (op.changes.length || op.forceUpdate || newScrollPos && newScrollPos.scrollTop != null) { updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop, op.forceUpdate); if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop; } if (!updated && op.selectionChanged) updateSelection(cm); if (op.updateScrollPos) { var top = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, newScrollPos.scrollTop)); var left = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, newScrollPos.scrollLeft)); display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = top; display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = left; alignHorizontally(cm); if (op.scrollToPos) scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos.from), clipPos(cm.doc, op.scrollToPos.to), op.scrollToPos.margin); } else if (newScrollPos) { scrollCursorIntoView(cm); } if (op.selectionChanged) restartBlink(cm); if (cm.state.focused && op.updateInput) resetInput(cm, op.userSelChange); var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; if (hidden) for (var i = 0; i < hidden.length; ++i) if (!hidden[i].lines.length) signal(hidden[i], "hide"); if (unhidden) for (var i = 0; i < unhidden.length; ++i) if (unhidden[i].lines.length) signal(unhidden[i], "unhide"); var delayed; if (!--delayedCallbackDepth) { delayed = delayedCallbacks; delayedCallbacks = null; } if (op.textChanged) signal(cm, "change", cm, op.textChanged); if (op.cursorActivity) signal(cm, "cursorActivity", cm); if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i](); } // Wraps a function in an operation. Returns the wrapped function. function operation(cm1, f) { return function() { var cm = cm1 || this, withOp = !cm.curOp; if (withOp) startOperation(cm); try { var result = f.apply(cm, arguments); } finally { if (withOp) endOperation(cm); } return result; }; } function docOperation(f) { return function() { var withOp = this.cm && !this.cm.curOp, result; if (withOp) startOperation(this.cm); try { result = f.apply(this, arguments); } finally { if (withOp) endOperation(this.cm); } return result; }; } function runInOp(cm, f) { var withOp = !cm.curOp, result; if (withOp) startOperation(cm); try { result = f(); } finally { if (withOp) endOperation(cm); } return result; } function regChange(cm, from, to, lendiff) { if (from == null) from = cm.doc.first; if (to == null) to = cm.doc.first + cm.doc.size; cm.curOp.changes.push({from: from, to: to, diff: lendiff}); } // INPUT HANDLING function slowPoll(cm) { if (cm.display.pollingFast) return; cm.display.poll.set(cm.options.pollInterval, function() { readInput(cm); if (cm.state.focused) slowPoll(cm); }); } function fastPoll(cm) { var missed = false; cm.display.pollingFast = true; function p() { var changed = readInput(cm); if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);} else {cm.display.pollingFast = false; slowPoll(cm);} } cm.display.poll.set(20, p); } // prevInput is a hack to work with IME. If we reset the textarea // on every change, that breaks IME. So we look for changes // compared to the previous content instead. (Modern browsers have // events that indicate IME taking place, but these are not widely // supported or compatible enough yet to rely on.) function readInput(cm) { var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel; if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.options.disableInput) return false; if (cm.state.pasteIncoming && cm.state.fakedLastChar) { input.value = input.value.substring(0, input.value.length - 1); cm.state.fakedLastChar = false; } var text = input.value; if (text == prevInput && posEq(sel.from, sel.to)) return false; if (ie && !ie_lt9 && cm.display.inputHasSelection === text) { resetInput(cm, true); return false; } var withOp = !cm.curOp; if (withOp) startOperation(cm); sel.shift = false; var same = 0, l = Math.min(prevInput.length, text.length); while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same; var from = sel.from, to = sel.to; var inserted = text.slice(same); if (same < prevInput.length) from = Pos(from.line, from.ch - (prevInput.length - same)); else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming) to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + inserted.length)); var updateInput = cm.curOp.updateInput; var changeEvent = {from: from, to: to, text: splitLines(inserted), origin: cm.state.pasteIncoming ? "paste" : cm.state.cutIncoming ? "cut" : "+input"}; makeChange(cm.doc, changeEvent, "end"); cm.curOp.updateInput = updateInput; signalLater(cm, "inputRead", cm, changeEvent); if (inserted && !cm.state.pasteIncoming && cm.options.electricChars && cm.options.smartIndent && sel.head.ch < 100) { var electric = cm.getModeAt(sel.head).electricChars; if (electric) for (var i = 0; i < electric.length; i++) if (inserted.indexOf(electric.charAt(i)) > -1) { indentLine(cm, sel.head.line, "smart"); break; } } if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = ""; else cm.display.prevInput = text; if (withOp) endOperation(cm); cm.state.pasteIncoming = cm.state.cutIncoming = false; return true; } function resetInput(cm, user) { var minimal, selected, doc = cm.doc; if (!posEq(doc.sel.from, doc.sel.to)) { cm.display.prevInput = ""; minimal = hasCopyEvent && (doc.sel.to.line - doc.sel.from.line > 100 || (selected = cm.getSelection()).length > 1000); var content = minimal ? "-" : selected || cm.getSelection(); cm.display.input.value = content; if (cm.state.focused) selectInput(cm.display.input); if (ie && !ie_lt9) cm.display.inputHasSelection = content; } else if (user) { cm.display.prevInput = cm.display.input.value = ""; if (ie && !ie_lt9) cm.display.inputHasSelection = null; } cm.display.inaccurateSelection = minimal; } function focusInput(cm) { if (cm.options.readOnly != "nocursor" && (!mobile || document.activeElement != cm.display.input)) cm.display.input.focus(); } function ensureFocus(cm) { if (!cm.state.focused) { focusInput(cm); onFocus(cm); } } function isReadOnly(cm) { return cm.options.readOnly || cm.doc.cantEdit; } // EVENT HANDLERS function registerEventHandlers(cm) { var d = cm.display; on(d.scroller, "mousedown", operation(cm, onMouseDown)); if (old_ie) on(d.scroller, "dblclick", operation(cm, function(e) { if (signalDOMEvent(cm, e)) return; var pos = posFromMouse(cm, e); if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return; e_preventDefault(e); var word = findWordAt(getLine(cm.doc, pos.line).text, pos); extendSelection(cm.doc, word.from, word.to); })); else on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); }); on(d.lineSpace, "selectstart", function(e) { if (!eventInWidget(d, e)) e_preventDefault(e); }); // Gecko browsers fire contextmenu *after* opening the menu, at // which point we can't mess with it anymore. Context menu is // handled in onMouseDown for Gecko. if (!captureMiddleClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);}); on(d.scroller, "scroll", function() { if (d.scroller.clientHeight) { setScrollTop(cm, d.scroller.scrollTop); setScrollLeft(cm, d.scroller.scrollLeft, true); signal(cm, "scroll", cm); } }); on(d.scrollbarV, "scroll", function() { if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop); }); on(d.scrollbarH, "scroll", function() { if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft); }); on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);}); on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);}); function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); } on(d.scrollbarH, "mousedown", reFocus); on(d.scrollbarV, "mousedown", reFocus); // Prevent wrapper from ever scrolling on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); var resizeTimer; function onResize() { if (resizeTimer == null) resizeTimer = setTimeout(function() { resizeTimer = null; // Might be a text scaling operation, clear size caches. d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = knownScrollbarWidth = null; clearCaches(cm); runInOp(cm, bind(regChange, cm)); }, 100); } on(window, "resize", onResize); // Above handler holds on to the editor and its data structures. // Here we poll to unregister it when the editor is no longer in // the document, so that it can be garbage-collected. function unregister() { for (var p = d.wrapper.parentNode; p && p != document.body; p = p.parentNode) {} if (p) setTimeout(unregister, 5000); else off(window, "resize", onResize); } setTimeout(unregister, 5000); on(d.input, "keyup", operation(cm, onKeyUp)); on(d.input, "input", function() { if (ie && !ie_lt9 && cm.display.inputHasSelection) cm.display.inputHasSelection = null; fastPoll(cm); }); on(d.input, "keydown", operation(cm, onKeyDown)); on(d.input, "keypress", operation(cm, onKeyPress)); on(d.input, "focus", bind(onFocus, cm)); on(d.input, "blur", bind(onBlur, cm)); function drag_(e) { if (signalDOMEvent(cm, e) || cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return; e_stop(e); } if (cm.options.dragDrop) { on(d.scroller, "dragstart", function(e){onDragStart(cm, e);}); on(d.scroller, "dragenter", drag_); on(d.scroller, "dragover", drag_); on(d.scroller, "drop", operation(cm, onDrop)); } on(d.scroller, "paste", function(e) { if (eventInWidget(d, e)) return; focusInput(cm); fastPoll(cm); }); on(d.input, "paste", function() { // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206 // Add a char to the end of textarea before paste occur so that // selection doesn't span to the end of textarea. if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) { var start = d.input.selectionStart, end = d.input.selectionEnd; d.input.value += "$"; d.input.selectionStart = start; d.input.selectionEnd = end; cm.state.fakedLastChar = true; } cm.state.pasteIncoming = true; fastPoll(cm); }); function prepareCopy(e) { if (d.inaccurateSelection) { d.prevInput = ""; d.inaccurateSelection = false; d.input.value = cm.getSelection(); selectInput(d.input); } if (e.type == "cut") cm.state.cutIncoming = true; } on(d.input, "cut", prepareCopy); on(d.input, "copy", prepareCopy); // Needed to handle Tab key in KHTML if (khtml) on(d.sizer, "mouseup", function() { if (document.activeElement == d.input) d.input.blur(); focusInput(cm); }); } function eventInWidget(display, e) { for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true; } } function posFromMouse(cm, e, liberal) { var display = cm.display; if (!liberal) { var target = e_target(e); if (target == display.scrollbarH || target == display.scrollbarH.firstChild || target == display.scrollbarV || target == display.scrollbarV.firstChild || target == display.scrollbarFiller || target == display.gutterFiller) return null; } var x, y, space = getRect(display.lineSpace); // Fails unpredictably on IE[67] when mouse is dragged around quickly. try { x = e.clientX; y = e.clientY; } catch (e) { return null; } return coordsChar(cm, x - space.left, y - space.top); } var lastClick, lastDoubleClick; function onMouseDown(e) { if (signalDOMEvent(this, e)) return; var cm = this, display = cm.display, doc = cm.doc, sel = doc.sel; sel.shift = e.shiftKey; if (eventInWidget(display, e)) { if (!webkit) { display.scroller.draggable = false; setTimeout(function(){display.scroller.draggable = true;}, 100); } return; } if (clickInGutter(cm, e)) return; var start = posFromMouse(cm, e); window.focus(); switch (e_button(e)) { case 3: if (captureMiddleClick) onContextMenu.call(cm, cm, e); return; case 2: if (webkit) cm.state.lastMiddleDown = +new Date; if (start) extendSelection(cm.doc, start); setTimeout(bind(focusInput, cm), 20); e_preventDefault(e); return; } // For button 1, if it was clicked inside the editor // (posFromMouse returning non-null), we have to adjust the // selection. if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;} setTimeout(bind(ensureFocus, cm), 0); var now = +new Date, type = "single"; if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) { type = "triple"; e_preventDefault(e); setTimeout(bind(focusInput, cm), 20); selectLine(cm, start.line); } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) { type = "double"; lastDoubleClick = {time: now, pos: start}; e_preventDefault(e); var word = findWordAt(getLine(doc, start.line).text, start); extendSelection(cm.doc, word.from, word.to); } else { lastClick = {time: now, pos: start}; } var last = start; if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && !posEq(sel.from, sel.to) && !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") { var dragEnd = operation(cm, function(e2) { if (webkit) display.scroller.draggable = false; cm.state.draggingText = false; off(document, "mouseup", dragEnd); off(display.scroller, "drop", dragEnd); if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) { e_preventDefault(e2); extendSelection(cm.doc, start); focusInput(cm); // Work around unexplainable focus problem in IE9 (#2127) if (old_ie && !ie_lt9) setTimeout(function() {document.body.focus(); focusInput(cm);}, 20); } }); // Let the drag handler handle this. if (webkit) display.scroller.draggable = true; cm.state.draggingText = dragEnd; // IE's approach to draggable if (display.scroller.dragDrop) display.scroller.dragDrop(); on(document, "mouseup", dragEnd); on(display.scroller, "drop", dragEnd); return; } e_preventDefault(e); if (type == "single") extendSelection(cm.doc, clipPos(doc, start)); var startstart = sel.from, startend = sel.to, lastPos = start; function doSelect(cur) { if (posEq(lastPos, cur)) return; lastPos = cur; if (type == "single") { extendSelection(cm.doc, clipPos(doc, start), cur); return; } startstart = clipPos(doc, startstart); startend = clipPos(doc, startend); if (type == "double") { var word = findWordAt(getLine(doc, cur.line).text, cur); if (posLess(cur, startstart)) extendSelection(cm.doc, word.from, startend); else extendSelection(cm.doc, startstart, word.to); } else if (type == "triple") { if (posLess(cur, startstart)) extendSelection(cm.doc, startend, clipPos(doc, Pos(cur.line, 0))); else extendSelection(cm.doc, startstart, clipPos(doc, Pos(cur.line + 1, 0))); } } var editorSize = getRect(display.wrapper); // Used to ensure timeout re-tries don't fire when another extend // happened in the meantime (clearTimeout isn't reliable -- at // least on Chrome, the timeouts still happen even when cleared, // if the clear happens after their scheduled firing time). var counter = 0; function extend(e) { var curCount = ++counter; var cur = posFromMouse(cm, e, true); if (!cur) return; if (!posEq(cur, last)) { ensureFocus(cm); last = cur; doSelect(cur); var visible = visibleLines(display, doc); if (cur.line >= visible.to || cur.line < visible.from) setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150); } else { var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; if (outside) setTimeout(operation(cm, function() { if (counter != curCount) return; display.scroller.scrollTop += outside; extend(e); }), 50); } } function done(e) { counter = Infinity; e_preventDefault(e); focusInput(cm); off(document, "mousemove", move); off(document, "mouseup", up); } var move = operation(cm, function(e) { if ((ie && !ie_lt10) ? !e.buttons : !e_button(e)) done(e); else extend(e); }); var up = operation(cm, done); on(document, "mousemove", move); on(document, "mouseup", up); } function gutterEvent(cm, e, type, prevent, signalfn) { try { var mX = e.clientX, mY = e.clientY; } catch(e) { return false; } if (mX >= Math.floor(getRect(cm.display.gutters).right)) return false; if (prevent) e_preventDefault(e); var display = cm.display; var lineBox = getRect(display.lineDiv); if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e); mY -= lineBox.top - display.viewOffset; for (var i = 0; i < cm.options.gutters.length; ++i) { var g = display.gutters.childNodes[i]; if (g && getRect(g).right >= mX) { var line = lineAtHeight(cm.doc, mY); var gutter = cm.options.gutters[i]; signalfn(cm, type, cm, line, gutter, e); return e_defaultPrevented(e); } } } function contextMenuInGutter(cm, e) { if (!hasHandler(cm, "gutterContextMenu")) return false; return gutterEvent(cm, e, "gutterContextMenu", false, signal); } function clickInGutter(cm, e) { return gutterEvent(cm, e, "gutterClick", true, signalLater); } // Kludge to work around strange IE behavior where it'll sometimes // re-fire a series of drag-related events right after the drop (#1551) var lastDrop = 0; function onDrop(e) { var cm = this; if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e)))) return; e_preventDefault(e); if (ie) lastDrop = +new Date; var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; if (!pos || isReadOnly(cm)) return; if (files && files.length && window.FileReader && window.File) { var n = files.length, text = Array(n), read = 0; var loadFile = function(file, i) { var reader = new FileReader; reader.onload = function() { text[i] = reader.result; if (++read == n) { pos = clipPos(cm.doc, pos); makeChange(cm.doc, {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"}, "around"); } }; reader.readAsText(file); }; for (var i = 0; i < n; ++i) loadFile(files[i], i); } else { // Don't do a replace if the drop happened inside of the selected text. if (cm.state.draggingText && !(posLess(pos, cm.doc.sel.from) || posLess(cm.doc.sel.to, pos))) { cm.state.draggingText(e); // Ensure the editor is re-focused setTimeout(bind(focusInput, cm), 20); return; } try { var text = e.dataTransfer.getData("Text"); if (text) { var curFrom = cm.doc.sel.from, curTo = cm.doc.sel.to; setSelection(cm.doc, pos, pos); if (cm.state.draggingText) replaceRange(cm.doc, "", curFrom, curTo, "paste"); cm.replaceSelection(text, null, "paste"); focusInput(cm); } } catch(e){} } } function onDragStart(cm, e) { if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; } if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return; var txt = cm.getSelection(); e.dataTransfer.setData("Text", txt); // Use dummy image instead of default browsers image. // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. if (e.dataTransfer.setDragImage && !safari) { var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; if (opera) { img.width = img.height = 1; cm.display.wrapper.appendChild(img); // Force a relayout, or Opera won't use our image for some obscure reason img._top = img.offsetTop; } e.dataTransfer.setDragImage(img, 0, 0); if (opera) img.parentNode.removeChild(img); } } function setScrollTop(cm, val) { if (Math.abs(cm.doc.scrollTop - val) < 2) return; cm.doc.scrollTop = val; if (!gecko) updateDisplay(cm, [], val); if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val; if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val; if (gecko) updateDisplay(cm, []); startWorker(cm, 100); } function setScrollLeft(cm, val, isScroller) { if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return; val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth); cm.doc.scrollLeft = val; alignHorizontally(cm); if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val; if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val; } // Since the delta values reported on mouse wheel events are // unstandardized between browsers and even browser versions, and // generally horribly unpredictable, this code starts by measuring // the scroll effect that the first few mouse wheel events have, // and, from that, detects the way it can convert deltas to pixel // offsets afterwards. // // The reason we want to know the amount a wheel event will scroll // is that it gives us a chance to update the display before the // actual scrolling happens, reducing flickering. var wheelSamples = 0, wheelPixelsPerUnit = null; // Fill in a browser-detected starting value on browsers where we // know one. These don't have to be accurate -- the result of them // being wrong would just be a slight flicker on the first wheel // scroll (if it is large enough). if (ie) wheelPixelsPerUnit = -.53; else if (gecko) wheelPixelsPerUnit = 15; else if (chrome) wheelPixelsPerUnit = -.7; else if (safari) wheelPixelsPerUnit = -1/3; function onScrollWheel(cm, e) { var dx = e.wheelDeltaX, dy = e.wheelDeltaY; if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail; if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail; else if (dy == null) dy = e.wheelDelta; var display = cm.display, scroll = display.scroller; // Quit if there's nothing to scroll here if (!(dx && scroll.scrollWidth > scroll.clientWidth || dy && scroll.scrollHeight > scroll.clientHeight)) return; // Webkit browsers on OS X abort momentum scrolls when the target // of the scroll event is removed from the scrollable element. // This hack (see related code in patchDisplay) makes sure the // element is kept around. if (dy && mac && webkit) { for (var cur = e.target; cur != scroll; cur = cur.parentNode) { if (cur.lineObj) { cm.display.currentWheelTarget = cur; break; } } } // On some browsers, horizontal scrolling will cause redraws to // happen before the gutter has been realigned, causing it to // wriggle around in a most unseemly way. When we have an // estimated pixels/delta value, we just handle horizontal // scrolling entirely here. It'll be slightly off from native, but // better than glitching out. if (dx && !gecko && !opera && wheelPixelsPerUnit != null) { if (dy) setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight))); setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth))); e_preventDefault(e); display.wheelStartX = null; // Abort measurement, if in progress return; } if (dy && wheelPixelsPerUnit != null) { var pixels = dy * wheelPixelsPerUnit; var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; if (pixels < 0) top = Math.max(0, top + pixels - 50); else bot = Math.min(cm.doc.height, bot + pixels + 50); updateDisplay(cm, [], {top: top, bottom: bot}); } if (wheelSamples < 20) { if (display.wheelStartX == null) { display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; display.wheelDX = dx; display.wheelDY = dy; setTimeout(function() { if (display.wheelStartX == null) return; var movedX = scroll.scrollLeft - display.wheelStartX; var movedY = scroll.scrollTop - display.wheelStartY; var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || (movedX && display.wheelDX && movedX / display.wheelDX); display.wheelStartX = display.wheelStartY = null; if (!sample) return; wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); ++wheelSamples; }, 200); } else { display.wheelDX += dx; display.wheelDY += dy; } } } function doHandleBinding(cm, bound, dropShift) { if (typeof bound == "string") { bound = commands[bound]; if (!bound) return false; } // Ensure previous input has been read, so that the handler sees a // consistent view of the document if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false; var doc = cm.doc, prevShift = doc.sel.shift, done = false; try { if (isReadOnly(cm)) cm.state.suppressEdits = true; if (dropShift) doc.sel.shift = false; done = bound(cm) != Pass; } finally { doc.sel.shift = prevShift; cm.state.suppressEdits = false; } return done; } function allKeyMaps(cm) { var maps = cm.state.keyMaps.slice(0); if (cm.options.extraKeys) maps.push(cm.options.extraKeys); maps.push(cm.options.keyMap); return maps; } var maybeTransition; function handleKeyBinding(cm, e) { // Handle auto keymap transitions var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto; clearTimeout(maybeTransition); if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() { if (getKeyMap(cm.options.keyMap) == startMap) { cm.options.keyMap = (next.call ? next.call(null, cm) : next); keyMapChanged(cm); } }, 50); var name = keyName(e, true), handled = false; if (!name) return false; var keymaps = allKeyMaps(cm); if (e.shiftKey) { // First try to resolve full name (including 'Shift-'). Failing // that, see if there is a cursor-motion command (starting with // 'go') bound to the keyname without 'Shift-'. handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);}) || lookupKey(name, keymaps, function(b) { if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) return doHandleBinding(cm, b); }); } else { handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); }); } if (handled) { e_preventDefault(e); restartBlink(cm); if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; } signalLater(cm, "keyHandled", cm, name, e); } return handled; } function handleCharBinding(cm, e, ch) { var handled = lookupKey("'" + ch + "'", allKeyMaps(cm), function(b) { return doHandleBinding(cm, b, true); }); if (handled) { e_preventDefault(e); restartBlink(cm); signalLater(cm, "keyHandled", cm, "'" + ch + "'", e); } return handled; } function onKeyUp(e) { var cm = this; if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; if (e.keyCode == 16) cm.doc.sel.shift = false; } var lastStoppedKey = null; function onKeyDown(e) { var cm = this; ensureFocus(cm); if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; if (old_ie && e.keyCode == 27) e.returnValue = false; var code = e.keyCode; // IE does strange things with escape. cm.doc.sel.shift = code == 16 || e.shiftKey; // First give onKeyEvent option a chance to handle this. var handled = handleKeyBinding(cm, e); if (opera) { lastStoppedKey = handled ? code : null; // Opera has no cut event... we try to at least catch the key combo if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) cm.replaceSelection(""); } } function onKeyPress(e) { var cm = this; if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; var keyCode = e.keyCode, charCode = e.charCode; if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;} if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return; var ch = String.fromCharCode(charCode == null ? keyCode : charCode); if (handleCharBinding(cm, e, ch)) return; if (ie && !ie_lt9) cm.display.inputHasSelection = null; fastPoll(cm); } function onFocus(cm) { if (cm.options.readOnly == "nocursor") return; if (!cm.state.focused) { signal(cm, "focus", cm); cm.state.focused = true; if (cm.display.wrapper.className.search(/\bCodeMirror-focused\b/) == -1) cm.display.wrapper.className += " CodeMirror-focused"; if (!cm.curOp) { resetInput(cm, true); if (webkit) setTimeout(bind(resetInput, cm, true), 0); // Issue #1730 } } slowPoll(cm); restartBlink(cm); } function onBlur(cm) { if (cm.state.focused) { signal(cm, "blur", cm); cm.state.focused = false; cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-focused", ""); } clearInterval(cm.display.blinker); setTimeout(function() {if (!cm.state.focused) cm.doc.sel.shift = false;}, 150); } var detectingSelectAll; function onContextMenu(cm, e) { if (signalDOMEvent(cm, e, "contextmenu")) return; var display = cm.display, sel = cm.doc.sel; if (eventInWidget(display, e) || contextMenuInGutter(cm, e)) return; var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; if (!pos || opera) return; // Opera is difficult. // Reset the current text selection only if the click is done outside of the selection // and 'resetSelectionOnContextMenu' option is true. var reset = cm.options.resetSelectionOnContextMenu; if (reset && (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))) operation(cm, setSelection)(cm.doc, pos, pos); var oldCSS = display.input.style.cssText; display.inputDiv.style.position = "absolute"; display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) + "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: transparent; outline: none;" + "border-width: 0; outline: none; overflow: hidden; opacity: .05; -ms-opacity: .05; filter: alpha(opacity=5);"; focusInput(cm); resetInput(cm, true); // Adds "Select all" to context menu in FF if (posEq(sel.from, sel.to)) display.input.value = display.prevInput = " "; function prepareSelectAllHack() { if (display.input.selectionStart != null) { var extval = display.input.value = "\u200b" + (posEq(sel.from, sel.to) ? "" : display.input.value); display.prevInput = "\u200b"; display.input.selectionStart = 1; display.input.selectionEnd = extval.length; } } function rehide() { display.inputDiv.style.position = "relative"; display.input.style.cssText = oldCSS; if (ie_lt9) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos; slowPoll(cm); // Try to detect the user choosing select-all if (display.input.selectionStart != null) { if (!ie || ie_lt9) prepareSelectAllHack(); clearTimeout(detectingSelectAll); var i = 0, poll = function(){ if (display.prevInput == "\u200b" && display.input.selectionStart == 0) operation(cm, commands.selectAll)(cm); else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500); else resetInput(cm); }; detectingSelectAll = setTimeout(poll, 200); } } if (ie && !ie_lt9) prepareSelectAllHack(); if (captureMiddleClick) { e_stop(e); var mouseup = function() { off(window, "mouseup", mouseup); setTimeout(rehide, 20); }; on(window, "mouseup", mouseup); } else { setTimeout(rehide, 50); } } // UPDATING var changeEnd = CodeMirror.changeEnd = function(change) { if (!change.text) return change.to; return Pos(change.from.line + change.text.length - 1, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)); }; // Make sure a position will be valid after the given change. function clipPostChange(doc, change, pos) { if (!posLess(change.from, pos)) return clipPos(doc, pos); var diff = (change.text.length - 1) - (change.to.line - change.from.line); if (pos.line > change.to.line + diff) { var preLine = pos.line - diff, lastLine = doc.first + doc.size - 1; if (preLine > lastLine) return Pos(lastLine, getLine(doc, lastLine).text.length); return clipToLen(pos, getLine(doc, preLine).text.length); } if (pos.line == change.to.line + diff) return clipToLen(pos, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0) + getLine(doc, change.to.line).text.length - change.to.ch); var inside = pos.line - change.from.line; return clipToLen(pos, change.text[inside].length + (inside ? 0 : change.from.ch)); } // Hint can be null|"end"|"start"|"around"|{anchor,head} function computeSelAfterChange(doc, change, hint) { if (hint && typeof hint == "object") // Assumed to be {anchor, head} object return {anchor: clipPostChange(doc, change, hint.anchor), head: clipPostChange(doc, change, hint.head)}; if (hint == "start") return {anchor: change.from, head: change.from}; var end = changeEnd(change); if (hint == "around") return {anchor: change.from, head: end}; if (hint == "end") return {anchor: end, head: end}; // hint is null, leave the selection alone as much as possible var adjustPos = function(pos) { if (posLess(pos, change.from)) return pos; if (!posLess(change.to, pos)) return end; var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; if (pos.line == change.to.line) ch += end.ch - change.to.ch; return Pos(line, ch); }; return {anchor: adjustPos(doc.sel.anchor), head: adjustPos(doc.sel.head)}; } function filterChange(doc, change, update) { var obj = { canceled: false, from: change.from, to: change.to, text: change.text, origin: change.origin, cancel: function() { this.canceled = true; } }; if (update) obj.update = function(from, to, text, origin) { if (from) this.from = clipPos(doc, from); if (to) this.to = clipPos(doc, to); if (text) this.text = text; if (origin !== undefined) this.origin = origin; }; signal(doc, "beforeChange", doc, obj); if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj); if (obj.canceled) return null; return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}; } // Replace the range from from to to by the strings in replacement. // change is a {from, to, text [, origin]} object function makeChange(doc, change, selUpdate, ignoreReadOnly) { if (doc.cm) { if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, selUpdate, ignoreReadOnly); if (doc.cm.state.suppressEdits) return; } if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { change = filterChange(doc, change, true); if (!change) return; } // Possibly split or suppress the update based on the presence // of read-only spans in its range. var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); if (split) { for (var i = split.length - 1; i >= 1; --i) makeChangeNoReadonly(doc, {from: split[i].from, to: split[i].to, text: [""]}); if (split.length) makeChangeNoReadonly(doc, {from: split[0].from, to: split[0].to, text: change.text}, selUpdate); } else { makeChangeNoReadonly(doc, change, selUpdate); } } function makeChangeNoReadonly(doc, change, selUpdate) { if (change.text.length == 1 && change.text[0] == "" && posEq(change.from, change.to)) return; var selAfter = computeSelAfterChange(doc, change, selUpdate); addToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); var rebased = []; linkedDocs(doc, function(doc, sharedHist) { if (!sharedHist && indexOf(rebased, doc.history) == -1) { rebaseHist(doc.history, change); rebased.push(doc.history); } makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); }); } function makeChangeFromHistory(doc, type) { if (doc.cm && doc.cm.state.suppressEdits) return; var hist = doc.history; var event = (type == "undo" ? hist.done : hist.undone).pop(); if (!event) return; var anti = {changes: [], anchorBefore: event.anchorAfter, headBefore: event.headAfter, anchorAfter: event.anchorBefore, headAfter: event.headBefore, generation: hist.generation}; (type == "undo" ? hist.undone : hist.done).push(anti); hist.generation = event.generation || ++hist.maxGeneration; var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); for (var i = event.changes.length - 1; i >= 0; --i) { var change = event.changes[i]; change.origin = type; if (filter && !filterChange(doc, change, false)) { (type == "undo" ? hist.done : hist.undone).length = 0; return; } anti.changes.push(historyChangeFromChange(doc, change)); var after = i ? computeSelAfterChange(doc, change, null) : {anchor: event.anchorBefore, head: event.headBefore}; makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); var rebased = []; linkedDocs(doc, function(doc, sharedHist) { if (!sharedHist && indexOf(rebased, doc.history) == -1) { rebaseHist(doc.history, change); rebased.push(doc.history); } makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); }); } } function shiftDoc(doc, distance) { function shiftPos(pos) {return Pos(pos.line + distance, pos.ch);} doc.first += distance; if (doc.cm) regChange(doc.cm, doc.first, doc.first, distance); doc.sel.head = shiftPos(doc.sel.head); doc.sel.anchor = shiftPos(doc.sel.anchor); doc.sel.from = shiftPos(doc.sel.from); doc.sel.to = shiftPos(doc.sel.to); } function makeChangeSingleDoc(doc, change, selAfter, spans) { if (doc.cm && !doc.cm.curOp) return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans); if (change.to.line < doc.first) { shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); return; } if (change.from.line > doc.lastLine()) return; // Clip the change to the size of this doc if (change.from.line < doc.first) { var shift = change.text.length - 1 - (doc.first - change.from.line); shiftDoc(doc, shift); change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), text: [lst(change.text)], origin: change.origin}; } var last = doc.lastLine(); if (change.to.line > last) { change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), text: [change.text[0]], origin: change.origin}; } change.removed = getBetween(doc, change.from, change.to); if (!selAfter) selAfter = computeSelAfterChange(doc, change, null); if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans, selAfter); else updateDoc(doc, change, spans, selAfter); } function makeChangeSingleDocInEditor(cm, change, spans, selAfter) { var doc = cm.doc, display = cm.display, from = change.from, to = change.to; var recomputeMaxLength = false, checkWidthStart = from.line; if (!cm.options.lineWrapping) { checkWidthStart = lineNo(visualLine(doc, getLine(doc, from.line))); doc.iter(checkWidthStart, to.line + 1, function(line) { if (line == display.maxLine) { recomputeMaxLength = true; return true; } }); } if (!posLess(doc.sel.head, change.from) && !posLess(change.to, doc.sel.head)) cm.curOp.cursorActivity = true; updateDoc(doc, change, spans, selAfter, estimateHeight(cm)); if (!cm.options.lineWrapping) { doc.iter(checkWidthStart, from.line + change.text.length, function(line) { var len = lineLength(doc, line); if (len > display.maxLineLength) { display.maxLine = line; display.maxLineLength = len; display.maxLineChanged = true; recomputeMaxLength = false; } }); if (recomputeMaxLength) cm.curOp.updateMaxLine = true; } // Adjust frontier, schedule worker doc.frontier = Math.min(doc.frontier, from.line); startWorker(cm, 400); var lendiff = change.text.length - (to.line - from.line) - 1; // Remember that these lines changed, for updating the display regChange(cm, from.line, to.line + 1, lendiff); if (hasHandler(cm, "change")) { var changeObj = {from: from, to: to, text: change.text, removed: change.removed, origin: change.origin}; if (cm.curOp.textChanged) { for (var cur = cm.curOp.textChanged; cur.next; cur = cur.next) {} cur.next = changeObj; } else cm.curOp.textChanged = changeObj; } } function replaceRange(doc, code, from, to, origin) { if (!to) to = from; if (posLess(to, from)) { var tmp = to; to = from; from = tmp; } if (typeof code == "string") code = splitLines(code); makeChange(doc, {from: from, to: to, text: code, origin: origin}, null); } // POSITION OBJECT function Pos(line, ch) { if (!(this instanceof Pos)) return new Pos(line, ch); this.line = line; this.ch = ch; } CodeMirror.Pos = Pos; function posEq(a, b) {return a.line == b.line && a.ch == b.ch;} function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);} function cmp(a, b) {return a.line - b.line || a.ch - b.ch;} function copyPos(x) {return Pos(x.line, x.ch);} // SELECTION function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));} function clipPos(doc, pos) { if (pos.line < doc.first) return Pos(doc.first, 0); var last = doc.first + doc.size - 1; if (pos.line > last) return Pos(last, getLine(doc, last).text.length); return clipToLen(pos, getLine(doc, pos.line).text.length); } function clipToLen(pos, linelen) { var ch = pos.ch; if (ch == null || ch > linelen) return Pos(pos.line, linelen); else if (ch < 0) return Pos(pos.line, 0); else return pos; } function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;} // If shift is held, this will move the selection anchor. Otherwise, // it'll set the whole selection. function extendSelection(doc, pos, other, bias) { if (doc.sel.shift || doc.sel.extend) { var anchor = doc.sel.anchor; if (other) { var posBefore = posLess(pos, anchor); if (posBefore != posLess(other, anchor)) { anchor = pos; pos = other; } else if (posBefore != posLess(pos, other)) { pos = other; } } setSelection(doc, anchor, pos, bias); } else { setSelection(doc, pos, other || pos, bias); } if (doc.cm) doc.cm.curOp.userSelChange = true; } function filterSelectionChange(doc, anchor, head) { var obj = {anchor: anchor, head: head}; signal(doc, "beforeSelectionChange", doc, obj); if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj); obj.anchor = clipPos(doc, obj.anchor); obj.head = clipPos(doc, obj.head); return obj; } // Update the selection. Last two args are only used by // updateDoc, since they have to be expressed in the line // numbers before the update. function setSelection(doc, anchor, head, bias, checkAtomic) { if (!checkAtomic && hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) { var filtered = filterSelectionChange(doc, anchor, head); head = filtered.head; anchor = filtered.anchor; } var sel = doc.sel; sel.goalColumn = null; if (bias == null) bias = posLess(head, sel.head) ? -1 : 1; // Skip over atomic spans. if (checkAtomic || !posEq(anchor, sel.anchor)) anchor = skipAtomic(doc, anchor, bias, checkAtomic != "push"); if (checkAtomic || !posEq(head, sel.head)) head = skipAtomic(doc, head, bias, checkAtomic != "push"); if (posEq(sel.anchor, anchor) && posEq(sel.head, head)) return; sel.anchor = anchor; sel.head = head; var inv = posLess(head, anchor); sel.from = inv ? head : anchor; sel.to = inv ? anchor : head; if (doc.cm) doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = doc.cm.curOp.cursorActivity = true; signalLater(doc, "cursorActivity", doc); } function reCheckSelection(cm) { setSelection(cm.doc, cm.doc.sel.from, cm.doc.sel.to, null, "push"); } function skipAtomic(doc, pos, bias, mayClear) { var flipped = false, curPos = pos; var dir = bias || 1; doc.cantEdit = false; search: for (;;) { var line = getLine(doc, curPos.line); if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { var sp = line.markedSpans[i], m = sp.marker; if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) && (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) { if (mayClear) { signal(m, "beforeCursorEnter"); if (m.explicitlyCleared) { if (!line.markedSpans) break; else {--i; continue;} } } if (!m.atomic) continue; var newPos = m.find()[dir < 0 ? "from" : "to"]; if (posEq(newPos, curPos)) { newPos.ch += dir; if (newPos.ch < 0) { if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1)); else newPos = null; } else if (newPos.ch > line.text.length) { if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0); else newPos = null; } if (!newPos) { if (flipped) { // Driven in a corner -- no valid cursor position found at all // -- try again *with* clearing, if we didn't already if (!mayClear) return skipAtomic(doc, pos, bias, true); // Otherwise, turn off editing until further notice, and return the start of the doc doc.cantEdit = true; return Pos(doc.first, 0); } flipped = true; newPos = pos; dir = -dir; } } curPos = newPos; continue search; } } } return curPos; } } // SCROLLING function scrollCursorIntoView(cm) { var coords = scrollPosIntoView(cm, cm.doc.sel.head, null, cm.options.cursorScrollMargin); if (!cm.state.focused) return; var display = cm.display, box = getRect(display.sizer), doScroll = null; if (coords.top + box.top < 0) doScroll = true; else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; if (doScroll != null && !phantom) { var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " + (coords.top - display.viewOffset) + "px; height: " + (coords.bottom - coords.top + scrollerCutOff) + "px; left: " + coords.left + "px; width: 2px;"); cm.display.lineSpace.appendChild(scrollNode); scrollNode.scrollIntoView(doScroll); cm.display.lineSpace.removeChild(scrollNode); } } function scrollPosIntoView(cm, pos, end, margin) { if (margin == null) margin = 0; for (;;) { var changed = false, coords = cursorCoords(cm, pos); var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left), Math.min(coords.top, endCoords.top) - margin, Math.max(coords.left, endCoords.left), Math.max(coords.bottom, endCoords.bottom) + margin); var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; if (scrollPos.scrollTop != null) { setScrollTop(cm, scrollPos.scrollTop); if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true; } if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true; } if (!changed) return coords; } } function scrollIntoView(cm, x1, y1, x2, y2) { var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2); if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop); if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft); } function calculateScrollPos(cm, x1, y1, x2, y2) { var display = cm.display, snapMargin = textHeight(cm.display); if (y1 < 0) y1 = 0; var screen = display.scroller.clientHeight - scrollerCutOff, screentop = display.scroller.scrollTop, result = {}; var docBottom = cm.doc.height + paddingVert(display); var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin; if (y1 < screentop) { result.scrollTop = atTop ? 0 : y1; } else if (y2 > screentop + screen) { var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen); if (newTop != screentop) result.scrollTop = newTop; } var screenw = display.scroller.clientWidth - scrollerCutOff, screenleft = display.scroller.scrollLeft; x1 += display.gutters.offsetWidth; x2 += display.gutters.offsetWidth; var gutterw = display.gutters.offsetWidth; var atLeft = x1 < gutterw + 10; if (x1 < screenleft + gutterw || atLeft) { if (atLeft) x1 = 0; result.scrollLeft = Math.max(0, x1 - 10 - gutterw); } else if (x2 > screenw + screenleft - 3) { result.scrollLeft = x2 + 10 - screenw; } return result; } function updateScrollPos(cm, left, top) { cm.curOp.updateScrollPos = {scrollLeft: left == null ? cm.doc.scrollLeft : left, scrollTop: top == null ? cm.doc.scrollTop : top}; } function addToScrollPos(cm, left, top) { var pos = cm.curOp.updateScrollPos || (cm.curOp.updateScrollPos = {scrollLeft: cm.doc.scrollLeft, scrollTop: cm.doc.scrollTop}); var scroll = cm.display.scroller; pos.scrollTop = Math.max(0, Math.min(scroll.scrollHeight - scroll.clientHeight, pos.scrollTop + top)); pos.scrollLeft = Math.max(0, Math.min(scroll.scrollWidth - scroll.clientWidth, pos.scrollLeft + left)); } // API UTILITIES function indentLine(cm, n, how, aggressive) { var doc = cm.doc, state; if (how == null) how = "add"; if (how == "smart") { if (!cm.doc.mode.indent) how = "prev"; else state = getStateBefore(cm, n); } var tabSize = cm.options.tabSize; var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); if (line.stateAfter) line.stateAfter = null; var curSpaceString = line.text.match(/^\s*/)[0], indentation; if (!aggressive && !/\S/.test(line.text)) { indentation = 0; how = "not"; } else if (how == "smart") { indentation = cm.doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); if (indentation == Pass) { if (!aggressive) return; how = "prev"; } } if (how == "prev") { if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize); else indentation = 0; } else if (how == "add") { indentation = curSpace + cm.options.indentUnit; } else if (how == "subtract") { indentation = curSpace - cm.options.indentUnit; } else if (typeof how == "number") { indentation = curSpace + how; } indentation = Math.max(0, indentation); var indentString = "", pos = 0; if (cm.options.indentWithTabs) for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} if (pos < indentation) indentString += spaceStr(indentation - pos); if (indentString != curSpaceString) replaceRange(cm.doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); else if (doc.sel.head.line == n && doc.sel.head.ch < curSpaceString.length) setSelection(doc, Pos(n, curSpaceString.length), Pos(n, curSpaceString.length), 1); line.stateAfter = null; } function changeLine(cm, handle, op) { var no = handle, line = handle, doc = cm.doc; if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle)); else no = lineNo(handle); if (no == null) return null; if (op(line, no)) regChange(cm, no, no + 1); else return null; return line; } function findPosH(doc, pos, dir, unit, visually) { var line = pos.line, ch = pos.ch, origDir = dir; var lineObj = getLine(doc, line); var possible = true; function findNextLine() { var l = line + dir; if (l < doc.first || l >= doc.first + doc.size) return (possible = false); line = l; return lineObj = getLine(doc, l); } function moveOnce(boundToLine) { var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true); if (next == null) { if (!boundToLine && findNextLine()) { if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj); else ch = dir < 0 ? lineObj.text.length : 0; } else return (possible = false); } else ch = next; return true; } if (unit == "char") moveOnce(); else if (unit == "column") moveOnce(true); else if (unit == "word" || unit == "group") { var sawType = null, group = unit == "group"; for (var first = true;; first = false) { if (dir < 0 && !moveOnce(!first)) break; var cur = lineObj.text.charAt(ch) || "\n"; var type = isWordChar(cur) ? "w" : group && cur == "\n" ? "n" : !group || /\s/.test(cur) ? null : "p"; if (group && !first && !type) type = "s"; if (sawType && sawType != type) { if (dir < 0) {dir = 1; moveOnce();} break; } if (type) sawType = type; if (dir > 0 && !moveOnce(!first)) break; } } var result = skipAtomic(doc, Pos(line, ch), origDir, true); if (!possible) result.hitSide = true; return result; } function findPosV(cm, pos, dir, unit) { var doc = cm.doc, x = pos.left, y; if (unit == "page") { var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display)); } else if (unit == "line") { y = dir > 0 ? pos.bottom + 3 : pos.top - 3; } for (;;) { var target = coordsChar(cm, x, y); if (!target.outside) break; if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; } y += dir * 5; } return target; } function findWordAt(line, pos) { var start = pos.ch, end = pos.ch; if (line) { if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end; var startChar = line.charAt(start); var check = isWordChar(startChar) ? isWordChar : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);}; while (start > 0 && check(line.charAt(start - 1))) --start; while (end < line.length && check(line.charAt(end))) ++end; } return {from: Pos(pos.line, start), to: Pos(pos.line, end)}; } function selectLine(cm, line) { extendSelection(cm.doc, Pos(line, 0), clipPos(cm.doc, Pos(line + 1, 0))); } // PROTOTYPE // The publicly visible API. Note that operation(null, f) means // 'wrap f in an operation, performed on its `this` parameter' CodeMirror.prototype = { constructor: CodeMirror, focus: function(){window.focus(); focusInput(this); fastPoll(this);}, setOption: function(option, value) { var options = this.options, old = options[option]; if (options[option] == value && option != "mode") return; options[option] = value; if (optionHandlers.hasOwnProperty(option)) operation(this, optionHandlers[option])(this, value, old); }, getOption: function(option) {return this.options[option];}, getDoc: function() {return this.doc;}, addKeyMap: function(map, bottom) { this.state.keyMaps[bottom ? "push" : "unshift"](map); }, removeKeyMap: function(map) { var maps = this.state.keyMaps; for (var i = 0; i < maps.length; ++i) if (maps[i] == map || (typeof maps[i] != "string" && maps[i].name == map)) { maps.splice(i, 1); return true; } }, addOverlay: operation(null, function(spec, options) { var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); if (mode.startState) throw new Error("Overlays may not be stateful."); this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque}); this.state.modeGen++; regChange(this); }), removeOverlay: operation(null, function(spec) { var overlays = this.state.overlays; for (var i = 0; i < overlays.length; ++i) { var cur = overlays[i].modeSpec; if (cur == spec || typeof spec == "string" && cur.name == spec) { overlays.splice(i, 1); this.state.modeGen++; regChange(this); return; } } }), indentLine: operation(null, function(n, dir, aggressive) { if (typeof dir != "string" && typeof dir != "number") { if (dir == null) dir = this.options.smartIndent ? "smart" : "prev"; else dir = dir ? "add" : "subtract"; } if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive); }), indentSelection: operation(null, function(how) { var sel = this.doc.sel; if (posEq(sel.from, sel.to)) return indentLine(this, sel.from.line, how, true); var e = sel.to.line - (sel.to.ch ? 0 : 1); for (var i = sel.from.line; i <= e; ++i) indentLine(this, i, how); }), // Fetch the parser token for a given character. Useful for hacks // that want to inspect the mode state (say, for completion). getTokenAt: function(pos, precise) { var doc = this.doc; pos = clipPos(doc, pos); var state = getStateBefore(this, pos.line, precise), mode = this.doc.mode; var line = getLine(doc, pos.line); var stream = new StringStream(line.text, this.options.tabSize); while (stream.pos < pos.ch && !stream.eol()) { stream.start = stream.pos; var style = mode.token(stream, state); } return {start: stream.start, end: stream.pos, string: stream.current(), className: style || null, // Deprecated, use 'type' instead type: style || null, state: state}; }, getTokenTypeAt: function(pos) { pos = clipPos(this.doc, pos); var styles = getLineStyles(this, getLine(this.doc, pos.line)); var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; if (ch == 0) return styles[2]; for (;;) { var mid = (before + after) >> 1; if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid; else if (styles[mid * 2 + 1] < ch) before = mid + 1; else return styles[mid * 2 + 2]; } }, getModeAt: function(pos) { var mode = this.doc.mode; if (!mode.innerMode) return mode; return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode; }, getHelper: function(pos, type) { return this.getHelpers(pos, type)[0]; }, getHelpers: function(pos, type) { var found = []; if (!helpers.hasOwnProperty(type)) return helpers; var help = helpers[type], mode = this.getModeAt(pos); if (typeof mode[type] == "string") { if (help[mode[type]]) found.push(help[mode[type]]); } else if (mode[type]) { for (var i = 0; i < mode[type].length; i++) { var val = help[mode[type][i]]; if (val) found.push(val); } } else if (mode.helperType && help[mode.helperType]) { found.push(help[mode.helperType]); } else if (help[mode.name]) { found.push(help[mode.name]); } for (var i = 0; i < help._global.length; i++) { var cur = help._global[i]; if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) found.push(cur.val); } return found; }, getStateAfter: function(line, precise) { var doc = this.doc; line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); return getStateBefore(this, line + 1, precise); }, cursorCoords: function(start, mode) { var pos, sel = this.doc.sel; if (start == null) pos = sel.head; else if (typeof start == "object") pos = clipPos(this.doc, start); else pos = start ? sel.from : sel.to; return cursorCoords(this, pos, mode || "page"); }, charCoords: function(pos, mode) { return charCoords(this, clipPos(this.doc, pos), mode || "page"); }, coordsChar: function(coords, mode) { coords = fromCoordSystem(this, coords, mode || "page"); return coordsChar(this, coords.left, coords.top); }, lineAtHeight: function(height, mode) { height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; return lineAtHeight(this.doc, height + this.display.viewOffset); }, heightAtLine: function(line, mode) { var end = false, last = this.doc.first + this.doc.size - 1; if (line < this.doc.first) line = this.doc.first; else if (line > last) { line = last; end = true; } var lineObj = getLine(this.doc, line); return intoCoordSystem(this, getLine(this.doc, line), {top: 0, left: 0}, mode || "page").top + (end ? lineObj.height : 0); }, defaultTextHeight: function() { return textHeight(this.display); }, defaultCharWidth: function() { return charWidth(this.display); }, setGutterMarker: operation(null, function(line, gutterID, value) { return changeLine(this, line, function(line) { var markers = line.gutterMarkers || (line.gutterMarkers = {}); markers[gutterID] = value; if (!value && isEmpty(markers)) line.gutterMarkers = null; return true; }); }), clearGutter: operation(null, function(gutterID) { var cm = this, doc = cm.doc, i = doc.first; doc.iter(function(line) { if (line.gutterMarkers && line.gutterMarkers[gutterID]) { line.gutterMarkers[gutterID] = null; regChange(cm, i, i + 1); if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null; } ++i; }); }), addLineClass: operation(null, function(handle, where, cls) { return changeLine(this, handle, function(line) { var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; if (!line[prop]) line[prop] = cls; else if (new RegExp("(?:^|\\s)" + cls + "(?:$|\\s)").test(line[prop])) return false; else line[prop] += " " + cls; return true; }); }), removeLineClass: operation(null, function(handle, where, cls) { return changeLine(this, handle, function(line) { var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; var cur = line[prop]; if (!cur) return false; else if (cls == null) line[prop] = null; else { var found = cur.match(new RegExp("(?:^|\\s+)" + cls + "(?:$|\\s+)")); if (!found) return false; var end = found.index + found[0].length; line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; } return true; }); }), addLineWidget: operation(null, function(handle, node, options) { return addLineWidget(this, handle, node, options); }), removeLineWidget: function(widget) { widget.clear(); }, lineInfo: function(line) { if (typeof line == "number") { if (!isLine(this.doc, line)) return null; var n = line; line = getLine(this.doc, line); if (!line) return null; } else { var n = lineNo(line); if (n == null) return null; } return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, widgets: line.widgets}; }, getViewport: function() { return {from: this.display.showingFrom, to: this.display.showingTo};}, addWidget: function(pos, node, scroll, vert, horiz) { var display = this.display; pos = cursorCoords(this, clipPos(this.doc, pos)); var top = pos.bottom, left = pos.left; node.style.position = "absolute"; display.sizer.appendChild(node); if (vert == "over") { top = pos.top; } else if (vert == "above" || vert == "near") { var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); // Default to positioning above (if specified and possible); otherwise default to positioning below if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) top = pos.top - node.offsetHeight; else if (pos.bottom + node.offsetHeight <= vspace) top = pos.bottom; if (left + node.offsetWidth > hspace) left = hspace - node.offsetWidth; } node.style.top = top + "px"; node.style.left = node.style.right = ""; if (horiz == "right") { left = display.sizer.clientWidth - node.offsetWidth; node.style.right = "0px"; } else { if (horiz == "left") left = 0; else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2; node.style.left = left + "px"; } if (scroll) scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight); }, triggerOnKeyDown: operation(null, onKeyDown), triggerOnKeyPress: operation(null, onKeyPress), triggerOnKeyUp: operation(null, onKeyUp), execCommand: function(cmd) { if (commands.hasOwnProperty(cmd)) return commands[cmd](this); }, findPosH: function(from, amount, unit, visually) { var dir = 1; if (amount < 0) { dir = -1; amount = -amount; } for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) { cur = findPosH(this.doc, cur, dir, unit, visually); if (cur.hitSide) break; } return cur; }, moveH: operation(null, function(dir, unit) { var sel = this.doc.sel, pos; if (sel.shift || sel.extend || posEq(sel.from, sel.to)) pos = findPosH(this.doc, sel.head, dir, unit, this.options.rtlMoveVisually); else pos = dir < 0 ? sel.from : sel.to; extendSelection(this.doc, pos, pos, dir); }), deleteH: operation(null, function(dir, unit) { var sel = this.doc.sel; if (!posEq(sel.from, sel.to)) replaceRange(this.doc, "", sel.from, sel.to, "+delete"); else replaceRange(this.doc, "", sel.from, findPosH(this.doc, sel.head, dir, unit, false), "+delete"); this.curOp.userSelChange = true; }), findPosV: function(from, amount, unit, goalColumn) { var dir = 1, x = goalColumn; if (amount < 0) { dir = -1; amount = -amount; } for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) { var coords = cursorCoords(this, cur, "div"); if (x == null) x = coords.left; else coords.left = x; cur = findPosV(this, coords, dir, unit); if (cur.hitSide) break; } return cur; }, moveV: operation(null, function(dir, unit) { var sel = this.doc.sel, target, goal; if (sel.shift || sel.extend || posEq(sel.from, sel.to)) { var pos = cursorCoords(this, sel.head, "div"); if (sel.goalColumn != null) pos.left = sel.goalColumn; target = findPosV(this, pos, dir, unit); if (unit == "page") addToScrollPos(this, 0, charCoords(this, target, "div").top - pos.top); goal = pos.left; } else { target = dir < 0 ? sel.from : sel.to; } extendSelection(this.doc, target, target, dir); if (goal != null) sel.goalColumn = goal; }), toggleOverwrite: function(value) { if (value != null && value == this.state.overwrite) return; if (this.state.overwrite = !this.state.overwrite) this.display.cursor.className += " CodeMirror-overwrite"; else this.display.cursor.className = this.display.cursor.className.replace(" CodeMirror-overwrite", ""); signal(this, "overwriteToggle", this, this.state.overwrite); }, hasFocus: function() { return document.activeElement == this.display.input; }, scrollTo: operation(null, function(x, y) { updateScrollPos(this, x, y); }), getScrollInfo: function() { var scroller = this.display.scroller, co = scrollerCutOff; return {left: scroller.scrollLeft, top: scroller.scrollTop, height: scroller.scrollHeight - co, width: scroller.scrollWidth - co, clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co}; }, scrollIntoView: operation(null, function(range, margin) { if (range == null) range = {from: this.doc.sel.head, to: null}; else if (typeof range == "number") range = {from: Pos(range, 0), to: null}; else if (range.from == null) range = {from: range, to: null}; if (!range.to) range.to = range.from; if (!margin) margin = 0; var coords = range; if (range.from.line != null) { this.curOp.scrollToPos = {from: range.from, to: range.to, margin: margin}; coords = {from: cursorCoords(this, range.from), to: cursorCoords(this, range.to)}; } var sPos = calculateScrollPos(this, Math.min(coords.from.left, coords.to.left), Math.min(coords.from.top, coords.to.top) - margin, Math.max(coords.from.right, coords.to.right), Math.max(coords.from.bottom, coords.to.bottom) + margin); updateScrollPos(this, sPos.scrollLeft, sPos.scrollTop); }), setSize: operation(null, function(width, height) { function interpret(val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; } if (width != null) this.display.wrapper.style.width = interpret(width); if (height != null) this.display.wrapper.style.height = interpret(height); if (this.options.lineWrapping) this.display.measureLineCache.length = this.display.measureLineCachePos = 0; this.curOp.forceUpdate = true; signal(this, "refresh", this); }), operation: function(f){return runInOp(this, f);}, refresh: operation(null, function() { var oldHeight = this.display.cachedTextHeight; clearCaches(this); updateScrollPos(this, this.doc.scrollLeft, this.doc.scrollTop); regChange(this); if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5) estimateLineHeights(this); signal(this, "refresh", this); }), swapDoc: operation(null, function(doc) { var old = this.doc; old.cm = null; attachDoc(this, doc); clearCaches(this); resetInput(this, true); updateScrollPos(this, doc.scrollLeft, doc.scrollTop); signalLater(this, "swapDoc", this, old); return old; }), getInputField: function(){return this.display.input;}, getWrapperElement: function(){return this.display.wrapper;}, getScrollerElement: function(){return this.display.scroller;}, getGutterElement: function(){return this.display.gutters;} }; eventMixin(CodeMirror); // OPTION DEFAULTS var optionHandlers = CodeMirror.optionHandlers = {}; // The default configuration options. var defaults = CodeMirror.defaults = {}; function option(name, deflt, handle, notOnInit) { CodeMirror.defaults[name] = deflt; if (handle) optionHandlers[name] = notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle; } var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}}; // These two are, on init, called from the constructor because they // have to be initialized before the editor can start at all. option("value", "", function(cm, val) { cm.setValue(val); }, true); option("mode", null, function(cm, val) { cm.doc.modeOption = val; loadMode(cm); }, true); option("indentUnit", 2, loadMode, true); option("indentWithTabs", false); option("smartIndent", true); option("tabSize", 4, function(cm) { resetModeState(cm); clearCaches(cm); regChange(cm); }, true); option("specialChars", /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\ufeff]/g, function(cm, val) { cm.options.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); cm.refresh(); }, true); option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true); option("electricChars", true); option("rtlMoveVisually", !windows); option("wholeLineUpdateBefore", true); option("theme", "default", function(cm) { themeChanged(cm); guttersChanged(cm); }, true); option("keyMap", "default", keyMapChanged); option("extraKeys", null); option("onKeyEvent", null); option("onDragEvent", null); option("lineWrapping", false, wrappingChanged, true); option("gutters", [], function(cm) { setGuttersForLineNumbers(cm.options); guttersChanged(cm); }, true); option("fixedGutter", true, function(cm, val) { cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; cm.refresh(); }, true); option("coverGutterNextToScrollbar", false, updateScrollbars, true); option("lineNumbers", false, function(cm) { setGuttersForLineNumbers(cm.options); guttersChanged(cm); }, true); option("firstLineNumber", 1, guttersChanged, true); option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true); option("showCursorWhenSelecting", false, updateSelection, true); option("resetSelectionOnContextMenu", true); option("readOnly", false, function(cm, val) { if (val == "nocursor") { onBlur(cm); cm.display.input.blur(); cm.display.disabled = true; } else { cm.display.disabled = false; if (!val) resetInput(cm, true); } }); option("disableInput", false, function(cm, val) {if (!val) resetInput(cm, true);}, true); option("dragDrop", true); option("cursorBlinkRate", 530); option("cursorScrollMargin", 0); option("cursorHeight", 1); option("workTime", 100); option("workDelay", 100); option("flattenSpans", true, resetModeState, true); option("addModeClass", false, resetModeState, true); option("pollInterval", 100); option("undoDepth", 40, function(cm, val){cm.doc.history.undoDepth = val;}); option("historyEventDelay", 500); option("viewportMargin", 10, function(cm){cm.refresh();}, true); option("maxHighlightLength", 10000, resetModeState, true); option("crudeMeasuringFrom", 10000); option("moveInputWithCursor", true, function(cm, val) { if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0; }); option("tabindex", null, function(cm, val) { cm.display.input.tabIndex = val || ""; }); option("autofocus", null); // MODE DEFINITION AND QUERYING // Known modes, by name and by MIME var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; CodeMirror.defineMode = function(name, mode) { if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name; if (arguments.length > 2) { mode.dependencies = []; for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]); } modes[name] = mode; }; CodeMirror.defineMIME = function(mime, spec) { mimeModes[mime] = spec; }; CodeMirror.resolveMode = function(spec) { if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { spec = mimeModes[spec]; } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { var found = mimeModes[spec.name]; if (typeof found == "string") found = {name: found}; spec = createObj(found, spec); spec.name = found.name; } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { return CodeMirror.resolveMode("application/xml"); } if (typeof spec == "string") return {name: spec}; else return spec || {name: "null"}; }; CodeMirror.getMode = function(options, spec) { var spec = CodeMirror.resolveMode(spec); var mfactory = modes[spec.name]; if (!mfactory) return CodeMirror.getMode(options, "text/plain"); var modeObj = mfactory(options, spec); if (modeExtensions.hasOwnProperty(spec.name)) { var exts = modeExtensions[spec.name]; for (var prop in exts) { if (!exts.hasOwnProperty(prop)) continue; if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop]; modeObj[prop] = exts[prop]; } } modeObj.name = spec.name; if (spec.helperType) modeObj.helperType = spec.helperType; if (spec.modeProps) for (var prop in spec.modeProps) modeObj[prop] = spec.modeProps[prop]; return modeObj; }; CodeMirror.defineMode("null", function() { return {token: function(stream) {stream.skipToEnd();}}; }); CodeMirror.defineMIME("text/plain", "null"); var modeExtensions = CodeMirror.modeExtensions = {}; CodeMirror.extendMode = function(mode, properties) { var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); copyObj(properties, exts); }; // EXTENSIONS CodeMirror.defineExtension = function(name, func) { CodeMirror.prototype[name] = func; }; CodeMirror.defineDocExtension = function(name, func) { Doc.prototype[name] = func; }; CodeMirror.defineOption = option; var initHooks = []; CodeMirror.defineInitHook = function(f) {initHooks.push(f);}; var helpers = CodeMirror.helpers = {}; CodeMirror.registerHelper = function(type, name, value) { if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []}; helpers[type][name] = value; }; CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { CodeMirror.registerHelper(type, name, value); helpers[type]._global.push({pred: predicate, val: value}); }; // UTILITIES CodeMirror.isWordChar = isWordChar; // MODE STATE HANDLING // Utility functions for working with state. Exported because modes // sometimes need to do this. function copyState(mode, state) { if (state === true) return state; if (mode.copyState) return mode.copyState(state); var nstate = {}; for (var n in state) { var val = state[n]; if (val instanceof Array) val = val.concat([]); nstate[n] = val; } return nstate; } CodeMirror.copyState = copyState; function startState(mode, a1, a2) { return mode.startState ? mode.startState(a1, a2) : true; } CodeMirror.startState = startState; CodeMirror.innerMode = function(mode, state) { while (mode.innerMode) { var info = mode.innerMode(state); if (!info || info.mode == mode) break; state = info.state; mode = info.mode; } return info || {mode: mode, state: state}; }; // STANDARD COMMANDS var commands = CodeMirror.commands = { selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()));}, killLine: function(cm) { var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to); if (!sel && cm.getLine(from.line).length == from.ch) cm.replaceRange("", from, Pos(from.line + 1, 0), "+delete"); else cm.replaceRange("", from, sel ? to : Pos(from.line), "+delete"); }, deleteLine: function(cm) { var l = cm.getCursor().line; cm.replaceRange("", Pos(l, 0), Pos(l + 1, 0), "+delete"); }, delLineLeft: function(cm) { var cur = cm.getCursor(); cm.replaceRange("", Pos(cur.line, 0), cur, "+delete"); }, undo: function(cm) {cm.undo();}, redo: function(cm) {cm.redo();}, goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));}, goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));}, goLineStart: function(cm) { cm.extendSelection(lineStart(cm, cm.getCursor().line)); }, goLineStartSmart: function(cm) { var cur = cm.getCursor(), start = lineStart(cm, cur.line); var line = cm.getLineHandle(start.line); var order = getOrder(line); if (!order || order[0].level == 0) { var firstNonWS = Math.max(0, line.text.search(/\S/)); var inWS = cur.line == start.line && cur.ch <= firstNonWS && cur.ch; cm.extendSelection(Pos(start.line, inWS ? 0 : firstNonWS)); } else cm.extendSelection(start); }, goLineEnd: function(cm) { cm.extendSelection(lineEnd(cm, cm.getCursor().line)); }, goLineRight: function(cm) { var top = cm.charCoords(cm.getCursor(), "div").top + 5; cm.extendSelection(cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div")); }, goLineLeft: function(cm) { var top = cm.charCoords(cm.getCursor(), "div").top + 5; cm.extendSelection(cm.coordsChar({left: 0, top: top}, "div")); }, goLineUp: function(cm) {cm.moveV(-1, "line");}, goLineDown: function(cm) {cm.moveV(1, "line");}, goPageUp: function(cm) {cm.moveV(-1, "page");}, goPageDown: function(cm) {cm.moveV(1, "page");}, goCharLeft: function(cm) {cm.moveH(-1, "char");}, goCharRight: function(cm) {cm.moveH(1, "char");}, goColumnLeft: function(cm) {cm.moveH(-1, "column");}, goColumnRight: function(cm) {cm.moveH(1, "column");}, goWordLeft: function(cm) {cm.moveH(-1, "word");}, goGroupRight: function(cm) {cm.moveH(1, "group");}, goGroupLeft: function(cm) {cm.moveH(-1, "group");}, goWordRight: function(cm) {cm.moveH(1, "word");}, delCharBefore: function(cm) {cm.deleteH(-1, "char");}, delCharAfter: function(cm) {cm.deleteH(1, "char");}, delWordBefore: function(cm) {cm.deleteH(-1, "word");}, delWordAfter: function(cm) {cm.deleteH(1, "word");}, delGroupBefore: function(cm) {cm.deleteH(-1, "group");}, delGroupAfter: function(cm) {cm.deleteH(1, "group");}, indentAuto: function(cm) {cm.indentSelection("smart");}, indentMore: function(cm) {cm.indentSelection("add");}, indentLess: function(cm) {cm.indentSelection("subtract");}, insertTab: function(cm) { cm.replaceSelection("\t", "end", "+input"); }, defaultTab: function(cm) { if (cm.somethingSelected()) cm.indentSelection("add"); else cm.replaceSelection("\t", "end", "+input"); }, transposeChars: function(cm) { var cur = cm.getCursor(), line = cm.getLine(cur.line); if (cur.ch > 0 && cur.ch < line.length - 1) cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1), Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1)); }, newlineAndIndent: function(cm) { operation(cm, function() { cm.replaceSelection("\n", "end", "+input"); cm.indentLine(cm.getCursor().line, null, true); })(); }, toggleOverwrite: function(cm) {cm.toggleOverwrite();} }; // STANDARD KEYMAPS var keyMap = CodeMirror.keyMap = {}; keyMap.basic = { "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", "Tab": "defaultTab", "Shift-Tab": "indentAuto", "Enter": "newlineAndIndent", "Insert": "toggleOverwrite" }; // Note that the save and find-related commands aren't defined by // default. Unknown commands are simply ignored. keyMap.pcDefault = { "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", "Ctrl-Home": "goDocStart", "Ctrl-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd", "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", fallthrough: "basic" }; keyMap.macDefault = { "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", "Alt-Right": "goGroupRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delGroupBefore", "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delLineLeft", fallthrough: ["basic", "emacsy"] }; keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; keyMap.emacsy = { "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars" }; // KEYMAP DISPATCH function getKeyMap(val) { if (typeof val == "string") return keyMap[val]; else return val; } function lookupKey(name, maps, handle) { function lookup(map) { map = getKeyMap(map); var found = map[name]; if (found === false) return "stop"; if (found != null && handle(found)) return true; if (map.nofallthrough) return "stop"; var fallthrough = map.fallthrough; if (fallthrough == null) return false; if (Object.prototype.toString.call(fallthrough) != "[object Array]") return lookup(fallthrough); for (var i = 0, e = fallthrough.length; i < e; ++i) { var done = lookup(fallthrough[i]); if (done) return done; } return false; } for (var i = 0; i < maps.length; ++i) { var done = lookup(maps[i]); if (done) return done != "stop"; } } function isModifierKey(event) { var name = keyNames[event.keyCode]; return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; } function keyName(event, noShift) { if (opera && event.keyCode == 34 && event["char"]) return false; var name = keyNames[event.keyCode]; if (name == null || event.altGraphKey) return false; if (event.altKey) name = "Alt-" + name; if (flipCtrlCmd ? event.metaKey : event.ctrlKey) name = "Ctrl-" + name; if (flipCtrlCmd ? event.ctrlKey : event.metaKey) name = "Cmd-" + name; if (!noShift && event.shiftKey) name = "Shift-" + name; return name; } CodeMirror.lookupKey = lookupKey; CodeMirror.isModifierKey = isModifierKey; CodeMirror.keyName = keyName; // FROMTEXTAREA CodeMirror.fromTextArea = function(textarea, options) { if (!options) options = {}; options.value = textarea.value; if (!options.tabindex && textarea.tabindex) options.tabindex = textarea.tabindex; if (!options.placeholder && textarea.placeholder) options.placeholder = textarea.placeholder; // Set autofocus to true if this textarea is focused, or if it has // autofocus and no other element is focused. if (options.autofocus == null) { var hasFocus = document.body; // doc.activeElement occasionally throws on IE try { hasFocus = document.activeElement; } catch(e) {} options.autofocus = hasFocus == textarea || textarea.getAttribute("autofocus") != null && hasFocus == document.body; } function save() {textarea.value = cm.getValue();} if (textarea.form) { on(textarea.form, "submit", save); // Deplorable hack to make the submit method do the right thing. if (!options.leaveSubmitMethodAlone) { var form = textarea.form, realSubmit = form.submit; try { var wrappedSubmit = form.submit = function() { save(); form.submit = realSubmit; form.submit(); form.submit = wrappedSubmit; }; } catch(e) {} } } textarea.style.display = "none"; var cm = CodeMirror(function(node) { textarea.parentNode.insertBefore(node, textarea.nextSibling); }, options); cm.save = save; cm.getTextArea = function() { return textarea; }; cm.toTextArea = function() { save(); textarea.parentNode.removeChild(cm.getWrapperElement()); textarea.style.display = ""; if (textarea.form) { off(textarea.form, "submit", save); if (typeof textarea.form.submit == "function") textarea.form.submit = realSubmit; } }; return cm; }; // STRING STREAM // Fed to the mode parsers, provides helper functions to make // parsers more succinct. // The character stream used by a mode's parser. function StringStream(string, tabSize) { this.pos = this.start = 0; this.string = string; this.tabSize = tabSize || 8; this.lastColumnPos = this.lastColumnValue = 0; this.lineStart = 0; } StringStream.prototype = { eol: function() {return this.pos >= this.string.length;}, sol: function() {return this.pos == this.lineStart;}, peek: function() {return this.string.charAt(this.pos) || undefined;}, next: function() { if (this.pos < this.string.length) return this.string.charAt(this.pos++); }, eat: function(match) { var ch = this.string.charAt(this.pos); if (typeof match == "string") var ok = ch == match; else var ok = ch && (match.test ? match.test(ch) : match(ch)); if (ok) {++this.pos; return ch;} }, eatWhile: function(match) { var start = this.pos; while (this.eat(match)){} return this.pos > start; }, eatSpace: function() { var start = this.pos; while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; return this.pos > start; }, skipToEnd: function() {this.pos = this.string.length;}, skipTo: function(ch) { var found = this.string.indexOf(ch, this.pos); if (found > -1) {this.pos = found; return true;} }, backUp: function(n) {this.pos -= n;}, column: function() { if (this.lastColumnPos < this.start) { this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); this.lastColumnPos = this.start; } return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); }, indentation: function() { return countColumn(this.string, null, this.tabSize) - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); }, match: function(pattern, consume, caseInsensitive) { if (typeof pattern == "string") { var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; var substr = this.string.substr(this.pos, pattern.length); if (cased(substr) == cased(pattern)) { if (consume !== false) this.pos += pattern.length; return true; } } else { var match = this.string.slice(this.pos).match(pattern); if (match && match.index > 0) return null; if (match && consume !== false) this.pos += match[0].length; return match; } }, current: function(){return this.string.slice(this.start, this.pos);}, hideFirstChars: function(n, inner) { this.lineStart += n; try { return inner(); } finally { this.lineStart -= n; } } }; CodeMirror.StringStream = StringStream; // TEXTMARKERS function TextMarker(doc, type) { this.lines = []; this.type = type; this.doc = doc; } CodeMirror.TextMarker = TextMarker; eventMixin(TextMarker); TextMarker.prototype.clear = function() { if (this.explicitlyCleared) return; var cm = this.doc.cm, withOp = cm && !cm.curOp; if (withOp) startOperation(cm); if (hasHandler(this, "clear")) { var found = this.find(); if (found) signalLater(this, "clear", found.from, found.to); } var min = null, max = null; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; var span = getMarkedSpanFor(line.markedSpans, this); if (span.to != null) max = lineNo(line); line.markedSpans = removeMarkedSpan(line.markedSpans, span); if (span.from != null) min = lineNo(line); else if (this.collapsed && !lineIsHidden(this.doc, line) && cm) updateLineHeight(line, textHeight(cm.display)); } if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) { var visual = visualLine(cm.doc, this.lines[i]), len = lineLength(cm.doc, visual); if (len > cm.display.maxLineLength) { cm.display.maxLine = visual; cm.display.maxLineLength = len; cm.display.maxLineChanged = true; } } if (min != null && cm) regChange(cm, min, max + 1); this.lines.length = 0; this.explicitlyCleared = true; if (this.atomic && this.doc.cantEdit) { this.doc.cantEdit = false; if (cm) reCheckSelection(cm); } if (withOp) endOperation(cm); }; TextMarker.prototype.find = function(bothSides) { var from, to; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; var span = getMarkedSpanFor(line.markedSpans, this); if (span.from != null || span.to != null) { var found = lineNo(line); if (span.from != null) from = Pos(found, span.from); if (span.to != null) to = Pos(found, span.to); } } if (this.type == "bookmark" && !bothSides) return from; return from && {from: from, to: to}; }; TextMarker.prototype.changed = function() { var pos = this.find(), cm = this.doc.cm; if (!pos || !cm) return; if (this.type != "bookmark") pos = pos.from; var line = getLine(this.doc, pos.line); clearCachedMeasurement(cm, line); if (pos.line >= cm.display.showingFrom && pos.line < cm.display.showingTo) { for (var node = cm.display.lineDiv.firstChild; node; node = node.nextSibling) if (node.lineObj == line) { if (node.offsetHeight != line.height) updateLineHeight(line, node.offsetHeight); break; } runInOp(cm, function() { cm.curOp.selectionChanged = cm.curOp.forceUpdate = cm.curOp.updateMaxLine = true; }); } }; TextMarker.prototype.attachLine = function(line) { if (!this.lines.length && this.doc.cm) { var op = this.doc.cm.curOp; if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } this.lines.push(line); }; TextMarker.prototype.detachLine = function(line) { this.lines.splice(indexOf(this.lines, line), 1); if (!this.lines.length && this.doc.cm) { var op = this.doc.cm.curOp; (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); } }; var nextMarkerId = 0; function markText(doc, from, to, options, type) { if (options && options.shared) return markTextShared(doc, from, to, options, type); if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type); var marker = new TextMarker(doc, type); if (options) copyObj(options, marker); if (posLess(to, from) || posEq(from, to) && marker.clearWhenEmpty !== false) return marker; if (marker.replacedWith) { marker.collapsed = true; marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget"); if (!options.handleMouseEvents) marker.replacedWith.ignoreEvents = true; } if (marker.collapsed) { if (conflictingCollapsedRange(doc, from.line, from, to, marker) || from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) throw new Error("Inserting collapsed marker partially overlapping an existing one"); sawCollapsedSpans = true; } if (marker.addToHistory) addToHistory(doc, {from: from, to: to, origin: "markText"}, {head: doc.sel.head, anchor: doc.sel.anchor}, NaN); var curLine = from.line, cm = doc.cm, updateMaxLine; doc.iter(curLine, to.line + 1, function(line) { if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(doc, line) == cm.display.maxLine) updateMaxLine = true; var span = {from: null, to: null, marker: marker}; if (curLine == from.line) span.from = from.ch; if (curLine == to.line) span.to = to.ch; if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0); addMarkedSpan(line, span); ++curLine; }); if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) { if (lineIsHidden(doc, line)) updateLineHeight(line, 0); }); if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); }); if (marker.readOnly) { sawReadOnlySpans = true; if (doc.history.done.length || doc.history.undone.length) doc.clearHistory(); } if (marker.collapsed) { marker.id = ++nextMarkerId; marker.atomic = true; } if (cm) { if (updateMaxLine) cm.curOp.updateMaxLine = true; if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.collapsed) regChange(cm, from.line, to.line + 1); if (marker.atomic) reCheckSelection(cm); } return marker; } // SHARED TEXTMARKERS function SharedTextMarker(markers, primary) { this.markers = markers; this.primary = primary; for (var i = 0, me = this; i < markers.length; ++i) { markers[i].parent = this; on(markers[i], "clear", function(){me.clear();}); } } CodeMirror.SharedTextMarker = SharedTextMarker; eventMixin(SharedTextMarker); SharedTextMarker.prototype.clear = function() { if (this.explicitlyCleared) return; this.explicitlyCleared = true; for (var i = 0; i < this.markers.length; ++i) this.markers[i].clear(); signalLater(this, "clear"); }; SharedTextMarker.prototype.find = function() { return this.primary.find(); }; function markTextShared(doc, from, to, options, type) { options = copyObj(options); options.shared = false; var markers = [markText(doc, from, to, options, type)], primary = markers[0]; var widget = options.replacedWith; linkedDocs(doc, function(doc) { if (widget) options.replacedWith = widget.cloneNode(true); markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); for (var i = 0; i < doc.linked.length; ++i) if (doc.linked[i].isParent) return; primary = lst(markers); }); return new SharedTextMarker(markers, primary); } // TEXTMARKER SPANS function getMarkedSpanFor(spans, marker) { if (spans) for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if (span.marker == marker) return span; } } function removeMarkedSpan(spans, span) { for (var r, i = 0; i < spans.length; ++i) if (spans[i] != span) (r || (r = [])).push(spans[i]); return r; } function addMarkedSpan(line, span) { line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; span.marker.attachLine(line); } function markedSpansBefore(old, startCh, isInsert) { if (old) for (var i = 0, nw; i < old.length; ++i) { var span = old[i], marker = span.marker; var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); (nw || (nw = [])).push({from: span.from, to: endsAfter ? null : span.to, marker: marker}); } } return nw; } function markedSpansAfter(old, endCh, isInsert) { if (old) for (var i = 0, nw; i < old.length; ++i) { var span = old[i], marker = span.marker; var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh, to: span.to == null ? null : span.to - endCh, marker: marker}); } } return nw; } function stretchSpansOverChange(doc, change) { var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; if (!oldFirst && !oldLast) return null; var startCh = change.from.ch, endCh = change.to.ch, isInsert = posEq(change.from, change.to); // Get the spans that 'stick out' on both sides var first = markedSpansBefore(oldFirst, startCh, isInsert); var last = markedSpansAfter(oldLast, endCh, isInsert); // Next, merge those two ends var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); if (first) { // Fix up .to properties of first for (var i = 0; i < first.length; ++i) { var span = first[i]; if (span.to == null) { var found = getMarkedSpanFor(last, span.marker); if (!found) span.to = startCh; else if (sameLine) span.to = found.to == null ? null : found.to + offset; } } } if (last) { // Fix up .from in last (or move them into first in case of sameLine) for (var i = 0; i < last.length; ++i) { var span = last[i]; if (span.to != null) span.to += offset; if (span.from == null) { var found = getMarkedSpanFor(first, span.marker); if (!found) { span.from = offset; if (sameLine) (first || (first = [])).push(span); } } else { span.from += offset; if (sameLine) (first || (first = [])).push(span); } } } // Make sure we didn't create any zero-length spans if (first) first = clearEmptySpans(first); if (last && last != first) last = clearEmptySpans(last); var newMarkers = [first]; if (!sameLine) { // Fill gap with whole-line-spans var gap = change.text.length - 2, gapMarkers; if (gap > 0 && first) for (var i = 0; i < first.length; ++i) if (first[i].to == null) (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker}); for (var i = 0; i < gap; ++i) newMarkers.push(gapMarkers); newMarkers.push(last); } return newMarkers; } function clearEmptySpans(spans) { for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) spans.splice(i--, 1); } if (!spans.length) return null; return spans; } function mergeOldSpans(doc, change) { var old = getOldSpans(doc, change); var stretched = stretchSpansOverChange(doc, change); if (!old) return stretched; if (!stretched) return old; for (var i = 0; i < old.length; ++i) { var oldCur = old[i], stretchCur = stretched[i]; if (oldCur && stretchCur) { spans: for (var j = 0; j < stretchCur.length; ++j) { var span = stretchCur[j]; for (var k = 0; k < oldCur.length; ++k) if (oldCur[k].marker == span.marker) continue spans; oldCur.push(span); } } else if (stretchCur) { old[i] = stretchCur; } } return old; } function removeReadOnlyRanges(doc, from, to) { var markers = null; doc.iter(from.line, to.line + 1, function(line) { if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) { var mark = line.markedSpans[i].marker; if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) (markers || (markers = [])).push(mark); } }); if (!markers) return null; var parts = [{from: from, to: to}]; for (var i = 0; i < markers.length; ++i) { var mk = markers[i], m = mk.find(); for (var j = 0; j < parts.length; ++j) { var p = parts[j]; if (posLess(p.to, m.from) || posLess(m.to, p.from)) continue; var newParts = [j, 1]; if (posLess(p.from, m.from) || !mk.inclusiveLeft && posEq(p.from, m.from)) newParts.push({from: p.from, to: m.from}); if (posLess(m.to, p.to) || !mk.inclusiveRight && posEq(p.to, m.to)) newParts.push({from: m.to, to: p.to}); parts.splice.apply(parts, newParts); j += newParts.length - 1; } } return parts; } function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; } function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; } function compareCollapsedMarkers(a, b) { var lenDiff = a.lines.length - b.lines.length; if (lenDiff != 0) return lenDiff; var aPos = a.find(), bPos = b.find(); var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); if (fromCmp) return -fromCmp; var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); if (toCmp) return toCmp; return b.id - a.id; } function collapsedSpanAtSide(line, start) { var sps = sawCollapsedSpans && line.markedSpans, found; if (sps) for (var sp, i = 0; i < sps.length; ++i) { sp = sps[i]; if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) found = sp.marker; } return found; } function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); } function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); } function conflictingCollapsedRange(doc, lineNo, from, to, marker) { var line = getLine(doc, lineNo); var sps = sawCollapsedSpans && line.markedSpans; if (sps) for (var i = 0; i < sps.length; ++i) { var sp = sps[i]; if (!sp.marker.collapsed) continue; var found = sp.marker.find(true); var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue; if (fromCmp <= 0 && (cmp(found.to, from) || extraRight(sp.marker) - extraLeft(marker)) > 0 || fromCmp >= 0 && (cmp(found.from, to) || extraLeft(sp.marker) - extraRight(marker)) < 0) return true; } } function visualLine(doc, line) { var merged; while (merged = collapsedSpanAtStart(line)) line = getLine(doc, merged.find().from.line); return line; } function lineIsHidden(doc, line) { var sps = sawCollapsedSpans && line.markedSpans; if (sps) for (var sp, i = 0; i < sps.length; ++i) { sp = sps[i]; if (!sp.marker.collapsed) continue; if (sp.from == null) return true; if (sp.marker.replacedWith) continue; if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) return true; } } function lineIsHiddenInner(doc, line, span) { if (span.to == null) { var end = span.marker.find().to, endLine = getLine(doc, end.line); return lineIsHiddenInner(doc, endLine, getMarkedSpanFor(endLine.markedSpans, span.marker)); } if (span.marker.inclusiveRight && span.to == line.text.length) return true; for (var sp, i = 0; i < line.markedSpans.length; ++i) { sp = line.markedSpans[i]; if (sp.marker.collapsed && !sp.marker.replacedWith && sp.from == span.to && (sp.to == null || sp.to != span.from) && (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && lineIsHiddenInner(doc, line, sp)) return true; } } function detachMarkedSpans(line) { var spans = line.markedSpans; if (!spans) return; for (var i = 0; i < spans.length; ++i) spans[i].marker.detachLine(line); line.markedSpans = null; } function attachMarkedSpans(line, spans) { if (!spans) return; for (var i = 0; i < spans.length; ++i) spans[i].marker.attachLine(line); line.markedSpans = spans; } // LINE WIDGETS var LineWidget = CodeMirror.LineWidget = function(cm, node, options) { if (options) for (var opt in options) if (options.hasOwnProperty(opt)) this[opt] = options[opt]; this.cm = cm; this.node = node; }; eventMixin(LineWidget); function widgetOperation(f) { return function() { var withOp = !this.cm.curOp; if (withOp) startOperation(this.cm); try {var result = f.apply(this, arguments);} finally {if (withOp) endOperation(this.cm);} return result; }; } LineWidget.prototype.clear = widgetOperation(function() { var ws = this.line.widgets, no = lineNo(this.line); if (no == null || !ws) return; for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1); if (!ws.length) this.line.widgets = null; var aboveVisible = heightAtLine(this.cm, this.line) < this.cm.doc.scrollTop; updateLineHeight(this.line, Math.max(0, this.line.height - widgetHeight(this))); if (aboveVisible) addToScrollPos(this.cm, 0, -this.height); regChange(this.cm, no, no + 1); }); LineWidget.prototype.changed = widgetOperation(function() { var oldH = this.height; this.height = null; var diff = widgetHeight(this) - oldH; if (!diff) return; updateLineHeight(this.line, this.line.height + diff); var no = lineNo(this.line); regChange(this.cm, no, no + 1); }); function widgetHeight(widget) { if (widget.height != null) return widget.height; if (!widget.node.parentNode || widget.node.parentNode.nodeType != 1) removeChildrenAndAdd(widget.cm.display.measure, elt("div", [widget.node], null, "position: relative")); return widget.height = widget.node.offsetHeight; } function addLineWidget(cm, handle, node, options) { var widget = new LineWidget(cm, node, options); if (widget.noHScroll) cm.display.alignWidgets = true; changeLine(cm, handle, function(line) { var widgets = line.widgets || (line.widgets = []); if (widget.insertAt == null) widgets.push(widget); else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); widget.line = line; if (!lineIsHidden(cm.doc, line) || widget.showIfHidden) { var aboveVisible = heightAtLine(cm, line) < cm.doc.scrollTop; updateLineHeight(line, line.height + widgetHeight(widget)); if (aboveVisible) addToScrollPos(cm, 0, widget.height); cm.curOp.forceUpdate = true; } return true; }); return widget; } // LINE DATA STRUCTURE // Line objects. These hold state related to a line, including // highlighting info (the styles array). var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) { this.text = text; attachMarkedSpans(this, markedSpans); this.height = estimateHeight ? estimateHeight(this) : 1; }; eventMixin(Line); Line.prototype.lineNo = function() { return lineNo(this); }; function updateLine(line, text, markedSpans, estimateHeight) { line.text = text; if (line.stateAfter) line.stateAfter = null; if (line.styles) line.styles = null; if (line.order != null) line.order = null; detachMarkedSpans(line); attachMarkedSpans(line, markedSpans); var estHeight = estimateHeight ? estimateHeight(line) : 1; if (estHeight != line.height) updateLineHeight(line, estHeight); } function cleanUpLine(line) { line.parent = null; detachMarkedSpans(line); } // Run the given mode's parser over a line, update the styles // array, which contains alternating fragments of text and CSS // classes. function runMode(cm, text, mode, state, f, forceToEnd) { var flattenSpans = mode.flattenSpans; if (flattenSpans == null) flattenSpans = cm.options.flattenSpans; var curStart = 0, curStyle = null; var stream = new StringStream(text, cm.options.tabSize), style; if (text == "" && mode.blankLine) mode.blankLine(state); while (!stream.eol()) { if (stream.pos > cm.options.maxHighlightLength) { flattenSpans = false; if (forceToEnd) processLine(cm, text, state, stream.pos); stream.pos = text.length; style = null; } else { style = mode.token(stream, state); } if (cm.options.addModeClass) { var mName = CodeMirror.innerMode(mode, state).mode.name; if (mName) style = "m-" + (style ? mName + " " + style : mName); } if (!flattenSpans || curStyle != style) { if (curStart < stream.start) f(stream.start, curStyle); curStart = stream.start; curStyle = style; } stream.start = stream.pos; } while (curStart < stream.pos) { // Webkit seems to refuse to render text nodes longer than 57444 characters var pos = Math.min(stream.pos, curStart + 50000); f(pos, curStyle); curStart = pos; } } function highlightLine(cm, line, state, forceToEnd) { // A styles array always starts with a number identifying the // mode/overlays that it is based on (for easy invalidation). var st = [cm.state.modeGen]; // Compute the base array of styles runMode(cm, line.text, cm.doc.mode, state, function(end, style) { st.push(end, style); }, forceToEnd); // Run overlays, adjust style array. for (var o = 0; o < cm.state.overlays.length; ++o) { var overlay = cm.state.overlays[o], i = 1, at = 0; runMode(cm, line.text, overlay.mode, true, function(end, style) { var start = i; // Ensure there's a token end at the current position, and that i points at it while (at < end) { var i_end = st[i]; if (i_end > end) st.splice(i, 1, end, st[i+1], i_end); i += 2; at = Math.min(end, i_end); } if (!style) return; if (overlay.opaque) { st.splice(start, i - start, end, style); i = start + 2; } else { for (; start < i; start += 2) { var cur = st[start+1]; st[start+1] = cur ? cur + " " + style : style; } } }); } return st; } function getLineStyles(cm, line) { if (!line.styles || line.styles[0] != cm.state.modeGen) line.styles = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line))); return line.styles; } // Lightweight form of highlight -- proceed over this line and // update state, but don't save a style array. function processLine(cm, text, state, startAt) { var mode = cm.doc.mode; var stream = new StringStream(text, cm.options.tabSize); stream.start = stream.pos = startAt || 0; if (text == "" && mode.blankLine) mode.blankLine(state); while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) { mode.token(stream, state); stream.start = stream.pos; } } var styleToClassCache = {}, styleToClassCacheWithMode = {}; function interpretTokenStyle(style, builder) { if (!style) return null; for (;;) { var lineClass = style.match(/(?:^|\s+)line-(background-)?(\S+)/); if (!lineClass) break; style = style.slice(0, lineClass.index) + style.slice(lineClass.index + lineClass[0].length); var prop = lineClass[1] ? "bgClass" : "textClass"; if (builder[prop] == null) builder[prop] = lineClass[2]; else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(builder[prop])) builder[prop] += " " + lineClass[2]; } if (/^\s*$/.test(style)) return null; var cache = builder.cm.options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; return cache[style] || (cache[style] = style.replace(/\S+/g, "cm-$&")); } function buildLineContent(cm, realLine, measure, copyWidgets) { var merged, line = realLine, empty = true; while (merged = collapsedSpanAtStart(line)) line = getLine(cm.doc, merged.find().from.line); var builder = {pre: elt("pre"), col: 0, pos: 0, measure: null, measuredSomething: false, cm: cm, copyWidgets: copyWidgets}; do { if (line.text) empty = false; builder.measure = line == realLine && measure; builder.pos = 0; builder.addToken = builder.measure ? buildTokenMeasure : buildToken; if ((ie || webkit) && cm.getOption("lineWrapping")) builder.addToken = buildTokenSplitSpaces(builder.addToken); var next = insertLineContent(line, builder, getLineStyles(cm, line)); if (measure && line == realLine && !builder.measuredSomething) { measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure)); builder.measuredSomething = true; } if (next) line = getLine(cm.doc, next.to.line); } while (next); if (measure && !builder.measuredSomething && !measure[0]) measure[0] = builder.pre.appendChild(empty ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure)); if (!builder.pre.firstChild && !lineIsHidden(cm.doc, realLine)) builder.pre.appendChild(document.createTextNode("\u00a0")); var order; // Work around problem with the reported dimensions of single-char // direction spans on IE (issue #1129). See also the comment in // cursorCoords. if (measure && ie && (order = getOrder(line))) { var l = order.length - 1; if (order[l].from == order[l].to) --l; var last = order[l], prev = order[l - 1]; if (last.from + 1 == last.to && prev && last.level < prev.level) { var span = measure[builder.pos - 1]; if (span) span.parentNode.insertBefore(span.measureRight = zeroWidthElement(cm.display.measure), span.nextSibling); } } var textClass = builder.textClass ? builder.textClass + " " + (realLine.textClass || "") : realLine.textClass; if (textClass) builder.pre.className = textClass; signal(cm, "renderLine", cm, realLine, builder.pre); return builder; } function defaultSpecialCharPlaceholder(ch) { var token = elt("span", "\u2022", "cm-invalidchar"); token.title = "\\u" + ch.charCodeAt(0).toString(16); return token; } function buildToken(builder, text, style, startStyle, endStyle, title) { if (!text) return; var special = builder.cm.options.specialChars; if (!special.test(text)) { builder.col += text.length; var content = document.createTextNode(text); } else { var content = document.createDocumentFragment(), pos = 0; while (true) { special.lastIndex = pos; var m = special.exec(text); var skipped = m ? m.index - pos : text.length - pos; if (skipped) { content.appendChild(document.createTextNode(text.slice(pos, pos + skipped))); builder.col += skipped; } if (!m) break; pos += skipped + 1; if (m[0] == "\t") { var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); builder.col += tabWidth; } else { var token = builder.cm.options.specialCharPlaceholder(m[0]); content.appendChild(token); builder.col += 1; } } } if (style || startStyle || endStyle || builder.measure) { var fullStyle = style || ""; if (startStyle) fullStyle += startStyle; if (endStyle) fullStyle += endStyle; var token = elt("span", [content], fullStyle); if (title) token.title = title; return builder.pre.appendChild(token); } builder.pre.appendChild(content); } function buildTokenMeasure(builder, text, style, startStyle, endStyle) { var wrapping = builder.cm.options.lineWrapping; for (var i = 0; i < text.length; ++i) { var start = i == 0, to = i + 1; while (to < text.length && isExtendingChar(text.charAt(to))) ++to; var ch = text.slice(i, to); i = to - 1; if (i && wrapping && spanAffectsWrapping(text, i)) builder.pre.appendChild(elt("wbr")); var old = builder.measure[builder.pos]; var span = builder.measure[builder.pos] = buildToken(builder, ch, style, start && startStyle, i == text.length - 1 && endStyle); if (old) span.leftSide = old.leftSide || old; // In IE single-space nodes wrap differently than spaces // embedded in larger text nodes, except when set to // white-space: normal (issue #1268). if (old_ie && wrapping && ch == " " && i && !/\s/.test(text.charAt(i - 1)) && i < text.length - 1 && !/\s/.test(text.charAt(i + 1))) span.style.whiteSpace = "normal"; builder.pos += ch.length; } if (text.length) builder.measuredSomething = true; } function buildTokenSplitSpaces(inner) { function split(old) { var out = " "; for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0"; out += " "; return out; } return function(builder, text, style, startStyle, endStyle, title) { return inner(builder, text.replace(/ {3,}/g, split), style, startStyle, endStyle, title); }; } function buildCollapsedSpan(builder, size, marker, ignoreWidget) { var widget = !ignoreWidget && marker.replacedWith; if (widget) { if (builder.copyWidgets) widget = widget.cloneNode(true); builder.pre.appendChild(widget); if (builder.measure) { if (size) { builder.measure[builder.pos] = widget; } else { var elt = zeroWidthElement(builder.cm.display.measure); if (marker.type == "bookmark" && !marker.insertLeft) builder.measure[builder.pos] = builder.pre.appendChild(elt); else if (builder.measure[builder.pos]) return; else builder.measure[builder.pos] = builder.pre.insertBefore(elt, widget); } builder.measuredSomething = true; } } builder.pos += size; } // Outputs a number of spans to make up a line, taking highlighting // and marked text into account. function insertLineContent(line, builder, styles) { var spans = line.markedSpans, allText = line.text, at = 0; if (!spans) { for (var i = 1; i < styles.length; i+=2) builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder)); return; } var len = allText.length, pos = 0, i = 1, text = "", style; var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed; for (;;) { if (nextChange == pos) { // Update current marker set spanStyle = spanEndStyle = spanStartStyle = title = ""; collapsed = null; nextChange = Infinity; var foundBookmarks = []; for (var j = 0; j < spans.length; ++j) { var sp = spans[j], m = sp.marker; if (sp.from <= pos && (sp.to == null || sp.to > pos)) { if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; } if (m.className) spanStyle += " " + m.className; if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle; if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle; if (m.title && !title) title = m.title; if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) collapsed = sp; } else if (sp.from > pos && nextChange > sp.from) { nextChange = sp.from; } if (m.type == "bookmark" && sp.from == pos && m.replacedWith) foundBookmarks.push(m); } if (collapsed && (collapsed.from || 0) == pos) { buildCollapsedSpan(builder, (collapsed.to == null ? len : collapsed.to) - pos, collapsed.marker, collapsed.from == null); if (collapsed.to == null) return collapsed.marker.find(); } if (!collapsed && foundBookmarks.length) for (var j = 0; j < foundBookmarks.length; ++j) buildCollapsedSpan(builder, 0, foundBookmarks[j]); } if (pos >= len) break; var upto = Math.min(len, nextChange); while (true) { if (text) { var end = pos + text.length; if (!collapsed) { var tokenText = end > upto ? text.slice(0, upto - pos) : text; builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title); } if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;} pos = end; spanStartStyle = ""; } text = allText.slice(at, at = styles[i++]); style = interpretTokenStyle(styles[i++], builder); } } } // DOCUMENT DATA STRUCTURE function updateDoc(doc, change, markedSpans, selAfter, estimateHeight) { function spansFor(n) {return markedSpans ? markedSpans[n] : null;} function update(line, text, spans) { updateLine(line, text, spans, estimateHeight); signalLater(line, "change", line, change); } var from = change.from, to = change.to, text = change.text; var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; // First adjust the line structure if (from.ch == 0 && to.ch == 0 && lastText == "" && (!doc.cm || doc.cm.options.wholeLineUpdateBefore)) { // This is a whole-line replace. Treated specially to make // sure line objects move the way they are supposed to. for (var i = 0, e = text.length - 1, added = []; i < e; ++i) added.push(new Line(text[i], spansFor(i), estimateHeight)); update(lastLine, lastLine.text, lastSpans); if (nlines) doc.remove(from.line, nlines); if (added.length) doc.insert(from.line, added); } else if (firstLine == lastLine) { if (text.length == 1) { update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); } else { for (var added = [], i = 1, e = text.length - 1; i < e; ++i) added.push(new Line(text[i], spansFor(i), estimateHeight)); added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); doc.insert(from.line + 1, added); } } else if (text.length == 1) { update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); doc.remove(from.line + 1, nlines); } else { update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); for (var i = 1, e = text.length - 1, added = []; i < e; ++i) added.push(new Line(text[i], spansFor(i), estimateHeight)); if (nlines > 1) doc.remove(from.line + 1, nlines - 1); doc.insert(from.line + 1, added); } signalLater(doc, "change", doc, change); setSelection(doc, selAfter.anchor, selAfter.head, null, true); } function LeafChunk(lines) { this.lines = lines; this.parent = null; for (var i = 0, e = lines.length, height = 0; i < e; ++i) { lines[i].parent = this; height += lines[i].height; } this.height = height; } LeafChunk.prototype = { chunkSize: function() { return this.lines.length; }, removeInner: function(at, n) { for (var i = at, e = at + n; i < e; ++i) { var line = this.lines[i]; this.height -= line.height; cleanUpLine(line); signalLater(line, "delete"); } this.lines.splice(at, n); }, collapse: function(lines) { lines.splice.apply(lines, [lines.length, 0].concat(this.lines)); }, insertInner: function(at, lines, height) { this.height += height; this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this; }, iterN: function(at, n, op) { for (var e = at + n; at < e; ++at) if (op(this.lines[at])) return true; } }; function BranchChunk(children) { this.children = children; var size = 0, height = 0; for (var i = 0, e = children.length; i < e; ++i) { var ch = children[i]; size += ch.chunkSize(); height += ch.height; ch.parent = this; } this.size = size; this.height = height; this.parent = null; } BranchChunk.prototype = { chunkSize: function() { return this.size; }, removeInner: function(at, n) { this.size -= n; for (var i = 0; i < this.children.length; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at < sz) { var rm = Math.min(n, sz - at), oldHeight = child.height; child.removeInner(at, rm); this.height -= oldHeight - child.height; if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } if ((n -= rm) == 0) break; at = 0; } else at -= sz; } if (this.size - n < 25) { var lines = []; this.collapse(lines); this.children = [new LeafChunk(lines)]; this.children[0].parent = this; } }, collapse: function(lines) { for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines); }, insertInner: function(at, lines, height) { this.size += lines.length; this.height += height; for (var i = 0, e = this.children.length; i < e; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at <= sz) { child.insertInner(at, lines, height); if (child.lines && child.lines.length > 50) { while (child.lines.length > 50) { var spilled = child.lines.splice(child.lines.length - 25, 25); var newleaf = new LeafChunk(spilled); child.height -= newleaf.height; this.children.splice(i + 1, 0, newleaf); newleaf.parent = this; } this.maybeSpill(); } break; } at -= sz; } }, maybeSpill: function() { if (this.children.length <= 10) return; var me = this; do { var spilled = me.children.splice(me.children.length - 5, 5); var sibling = new BranchChunk(spilled); if (!me.parent) { // Become the parent node var copy = new BranchChunk(me.children); copy.parent = me; me.children = [copy, sibling]; me = copy; } else { me.size -= sibling.size; me.height -= sibling.height; var myIndex = indexOf(me.parent.children, me); me.parent.children.splice(myIndex + 1, 0, sibling); } sibling.parent = me.parent; } while (me.children.length > 10); me.parent.maybeSpill(); }, iterN: function(at, n, op) { for (var i = 0, e = this.children.length; i < e; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at < sz) { var used = Math.min(n, sz - at); if (child.iterN(at, used, op)) return true; if ((n -= used) == 0) break; at = 0; } else at -= sz; } } }; var nextDocId = 0; var Doc = CodeMirror.Doc = function(text, mode, firstLine) { if (!(this instanceof Doc)) return new Doc(text, mode, firstLine); if (firstLine == null) firstLine = 0; BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); this.first = firstLine; this.scrollTop = this.scrollLeft = 0; this.cantEdit = false; this.history = makeHistory(); this.cleanGeneration = 1; this.frontier = firstLine; var start = Pos(firstLine, 0); this.sel = {from: start, to: start, head: start, anchor: start, shift: false, extend: false, goalColumn: null}; this.id = ++nextDocId; this.modeOption = mode; if (typeof text == "string") text = splitLines(text); updateDoc(this, {from: start, to: start, text: text}, null, {head: start, anchor: start}); }; Doc.prototype = createObj(BranchChunk.prototype, { constructor: Doc, iter: function(from, to, op) { if (op) this.iterN(from - this.first, to - from, op); else this.iterN(this.first, this.first + this.size, from); }, insert: function(at, lines) { var height = 0; for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height; this.insertInner(at - this.first, lines, height); }, remove: function(at, n) { this.removeInner(at - this.first, n); }, getValue: function(lineSep) { var lines = getLines(this, this.first, this.first + this.size); if (lineSep === false) return lines; return lines.join(lineSep || "\n"); }, setValue: function(code) { var top = Pos(this.first, 0), last = this.first + this.size - 1; makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), text: splitLines(code), origin: "setValue"}, {head: top, anchor: top}, true); }, replaceRange: function(code, from, to, origin) { from = clipPos(this, from); to = to ? clipPos(this, to) : from; replaceRange(this, code, from, to, origin); }, getRange: function(from, to, lineSep) { var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); if (lineSep === false) return lines; return lines.join(lineSep || "\n"); }, getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;}, setLine: function(line, text) { if (isLine(this, line)) replaceRange(this, text, Pos(line, 0), clipPos(this, Pos(line))); }, removeLine: function(line) { if (line) replaceRange(this, "", clipPos(this, Pos(line - 1)), clipPos(this, Pos(line))); else replaceRange(this, "", Pos(0, 0), clipPos(this, Pos(1, 0))); }, getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);}, getLineNumber: function(line) {return lineNo(line);}, getLineHandleVisualStart: function(line) { if (typeof line == "number") line = getLine(this, line); return visualLine(this, line); }, lineCount: function() {return this.size;}, firstLine: function() {return this.first;}, lastLine: function() {return this.first + this.size - 1;}, clipPos: function(pos) {return clipPos(this, pos);}, getCursor: function(start) { var sel = this.sel, pos; if (start == null || start == "head") pos = sel.head; else if (start == "anchor") pos = sel.anchor; else if (start == "end" || start === false) pos = sel.to; else pos = sel.from; return copyPos(pos); }, somethingSelected: function() {return !posEq(this.sel.head, this.sel.anchor);}, setCursor: docOperation(function(line, ch, extend) { var pos = clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line); if (extend) extendSelection(this, pos); else setSelection(this, pos, pos); }), setSelection: docOperation(function(anchor, head, bias) { setSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), bias); }), extendSelection: docOperation(function(from, to, bias) { extendSelection(this, clipPos(this, from), to && clipPos(this, to), bias); }), getSelection: function(lineSep) {return this.getRange(this.sel.from, this.sel.to, lineSep);}, replaceSelection: function(code, collapse, origin) { makeChange(this, {from: this.sel.from, to: this.sel.to, text: splitLines(code), origin: origin}, collapse || "around"); }, undo: docOperation(function() {makeChangeFromHistory(this, "undo");}), redo: docOperation(function() {makeChangeFromHistory(this, "redo");}), setExtending: function(val) {this.sel.extend = val;}, historySize: function() { var hist = this.history; return {undo: hist.done.length, redo: hist.undone.length}; }, clearHistory: function() {this.history = makeHistory(this.history.maxGeneration);}, markClean: function() { this.cleanGeneration = this.changeGeneration(true); }, changeGeneration: function(forceSplit) { if (forceSplit) this.history.lastOp = this.history.lastOrigin = null; return this.history.generation; }, isClean: function (gen) { return this.history.generation == (gen || this.cleanGeneration); }, getHistory: function() { return {done: copyHistoryArray(this.history.done), undone: copyHistoryArray(this.history.undone)}; }, setHistory: function(histData) { var hist = this.history = makeHistory(this.history.maxGeneration); hist.done = histData.done.slice(0); hist.undone = histData.undone.slice(0); }, markText: function(from, to, options) { return markText(this, clipPos(this, from), clipPos(this, to), options, "range"); }, setBookmark: function(pos, options) { var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), insertLeft: options && options.insertLeft, clearWhenEmpty: false}; pos = clipPos(this, pos); return markText(this, pos, pos, realOpts, "bookmark"); }, findMarksAt: function(pos) { pos = clipPos(this, pos); var markers = [], spans = getLine(this, pos.line).markedSpans; if (spans) for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if ((span.from == null || span.from <= pos.ch) && (span.to == null || span.to >= pos.ch)) markers.push(span.marker.parent || span.marker); } return markers; }, findMarks: function(from, to) { from = clipPos(this, from); to = clipPos(this, to); var found = [], lineNo = from.line; this.iter(from.line, to.line + 1, function(line) { var spans = line.markedSpans; if (spans) for (var i = 0; i < spans.length; i++) { var span = spans[i]; if (!(lineNo == from.line && from.ch > span.to || span.from == null && lineNo != from.line|| lineNo == to.line && span.from > to.ch)) found.push(span.marker.parent || span.marker); } ++lineNo; }); return found; }, getAllMarks: function() { var markers = []; this.iter(function(line) { var sps = line.markedSpans; if (sps) for (var i = 0; i < sps.length; ++i) if (sps[i].from != null) markers.push(sps[i].marker); }); return markers; }, posFromIndex: function(off) { var ch, lineNo = this.first; this.iter(function(line) { var sz = line.text.length + 1; if (sz > off) { ch = off; return true; } off -= sz; ++lineNo; }); return clipPos(this, Pos(lineNo, ch)); }, indexFromPos: function (coords) { coords = clipPos(this, coords); var index = coords.ch; if (coords.line < this.first || coords.ch < 0) return 0; this.iter(this.first, coords.line, function (line) { index += line.text.length + 1; }); return index; }, copy: function(copyHistory) { var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first); doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; doc.sel = {from: this.sel.from, to: this.sel.to, head: this.sel.head, anchor: this.sel.anchor, shift: this.sel.shift, extend: false, goalColumn: this.sel.goalColumn}; if (copyHistory) { doc.history.undoDepth = this.history.undoDepth; doc.setHistory(this.getHistory()); } return doc; }, linkedDoc: function(options) { if (!options) options = {}; var from = this.first, to = this.first + this.size; if (options.from != null && options.from > from) from = options.from; if (options.to != null && options.to < to) to = options.to; var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from); if (options.sharedHist) copy.history = this.history; (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; return copy; }, unlinkDoc: function(other) { if (other instanceof CodeMirror) other = other.doc; if (this.linked) for (var i = 0; i < this.linked.length; ++i) { var link = this.linked[i]; if (link.doc != other) continue; this.linked.splice(i, 1); other.unlinkDoc(this); break; } // If the histories were shared, split them again if (other.history == this.history) { var splitIds = [other.id]; linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true); other.history = makeHistory(); other.history.done = copyHistoryArray(this.history.done, splitIds); other.history.undone = copyHistoryArray(this.history.undone, splitIds); } }, iterLinkedDocs: function(f) {linkedDocs(this, f);}, getMode: function() {return this.mode;}, getEditor: function() {return this.cm;} }); Doc.prototype.eachLine = Doc.prototype.iter; // The Doc methods that should be available on CodeMirror instances var dontDelegate = "iter insert remove copy getEditor".split(" "); for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) CodeMirror.prototype[prop] = (function(method) { return function() {return method.apply(this.doc, arguments);}; })(Doc.prototype[prop]); eventMixin(Doc); function linkedDocs(doc, f, sharedHistOnly) { function propagate(doc, skip, sharedHist) { if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) { var rel = doc.linked[i]; if (rel.doc == skip) continue; var shared = sharedHist && rel.sharedHist; if (sharedHistOnly && !shared) continue; f(rel.doc, shared); propagate(rel.doc, doc, shared); } } propagate(doc, null, true); } function attachDoc(cm, doc) { if (doc.cm) throw new Error("This document is already in use."); cm.doc = doc; doc.cm = cm; estimateLineHeights(cm); loadMode(cm); if (!cm.options.lineWrapping) computeMaxLength(cm); cm.options.mode = doc.modeOption; regChange(cm); } // LINE UTILITIES function getLine(chunk, n) { n -= chunk.first; while (!chunk.lines) { for (var i = 0;; ++i) { var child = chunk.children[i], sz = child.chunkSize(); if (n < sz) { chunk = child; break; } n -= sz; } } return chunk.lines[n]; } function getBetween(doc, start, end) { var out = [], n = start.line; doc.iter(start.line, end.line + 1, function(line) { var text = line.text; if (n == end.line) text = text.slice(0, end.ch); if (n == start.line) text = text.slice(start.ch); out.push(text); ++n; }); return out; } function getLines(doc, from, to) { var out = []; doc.iter(from, to, function(line) { out.push(line.text); }); return out; } function updateLineHeight(line, height) { var diff = height - line.height; for (var n = line; n; n = n.parent) n.height += diff; } function lineNo(line) { if (line.parent == null) return null; var cur = line.parent, no = indexOf(cur.lines, line); for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { for (var i = 0;; ++i) { if (chunk.children[i] == cur) break; no += chunk.children[i].chunkSize(); } } return no + cur.first; } function lineAtHeight(chunk, h) { var n = chunk.first; outer: do { for (var i = 0, e = chunk.children.length; i < e; ++i) { var child = chunk.children[i], ch = child.height; if (h < ch) { chunk = child; continue outer; } h -= ch; n += child.chunkSize(); } return n; } while (!chunk.lines); for (var i = 0, e = chunk.lines.length; i < e; ++i) { var line = chunk.lines[i], lh = line.height; if (h < lh) break; h -= lh; } return n + i; } function heightAtLine(cm, lineObj) { lineObj = visualLine(cm.doc, lineObj); var h = 0, chunk = lineObj.parent; for (var i = 0; i < chunk.lines.length; ++i) { var line = chunk.lines[i]; if (line == lineObj) break; else h += line.height; } for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { for (var i = 0; i < p.children.length; ++i) { var cur = p.children[i]; if (cur == chunk) break; else h += cur.height; } } return h; } function getOrder(line) { var order = line.order; if (order == null) order = line.order = bidiOrdering(line.text); return order; } // HISTORY function makeHistory(startGen) { return { // Arrays of history events. Doing something adds an event to // done and clears undo. Undoing moves events from done to // undone, redoing moves them in the other direction. done: [], undone: [], undoDepth: Infinity, // Used to track when changes can be merged into a single undo // event lastTime: 0, lastOp: null, lastOrigin: null, // Used by the isClean() method generation: startGen || 1, maxGeneration: startGen || 1 }; } function attachLocalSpans(doc, change, from, to) { var existing = change["spans_" + doc.id], n = 0; doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) { if (line.markedSpans) (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; ++n; }); } function historyChangeFromChange(doc, change) { var from = { line: change.from.line, ch: change.from.ch }; var histChange = {from: from, to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true); return histChange; } function addToHistory(doc, change, selAfter, opId) { var hist = doc.history; hist.undone.length = 0; var time = +new Date, cur = lst(hist.done); if (cur && (hist.lastOp == opId || hist.lastOrigin == change.origin && change.origin && ((change.origin.charAt(0) == "+" && doc.cm && hist.lastTime > time - doc.cm.options.historyEventDelay) || change.origin.charAt(0) == "*"))) { // Merge this change into the last event var last = lst(cur.changes); if (posEq(change.from, change.to) && posEq(change.from, last.to)) { // Optimized case for simple insertion -- don't want to add // new changesets for every character typed last.to = changeEnd(change); } else { // Add new sub-event cur.changes.push(historyChangeFromChange(doc, change)); } cur.anchorAfter = selAfter.anchor; cur.headAfter = selAfter.head; } else { // Can not be merged, start a new event. cur = {changes: [historyChangeFromChange(doc, change)], generation: hist.generation, anchorBefore: doc.sel.anchor, headBefore: doc.sel.head, anchorAfter: selAfter.anchor, headAfter: selAfter.head}; hist.done.push(cur); while (hist.done.length > hist.undoDepth) hist.done.shift(); } hist.generation = ++hist.maxGeneration; hist.lastTime = time; hist.lastOp = opId; hist.lastOrigin = change.origin; if (!last) signal(doc, "historyAdded"); } function removeClearedSpans(spans) { if (!spans) return null; for (var i = 0, out; i < spans.length; ++i) { if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); } else if (out) out.push(spans[i]); } return !out ? spans : out.length ? out : null; } function getOldSpans(doc, change) { var found = change["spans_" + doc.id]; if (!found) return null; for (var i = 0, nw = []; i < change.text.length; ++i) nw.push(removeClearedSpans(found[i])); return nw; } // Used both to provide a JSON-safe object in .getHistory, and, when // detaching a document, to split the history in two function copyHistoryArray(events, newGroup) { for (var i = 0, copy = []; i < events.length; ++i) { var event = events[i], changes = event.changes, newChanges = []; copy.push({changes: newChanges, anchorBefore: event.anchorBefore, headBefore: event.headBefore, anchorAfter: event.anchorAfter, headAfter: event.headAfter}); for (var j = 0; j < changes.length; ++j) { var change = changes[j], m; newChanges.push({from: change.from, to: change.to, text: change.text}); if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) { if (indexOf(newGroup, Number(m[1])) > -1) { lst(newChanges)[prop] = change[prop]; delete change[prop]; } } } } return copy; } // Rebasing/resetting history to deal with externally-sourced changes function rebaseHistSel(pos, from, to, diff) { if (to < pos.line) { pos.line += diff; } else if (from < pos.line) { pos.line = from; pos.ch = 0; } } // Tries to rebase an array of history events given a change in the // document. If the change touches the same lines as the event, the // event, and everything 'behind' it, is discarded. If the change is // before the event, the event's positions are updated. Uses a // copy-on-write scheme for the positions, to avoid having to // reallocate them all on every rebase, but also avoid problems with // shared position objects being unsafely updated. function rebaseHistArray(array, from, to, diff) { for (var i = 0; i < array.length; ++i) { var sub = array[i], ok = true; for (var j = 0; j < sub.changes.length; ++j) { var cur = sub.changes[j]; if (!sub.copied) { cur.from = copyPos(cur.from); cur.to = copyPos(cur.to); } if (to < cur.from.line) { cur.from.line += diff; cur.to.line += diff; } else if (from <= cur.to.line) { ok = false; break; } } if (!sub.copied) { sub.anchorBefore = copyPos(sub.anchorBefore); sub.headBefore = copyPos(sub.headBefore); sub.anchorAfter = copyPos(sub.anchorAfter); sub.readAfter = copyPos(sub.headAfter); sub.copied = true; } if (!ok) { array.splice(0, i + 1); i = 0; } else { rebaseHistSel(sub.anchorBefore); rebaseHistSel(sub.headBefore); rebaseHistSel(sub.anchorAfter); rebaseHistSel(sub.headAfter); } } } function rebaseHist(hist, change) { var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; rebaseHistArray(hist.done, from, to, diff); rebaseHistArray(hist.undone, from, to, diff); } // EVENT OPERATORS function stopMethod() {e_stop(this);} // Ensure an event has a stop method. function addStop(event) { if (!event.stop) event.stop = stopMethod; return event; } function e_preventDefault(e) { if (e.preventDefault) e.preventDefault(); else e.returnValue = false; } function e_stopPropagation(e) { if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; } function e_defaultPrevented(e) { return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false; } function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} CodeMirror.e_stop = e_stop; CodeMirror.e_preventDefault = e_preventDefault; CodeMirror.e_stopPropagation = e_stopPropagation; function e_target(e) {return e.target || e.srcElement;} function e_button(e) { var b = e.which; if (b == null) { if (e.button & 1) b = 1; else if (e.button & 2) b = 3; else if (e.button & 4) b = 2; } if (mac && e.ctrlKey && b == 1) b = 3; return b; } // EVENT HANDLING function on(emitter, type, f) { if (emitter.addEventListener) emitter.addEventListener(type, f, false); else if (emitter.attachEvent) emitter.attachEvent("on" + type, f); else { var map = emitter._handlers || (emitter._handlers = {}); var arr = map[type] || (map[type] = []); arr.push(f); } } function off(emitter, type, f) { if (emitter.removeEventListener) emitter.removeEventListener(type, f, false); else if (emitter.detachEvent) emitter.detachEvent("on" + type, f); else { var arr = emitter._handlers && emitter._handlers[type]; if (!arr) return; for (var i = 0; i < arr.length; ++i) if (arr[i] == f) { arr.splice(i, 1); break; } } } function signal(emitter, type /*, values...*/) { var arr = emitter._handlers && emitter._handlers[type]; if (!arr) return; var args = Array.prototype.slice.call(arguments, 2); for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args); } var delayedCallbacks, delayedCallbackDepth = 0; function signalLater(emitter, type /*, values...*/) { var arr = emitter._handlers && emitter._handlers[type]; if (!arr) return; var args = Array.prototype.slice.call(arguments, 2); if (!delayedCallbacks) { ++delayedCallbackDepth; delayedCallbacks = []; setTimeout(fireDelayed, 0); } function bnd(f) {return function(){f.apply(null, args);};}; for (var i = 0; i < arr.length; ++i) delayedCallbacks.push(bnd(arr[i])); } function signalDOMEvent(cm, e, override) { signal(cm, override || e.type, cm, e); return e_defaultPrevented(e) || e.codemirrorIgnore; } function fireDelayed() { --delayedCallbackDepth; var delayed = delayedCallbacks; delayedCallbacks = null; for (var i = 0; i < delayed.length; ++i) delayed[i](); } function hasHandler(emitter, type) { var arr = emitter._handlers && emitter._handlers[type]; return arr && arr.length > 0; } CodeMirror.on = on; CodeMirror.off = off; CodeMirror.signal = signal; function eventMixin(ctor) { ctor.prototype.on = function(type, f) {on(this, type, f);}; ctor.prototype.off = function(type, f) {off(this, type, f);}; } // MISC UTILITIES // Number of pixels added to scroller and sizer to hide scrollbar var scrollerCutOff = 30; // Returned or thrown by various protocols to signal 'I'm not // handling this'. var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}}; function Delayed() {this.id = null;} Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}}; // Counts the column offset in a string, taking tabs into account. // Used mostly to find indentation. function countColumn(string, end, tabSize, startIndex, startValue) { if (end == null) { end = string.search(/[^\s\u00a0]/); if (end == -1) end = string.length; } for (var i = startIndex || 0, n = startValue || 0; i < end; ++i) { if (string.charAt(i) == "\t") n += tabSize - (n % tabSize); else ++n; } return n; } CodeMirror.countColumn = countColumn; var spaceStrs = [""]; function spaceStr(n) { while (spaceStrs.length <= n) spaceStrs.push(lst(spaceStrs) + " "); return spaceStrs[n]; } function lst(arr) { return arr[arr.length-1]; } function selectInput(node) { if (ios) { // Mobile Safari apparently has a bug where select() is broken. node.selectionStart = 0; node.selectionEnd = node.value.length; } else { // Suppress mysterious IE10 errors try { node.select(); } catch(_e) {} } } function indexOf(collection, elt) { if (collection.indexOf) return collection.indexOf(elt); for (var i = 0, e = collection.length; i < e; ++i) if (collection[i] == elt) return i; return -1; } function createObj(base, props) { function Obj() {} Obj.prototype = base; var inst = new Obj(); if (props) copyObj(props, inst); return inst; } function copyObj(obj, target) { if (!target) target = {}; for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop]; return target; } function emptyArray(size) { for (var a = [], i = 0; i < size; ++i) a.push(undefined); return a; } function bind(f) { var args = Array.prototype.slice.call(arguments, 1); return function(){return f.apply(null, args);}; } var nonASCIISingleCaseWordChar = /[\u00df\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; function isWordChar(ch) { return /\w/.test(ch) || ch > "\x80" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); } function isEmpty(obj) { for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false; return true; } var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); } // DOM UTILITIES function elt(tag, content, className, style) { var e = document.createElement(tag); if (className) e.className = className; if (style) e.style.cssText = style; if (typeof content == "string") setTextContent(e, content); else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); return e; } function removeChildren(e) { for (var count = e.childNodes.length; count > 0; --count) e.removeChild(e.firstChild); return e; } function removeChildrenAndAdd(parent, e) { return removeChildren(parent).appendChild(e); } function setTextContent(e, str) { if (ie_lt9) { e.innerHTML = ""; e.appendChild(document.createTextNode(str)); } else e.textContent = str; } function getRect(node) { return node.getBoundingClientRect(); } CodeMirror.replaceGetRect = function(f) { getRect = f; }; // FEATURE DETECTION // Detect drag-and-drop var dragAndDrop = function() { // There is *some* kind of drag-and-drop support in IE6-8, but I // couldn't get it to work yet. if (ie_lt9) return false; var div = elt('div'); return "draggable" in div || "dragDrop" in div; }(); // For a reason I have yet to figure out, some browsers disallow // word wrapping between certain characters *only* if a new inline // element is started between them. This makes it hard to reliably // measure the position of things, since that requires inserting an // extra span. This terribly fragile set of tests matches the // character combinations that suffer from this phenomenon on the // various browsers. function spanAffectsWrapping() { return false; } if (gecko) // Only for "$'" spanAffectsWrapping = function(str, i) { return str.charCodeAt(i - 1) == 36 && str.charCodeAt(i) == 39; }; else if (safari && !/Version\/([6-9]|\d\d)\b/.test(navigator.userAgent)) spanAffectsWrapping = function(str, i) { return /\-[^ \-?]|\?[^ !\'\"\),.\-\/:;\?\]\}]/.test(str.slice(i - 1, i + 1)); }; else if (webkit && /Chrome\/(?:29|[3-9]\d|\d\d\d)\./.test(navigator.userAgent)) spanAffectsWrapping = function(str, i) { var code = str.charCodeAt(i - 1); return code >= 8208 && code <= 8212; }; else if (webkit) spanAffectsWrapping = function(str, i) { if (i > 1 && str.charCodeAt(i - 1) == 45) { if (/\w/.test(str.charAt(i - 2)) && /[^\-?\.]/.test(str.charAt(i))) return true; if (i > 2 && /[\d\.,]/.test(str.charAt(i - 2)) && /[\d\.,]/.test(str.charAt(i))) return false; } return /[~!#%&*)=+}\]\\|\"\.>,:;][({[<]|-[^\-?\.\u2010-\u201f\u2026]|\?[\w~`@#$%\^&*(_=+{[|><]|\u2026[\w~`@#$%\^&*(_=+{[><]/.test(str.slice(i - 1, i + 1)); }; var knownScrollbarWidth; function scrollbarWidth(measure) { if (knownScrollbarWidth != null) return knownScrollbarWidth; var test = elt("div", null, null, "width: 50px; height: 50px; overflow-x: scroll"); removeChildrenAndAdd(measure, test); if (test.offsetWidth) knownScrollbarWidth = test.offsetHeight - test.clientHeight; return knownScrollbarWidth || 0; } var zwspSupported; function zeroWidthElement(measure) { if (zwspSupported == null) { var test = elt("span", "\u200b"); removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); if (measure.firstChild.offsetHeight != 0) zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !ie_lt8; } if (zwspSupported) return elt("span", "\u200b"); else return elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); } // See if "".split is the broken IE version, if so, provide an // alternative way to split lines. var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) { var pos = 0, result = [], l = string.length; while (pos <= l) { var nl = string.indexOf("\n", pos); if (nl == -1) nl = string.length; var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); var rt = line.indexOf("\r"); if (rt != -1) { result.push(line.slice(0, rt)); pos += rt + 1; } else { result.push(line); pos = nl + 1; } } return result; } : function(string){return string.split(/\r\n?|\n/);}; CodeMirror.splitLines = splitLines; var hasSelection = window.getSelection ? function(te) { try { return te.selectionStart != te.selectionEnd; } catch(e) { return false; } } : function(te) { try {var range = te.ownerDocument.selection.createRange();} catch(e) {} if (!range || range.parentElement() != te) return false; return range.compareEndPoints("StartToEnd", range) != 0; }; var hasCopyEvent = (function() { var e = elt("div"); if ("oncopy" in e) return true; e.setAttribute("oncopy", "return;"); return typeof e.oncopy == 'function'; })(); // KEY NAMING var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", 107: "=", 109: "-", 127: "Delete", 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"}; CodeMirror.keyNames = keyNames; (function() { // Number keys for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i); // Alphabetic keys for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i); // Function keys for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i; })(); // BIDI HELPERS function iterateBidiSections(order, from, to, f) { if (!order) return f(from, to, "ltr"); var found = false; for (var i = 0; i < order.length; ++i) { var part = order[i]; if (part.from < to && part.to > from || from == to && part.to == from) { f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr"); found = true; } } if (!found) f(from, to, "ltr"); } function bidiLeft(part) { return part.level % 2 ? part.to : part.from; } function bidiRight(part) { return part.level % 2 ? part.from : part.to; } function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; } function lineRight(line) { var order = getOrder(line); if (!order) return line.text.length; return bidiRight(lst(order)); } function lineStart(cm, lineN) { var line = getLine(cm.doc, lineN); var visual = visualLine(cm.doc, line); if (visual != line) lineN = lineNo(visual); var order = getOrder(visual); var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual); return Pos(lineN, ch); } function lineEnd(cm, lineN) { var merged, line; while (merged = collapsedSpanAtEnd(line = getLine(cm.doc, lineN))) lineN = merged.find().to.line; var order = getOrder(line); var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line); return Pos(lineN, ch); } function compareBidiLevel(order, a, b) { var linedir = order[0].level; if (a == linedir) return true; if (b == linedir) return false; return a < b; } var bidiOther; function getBidiPartAt(order, pos) { bidiOther = null; for (var i = 0, found; i < order.length; ++i) { var cur = order[i]; if (cur.from < pos && cur.to > pos) return i; if ((cur.from == pos || cur.to == pos)) { if (found == null) { found = i; } else if (compareBidiLevel(order, cur.level, order[found].level)) { if (cur.from != cur.to) bidiOther = found; return i; } else { if (cur.from != cur.to) bidiOther = i; return found; } } } return found; } function moveInLine(line, pos, dir, byUnit) { if (!byUnit) return pos + dir; do pos += dir; while (pos > 0 && isExtendingChar(line.text.charAt(pos))); return pos; } // This is somewhat involved. It is needed in order to move // 'visually' through bi-directional text -- i.e., pressing left // should make the cursor go left, even when in RTL text. The // tricky part is the 'jumps', where RTL and LTR text touch each // other. This often requires the cursor offset to move more than // one unit, in order to visually move one unit. function moveVisually(line, start, dir, byUnit) { var bidi = getOrder(line); if (!bidi) return moveLogically(line, start, dir, byUnit); var pos = getBidiPartAt(bidi, start), part = bidi[pos]; var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit); for (;;) { if (target > part.from && target < part.to) return target; if (target == part.from || target == part.to) { if (getBidiPartAt(bidi, target) == pos) return target; part = bidi[pos += dir]; return (dir > 0) == part.level % 2 ? part.to : part.from; } else { part = bidi[pos += dir]; if (!part) return null; if ((dir > 0) == part.level % 2) target = moveInLine(line, part.to, -1, byUnit); else target = moveInLine(line, part.from, 1, byUnit); } } } function moveLogically(line, start, dir, byUnit) { var target = start + dir; if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir; return target < 0 || target > line.text.length ? null : target; } // Bidirectional ordering algorithm // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm // that this (partially) implements. // One-char codes used for character types: // L (L): Left-to-Right // R (R): Right-to-Left // r (AL): Right-to-Left Arabic // 1 (EN): European Number // + (ES): European Number Separator // % (ET): European Number Terminator // n (AN): Arabic Number // , (CS): Common Number Separator // m (NSM): Non-Spacing Mark // b (BN): Boundary Neutral // s (B): Paragraph Separator // t (S): Segment Separator // w (WS): Whitespace // N (ON): Other Neutrals // Returns null if characters are ordered as they appear // (left-to-right), or an array of sections ({from, to, level} // objects) in the order in which they occur visually. var bidiOrdering = (function() { // Character types for codepoints 0 to 0xff var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL"; // Character types for codepoints 0x600 to 0x6ff var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmmrrrrrrrrrrrrrrrrrr"; function charType(code) { if (code <= 0xff) return lowTypes.charAt(code); else if (0x590 <= code && code <= 0x5f4) return "R"; else if (0x600 <= code && code <= 0x6ff) return arabicTypes.charAt(code - 0x600); else if (0x700 <= code && code <= 0x8ac) return "r"; else return "L"; } var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; // Browsers seem to always treat the boundaries of block elements as being L. var outerType = "L"; return function(str) { if (!bidiRE.test(str)) return false; var len = str.length, types = []; for (var i = 0, type; i < len; ++i) types.push(type = charType(str.charCodeAt(i))); // W1. Examine each non-spacing mark (NSM) in the level run, and // change the type of the NSM to the type of the previous // character. If the NSM is at the start of the level run, it will // get the type of sor. for (var i = 0, prev = outerType; i < len; ++i) { var type = types[i]; if (type == "m") types[i] = prev; else prev = type; } // W2. Search backwards from each instance of a European number // until the first strong type (R, L, AL, or sor) is found. If an // AL is found, change the type of the European number to Arabic // number. // W3. Change all ALs to R. for (var i = 0, cur = outerType; i < len; ++i) { var type = types[i]; if (type == "1" && cur == "r") types[i] = "n"; else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; } } // W4. A single European separator between two European numbers // changes to a European number. A single common separator between // two numbers of the same type changes to that type. for (var i = 1, prev = types[0]; i < len - 1; ++i) { var type = types[i]; if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1"; else if (type == "," && prev == types[i+1] && (prev == "1" || prev == "n")) types[i] = prev; prev = type; } // W5. A sequence of European terminators adjacent to European // numbers changes to all European numbers. // W6. Otherwise, separators and terminators change to Other // Neutral. for (var i = 0; i < len; ++i) { var type = types[i]; if (type == ",") types[i] = "N"; else if (type == "%") { for (var end = i + 1; end < len && types[end] == "%"; ++end) {} var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; for (var j = i; j < end; ++j) types[j] = replace; i = end - 1; } } // W7. Search backwards from each instance of a European number // until the first strong type (R, L, or sor) is found. If an L is // found, then change the type of the European number to L. for (var i = 0, cur = outerType; i < len; ++i) { var type = types[i]; if (cur == "L" && type == "1") types[i] = "L"; else if (isStrong.test(type)) cur = type; } // N1. A sequence of neutrals takes the direction of the // surrounding strong text if the text on both sides has the same // direction. European and Arabic numbers act as if they were R in // terms of their influence on neutrals. Start-of-level-run (sor) // and end-of-level-run (eor) are used at level run boundaries. // N2. Any remaining neutrals take the embedding direction. for (var i = 0; i < len; ++i) { if (isNeutral.test(types[i])) { for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {} var before = (i ? types[i-1] : outerType) == "L"; var after = (end < len ? types[end] : outerType) == "L"; var replace = before || after ? "L" : "R"; for (var j = i; j < end; ++j) types[j] = replace; i = end - 1; } } // Here we depart from the documented algorithm, in order to avoid // building up an actual levels array. Since there are only three // levels (0, 1, 2) in an implementation that doesn't take // explicit embedding into account, we can build up the order on // the fly, without following the level-based algorithm. var order = [], m; for (var i = 0; i < len;) { if (countsAsLeft.test(types[i])) { var start = i; for (++i; i < len && countsAsLeft.test(types[i]); ++i) {} order.push({from: start, to: i, level: 0}); } else { var pos = i, at = order.length; for (++i; i < len && types[i] != "L"; ++i) {} for (var j = pos; j < i;) { if (countsAsNum.test(types[j])) { if (pos < j) order.splice(at, 0, {from: pos, to: j, level: 1}); var nstart = j; for (++j; j < i && countsAsNum.test(types[j]); ++j) {} order.splice(at, 0, {from: nstart, to: j, level: 2}); pos = j; } else ++j; } if (pos < i) order.splice(at, 0, {from: pos, to: i, level: 1}); } } if (order[0].level == 1 && (m = str.match(/^\s+/))) { order[0].from = m[0].length; order.unshift({from: 0, to: m[0].length, level: 0}); } if (lst(order).level == 1 && (m = str.match(/\s+$/))) { lst(order).to -= m[0].length; order.push({from: len - m[0].length, to: len, level: 0}); } if (order[0].level != lst(order).level) order.push({from: len, to: len, level: order[0].level}); return order; }; })(); // THE END CodeMirror.version = "3.22.0"; return CodeMirror; })(); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/CodeMirror/mode/clike.js ================================================ CodeMirror.defineMode("clike", function(config, parserConfig) { var indentUnit = config.indentUnit, statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, dontAlignCalls = parserConfig.dontAlignCalls, keywords = parserConfig.keywords || {}, builtin = parserConfig.builtin || {}, blockKeywords = parserConfig.blockKeywords || {}, atoms = parserConfig.atoms || {}, hooks = parserConfig.hooks || {}, multiLineStrings = parserConfig.multiLineStrings; var isOperatorChar = /[+\-*&%=<>!?|\/]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (hooks[ch]) { var result = hooks[ch](stream, state); if (result !== false) return result; } if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "keyword"; } if (builtin.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "builtin"; } if (atoms.propertyIsEnumerable(cur)) return "atom"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = null; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { var indent = state.indented; if (state.context && state.context.type == "statement") indent = state.context.indented; return state.context = new Context(indent, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state); else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement")) pushContext(state, stream.column(), "statement"); state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; var closing = firstChar == ctx.type; if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); else if (ctx.align && (!dontAlignCalls || ctx.type != ")")) return ctx.column + (closing ? 0 : 1); else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit; else return ctx.indented + (closing ? 0 : indentUnit); }, electricChars: "{}", blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//", fold: "brace" }; }); (function() { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var cKeywords = "auto if break int case long char register continue return default short do sizeof " + "double static else struct entry switch extern typedef float union for unsigned " + "goto while enum void const signed volatile"; function cppHook(stream, state) { if (!state.startOfLine) return false; for (;;) { if (stream.skipTo("\\")) { stream.next(); if (stream.eol()) { state.tokenize = cppHook; break; } } else { stream.skipToEnd(); state.tokenize = null; break; } } return "meta"; } // C#-style strings where "" escapes a quote. function tokenAtString(stream, state) { var next; while ((next = stream.next()) != null) { if (next == '"' && !stream.eat('"')) { state.tokenize = null; break; } } return "string"; } function def(mimes, mode) { var words = []; function add(obj) { if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) words.push(prop); } add(mode.keywords); add(mode.builtin); add(mode.atoms); if (words.length) { mode.helperType = mimes[0]; CodeMirror.registerHelper("hintWords", mimes[0], words); } for (var i = 0; i < mimes.length; ++i) CodeMirror.defineMIME(mimes[i], mode); } def(["text/x-csrc", "text/x-c", "text/x-chdr"], { name: "clike", keywords: words(cKeywords), blockKeywords: words("case do else for if switch while struct"), atoms: words("null"), hooks: {"#": cppHook}, modeProps: {fold: ["brace", "include"]} }); def(["text/x-c++src", "text/x-c++hdr"], { name: "clike", keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try bool explicit new " + "static_cast typeid catch operator template typename class friend private " + "this using const_cast inline public throw virtual delete mutable protected " + "wchar_t"), blockKeywords: words("catch class do else finally for if struct switch try while"), atoms: words("true false null"), hooks: {"#": cppHook}, modeProps: {fold: ["brace", "include"]} }); CodeMirror.defineMIME("text/x-java", { name: "clike", keywords: words("abstract assert boolean break byte case catch char class const continue default " + "do double else enum extends final finally float for goto if implements import " + "instanceof int interface long native new package private protected public " + "return short static strictfp super switch synchronized this throw throws transient " + "try void volatile while"), blockKeywords: words("catch class do else finally for if switch try while"), atoms: words("true false null"), hooks: { "@": function(stream) { stream.eatWhile(/[\w\$_]/); return "meta"; } }, modeProps: {fold: ["brace", "import"]} }); CodeMirror.defineMIME("text/x-csharp", { name: "clike", keywords: words("abstract as base break case catch checked class const continue" + " default delegate do else enum event explicit extern finally fixed for" + " foreach goto if implicit in interface internal is lock namespace new" + " operator out override params private protected public readonly ref return sealed" + " sizeof stackalloc static struct switch this throw try typeof unchecked" + " unsafe using virtual void volatile while add alias ascending descending dynamic from get" + " global group into join let orderby partial remove select set value var yield"), blockKeywords: words("catch class do else finally for foreach if struct switch try while"), builtin: words("Boolean Byte Char DateTime DateTimeOffset Decimal Double" + " Guid Int16 Int32 Int64 Object SByte Single String TimeSpan UInt16 UInt32" + " UInt64 bool byte char decimal double short int long object" + " sbyte float string ushort uint ulong"), atoms: words("true false null"), hooks: { "@": function(stream, state) { if (stream.eat('"')) { state.tokenize = tokenAtString; return tokenAtString(stream, state); } stream.eatWhile(/[\w\$_]/); return "meta"; } } }); CodeMirror.defineMIME("text/x-scala", { name: "clike", keywords: words( /* scala */ "abstract case catch class def do else extends false final finally for forSome if " + "implicit import lazy match new null object override package private protected return " + "sealed super this throw trait try trye type val var while with yield _ : = => <- <: " + "<% >: # @ " + /* package scala */ "assert assume require print println printf readLine readBoolean readByte readShort " + "readChar readInt readLong readFloat readDouble " + "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " + "Enumeration Equiv Error Exception Fractional Function IndexedSeq Integral Iterable " + "Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " + "Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " + "StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector :: #:: " + /* package java.lang */ "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" ), blockKeywords: words("catch class do else finally for forSome if match switch try while"), atoms: words("true false null"), hooks: { "@": function(stream) { stream.eatWhile(/[\w\$_]/); return "meta"; } } }); def(["x-shader/x-vertex", "x-shader/x-fragment"], { name: "clike", keywords: words("float int bool void " + "vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " + "mat2 mat3 mat4 " + "sampler1D sampler2D sampler3D samplerCube " + "sampler1DShadow sampler2DShadow" + "const attribute uniform varying " + "break continue discard return " + "for while do if else struct " + "in out inout"), blockKeywords: words("for while do if else struct"), builtin: words("radians degrees sin cos tan asin acos atan " + "pow exp log exp2 sqrt inversesqrt " + "abs sign floor ceil fract mod min max clamp mix step smootstep " + "length distance dot cross normalize ftransform faceforward " + "reflect refract matrixCompMult " + "lessThan lessThanEqual greaterThan greaterThanEqual " + "equal notEqual any all not " + "texture1D texture1DProj texture1DLod texture1DProjLod " + "texture2D texture2DProj texture2DLod texture2DProjLod " + "texture3D texture3DProj texture3DLod texture3DProjLod " + "textureCube textureCubeLod " + "shadow1D shadow2D shadow1DProj shadow2DProj " + "shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " + "dFdx dFdy fwidth " + "noise1 noise2 noise3 noise4"), atoms: words("true false " + "gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " + "gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " + "gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " + "gl_FogCoord " + "gl_Position gl_PointSize gl_ClipVertex " + "gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " + "gl_TexCoord gl_FogFragCoord " + "gl_FragCoord gl_FrontFacing " + "gl_FragColor gl_FragData gl_FragDepth " + "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " + "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " + "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " + "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " + "gl_ProjectionMatrixInverseTranspose " + "gl_ModelViewProjectionMatrixInverseTranspose " + "gl_TextureMatrixInverseTranspose " + "gl_NormalScale gl_DepthRange gl_ClipPlane " + "gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " + "gl_FrontLightModelProduct gl_BackLightModelProduct " + "gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " + "gl_FogParameters " + "gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " + "gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " + "gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " + "gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " + "gl_MaxDrawBuffers"), hooks: {"#": cppHook}, modeProps: {fold: ["brace", "include"]} }); }()); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/CodeMirror/mode/javascript.js ================================================ // TODO actually recognize syntax of TypeScript constructs CodeMirror.defineMode("javascript", function(config, parserConfig) { var indentUnit = config.indentUnit; var statementIndent = parserConfig.statementIndent; var jsonldMode = parserConfig.jsonld; var jsonMode = parserConfig.json || jsonldMode; var isTS = parserConfig.typescript; // Tokenizer var keywords = function(){ function kw(type) {return {type: type, style: "keyword"};} var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); var operator = kw("operator"), atom = {type: "atom", style: "atom"}; var jsKeywords = { "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, "debugger": C, "var": kw("var"), "const": kw("var"), "let": kw("var"), "function": kw("function"), "catch": kw("catch"), "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), "in": operator, "typeof": operator, "instanceof": operator, "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, "this": kw("this"), "module": kw("module"), "class": kw("class"), "super": kw("atom"), "yield": C, "export": kw("export"), "import": kw("import"), "extends": C }; // Extend the 'normal' keywords with the TypeScript language extensions if (isTS) { var type = {type: "variable", style: "variable-3"}; var tsKeywords = { // object-like things "interface": kw("interface"), "extends": kw("extends"), "constructor": kw("constructor"), // scope modifiers "public": kw("public"), "private": kw("private"), "protected": kw("protected"), "static": kw("static"), // types "string": type, "number": type, "bool": type, "any": type }; for (var attr in tsKeywords) { jsKeywords[attr] = tsKeywords[attr]; } } return jsKeywords; }(); var isOperatorChar = /[+\-*&%=<>!?|~^]/; var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; function readRegexp(stream) { var escaped = false, next, inSet = false; while ((next = stream.next()) != null) { if (!escaped) { if (next == "/" && !inSet) return; if (next == "[") inSet = true; else if (inSet && next == "]") inSet = false; } escaped = !escaped && next == "\\"; } } // Used as scratch variables to communicate multiple values without // consing up tons of objects. var type, content; function ret(tp, style, cont) { type = tp; content = cont; return style; } function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) { return ret("number", "number"); } else if (ch == "." && stream.match("..")) { return ret("spread", "meta"); } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { return ret(ch); } else if (ch == "=" && stream.eat(">")) { return ret("=>", "operator"); } else if (ch == "0" && stream.eat(/x/i)) { stream.eatWhile(/[\da-f]/i); return ret("number", "number"); } else if (/\d/.test(ch)) { stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); return ret("number", "number"); } else if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } else if (stream.eat("/")) { stream.skipToEnd(); return ret("comment", "comment"); } else if (state.lastType == "operator" || state.lastType == "keyword c" || state.lastType == "sof" || /^[\[{}\(,;:]$/.test(state.lastType)) { readRegexp(stream); stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla return ret("regexp", "string-2"); } else { stream.eatWhile(isOperatorChar); return ret("operator", "operator", stream.current()); } } else if (ch == "`") { state.tokenize = tokenQuasi; return tokenQuasi(stream, state); } else if (ch == "#") { stream.skipToEnd(); return ret("error", "error"); } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return ret("operator", "operator", stream.current()); } else { stream.eatWhile(/[\w\$_]/); var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; return (known && state.lastType != ".") ? ret(known.type, known.style, word) : ret("variable", "variable", word); } } function tokenString(quote) { return function(stream, state) { var escaped = false, next; if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ state.tokenize = tokenBase; return ret("jsonld-keyword", "meta"); } while ((next = stream.next()) != null) { if (next == quote && !escaped) break; escaped = !escaped && next == "\\"; } if (!escaped) state.tokenize = tokenBase; return ret("string", "string"); }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } function tokenQuasi(stream, state) { var escaped = false, next; while ((next = stream.next()) != null) { if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { state.tokenize = tokenBase; break; } escaped = !escaped && next == "\\"; } return ret("quasi", "string-2", stream.current()); } var brackets = "([{}])"; // This is a crude lookahead trick to try and notice that we're // parsing the argument patterns for a fat-arrow function before we // actually hit the arrow token. It only works if the arrow is on // the same line as the arguments and there's no strange noise // (comments) in between. Fallback is to only notice when we hit the // arrow, and not declare the arguments as locals for the arrow // body. function findFatArrow(stream, state) { if (state.fatArrowAt) state.fatArrowAt = null; var arrow = stream.string.indexOf("=>", stream.start); if (arrow < 0) return; var depth = 0, sawSomething = false; for (var pos = arrow - 1; pos >= 0; --pos) { var ch = stream.string.charAt(pos); var bracket = brackets.indexOf(ch); if (bracket >= 0 && bracket < 3) { if (!depth) { ++pos; break; } if (--depth == 0) break; } else if (bracket >= 3 && bracket < 6) { ++depth; } else if (/[$\w]/.test(ch)) { sawSomething = true; } else if (sawSomething && !depth) { ++pos; break; } } if (sawSomething && !depth) state.fatArrowAt = pos; } // Parser var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true}; function JSLexical(indented, column, type, align, prev, info) { this.indented = indented; this.column = column; this.type = type; this.prev = prev; this.info = info; if (align != null) this.align = align; } function inScope(state, varname) { for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true; for (var cx = state.context; cx; cx = cx.prev) { for (var v = cx.vars; v; v = v.next) if (v.name == varname) return true; } } function parseJS(state, style, type, content, stream) { var cc = state.cc; // Communicate our context to the combinators. // (Less wasteful than consing up a hundred closures on every call.) cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; while(true) { var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; if (combinator(type, content)) { while(cc.length && cc[cc.length - 1].lex) cc.pop()(); if (cx.marked) return cx.marked; if (type == "variable" && inScope(state, content)) return "variable-2"; return style; } } } // Combinator utils var cx = {state: null, column: null, marked: null, cc: null}; function pass() { for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function register(varname) { function inList(list) { for (var v = list; v; v = v.next) if (v.name == varname) return true; return false; } var state = cx.state; if (state.context) { cx.marked = "def"; if (inList(state.localVars)) return; state.localVars = {name: varname, next: state.localVars}; } else { if (inList(state.globalVars)) return; if (parserConfig.globalVars) state.globalVars = {name: varname, next: state.globalVars}; } } // Combinators var defaultVars = {name: "this", next: {name: "arguments"}}; function pushcontext() { cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; cx.state.localVars = defaultVars; } function popcontext() { cx.state.localVars = cx.state.context.vars; cx.state.context = cx.state.context.prev; } function pushlex(type, info) { var result = function() { var state = cx.state, indent = state.indented; if (state.lexical.type == "stat") indent = state.lexical.indented; state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); }; result.lex = true; return result; } function poplex() { var state = cx.state; if (state.lexical.prev) { if (state.lexical.type == ")") state.indented = state.lexical.indented; state.lexical = state.lexical.prev; } } poplex.lex = true; function expect(wanted) { return function(type) { if (type == wanted) return cont(); else if (wanted == ";") return pass(); else return cont(arguments.callee); }; } function statement(type, value) { if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex); if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); if (type == "keyword b") return cont(pushlex("form"), statement, poplex); if (type == "{") return cont(pushlex("}"), block, poplex); if (type == ";") return cont(); if (type == "if") return cont(pushlex("form"), expression, statement, poplex, maybeelse); if (type == "function") return cont(functiondef); if (type == "for") return cont(pushlex("form"), forspec, statement, poplex); if (type == "variable") return cont(pushlex("stat"), maybelabel); if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), block, poplex, poplex); if (type == "case") return cont(expression, expect(":")); if (type == "default") return cont(expect(":")); if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), statement, poplex, popcontext); if (type == "module") return cont(pushlex("form"), pushcontext, afterModule, popcontext, poplex); if (type == "class") return cont(pushlex("form"), className, objlit, poplex); if (type == "export") return cont(pushlex("form"), afterExport, poplex); if (type == "import") return cont(pushlex("form"), afterImport, poplex); return pass(pushlex("stat"), expression, expect(";"), poplex); } function expression(type) { return expressionInner(type, false); } function expressionNoComma(type) { return expressionInner(type, true); } function expressionInner(type, noComma) { if (cx.state.fatArrowAt == cx.stream.start) { var body = noComma ? arrowBodyNoComma : arrowBody; if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext); else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); } var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); if (type == "function") return cont(functiondef); if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression); if (type == "(") return cont(pushlex(")"), maybeexpression, comprehension, expect(")"), poplex, maybeop); if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); if (type == "{") return contCommasep(objprop, "}", null, maybeop); return cont(); } function maybeexpression(type) { if (type.match(/[;\}\)\],]/)) return pass(); return pass(expression); } function maybeexpressionNoComma(type) { if (type.match(/[;\}\)\],]/)) return pass(); return pass(expressionNoComma); } function maybeoperatorComma(type, value) { if (type == ",") return cont(expression); return maybeoperatorNoComma(type, value, false); } function maybeoperatorNoComma(type, value, noComma) { var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; var expr = noComma == false ? expression : expressionNoComma; if (value == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); if (type == "operator") { if (/\+\+|--/.test(value)) return cont(me); if (value == "?") return cont(expression, expect(":"), expr); return cont(expr); } if (type == "quasi") { cx.cc.push(me); return quasi(value); } if (type == ";") return; if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); if (type == ".") return cont(property, me); if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); } function quasi(value) { if (value.slice(value.length - 2) != "${") return cont(); return cont(expression, continueQuasi); } function continueQuasi(type) { if (type == "}") { cx.marked = "string-2"; cx.state.tokenize = tokenQuasi; return cont(); } } function arrowBody(type) { findFatArrow(cx.stream, cx.state); if (type == "{") return pass(statement); return pass(expression); } function arrowBodyNoComma(type) { findFatArrow(cx.stream, cx.state); if (type == "{") return pass(statement); return pass(expressionNoComma); } function maybelabel(type) { if (type == ":") return cont(poplex, statement); return pass(maybeoperatorComma, expect(";"), poplex); } function property(type) { if (type == "variable") {cx.marked = "property"; return cont();} } function objprop(type, value) { if (type == "variable") { cx.marked = "property"; if (value == "get" || value == "set") return cont(getterSetter); } else if (type == "number" || type == "string") { cx.marked = jsonldMode ? "property" : (type + " property"); } else if (type == "[") { return cont(expression, expect("]"), afterprop); } if (atomicTypes.hasOwnProperty(type)) return cont(afterprop); } function getterSetter(type) { if (type != "variable") return pass(afterprop); cx.marked = "property"; return cont(functiondef); } function afterprop(type) { if (type == ":") return cont(expressionNoComma); if (type == "(") return pass(functiondef); } function commasep(what, end) { function proceed(type) { if (type == ",") { var lex = cx.state.lexical; if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; return cont(what, proceed); } if (type == end) return cont(); return cont(expect(end)); } return function(type) { if (type == end) return cont(); return pass(what, proceed); }; } function contCommasep(what, end, info) { for (var i = 3; i < arguments.length; i++) cx.cc.push(arguments[i]); return cont(pushlex(end, info), commasep(what, end), poplex); } function block(type) { if (type == "}") return cont(); return pass(statement, block); } function maybetype(type) { if (isTS && type == ":") return cont(typedef); } function typedef(type) { if (type == "variable"){cx.marked = "variable-3"; return cont();} } function vardef() { return pass(pattern, maybetype, maybeAssign, vardefCont); } function pattern(type, value) { if (type == "variable") { register(value); return cont(); } if (type == "[") return contCommasep(pattern, "]"); if (type == "{") return contCommasep(proppattern, "}"); } function proppattern(type, value) { if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { register(value); return cont(maybeAssign); } if (type == "variable") cx.marked = "property"; return cont(expect(":"), pattern, maybeAssign); } function maybeAssign(_type, value) { if (value == "=") return cont(expressionNoComma); } function vardefCont(type) { if (type == ",") return cont(vardef); } function maybeelse(type, value) { if (type == "keyword b" && value == "else") return cont(pushlex("form"), statement, poplex); } function forspec(type) { if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex); } function forspec1(type) { if (type == "var") return cont(vardef, expect(";"), forspec2); if (type == ";") return cont(forspec2); if (type == "variable") return cont(formaybeinof); return pass(expression, expect(";"), forspec2); } function formaybeinof(_type, value) { if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } return cont(maybeoperatorComma, forspec2); } function forspec2(type, value) { if (type == ";") return cont(forspec3); if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } return pass(expression, expect(";"), forspec3); } function forspec3(type) { if (type != ")") cont(expression); } function functiondef(type, value) { if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} if (type == "variable") {register(value); return cont(functiondef);} if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, statement, popcontext); } function funarg(type) { if (type == "spread") return cont(funarg); return pass(pattern, maybetype); } function className(type, value) { if (type == "variable") {register(value); return cont(classNameAfter);} } function classNameAfter(_type, value) { if (value == "extends") return cont(expression); } function objlit(type) { if (type == "{") return contCommasep(objprop, "}"); } function afterModule(type, value) { if (type == "string") return cont(statement); if (type == "variable") { register(value); return cont(maybeFrom); } } function afterExport(_type, value) { if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } return pass(statement); } function afterImport(type) { if (type == "string") return cont(); return pass(importSpec, maybeFrom); } function importSpec(type, value) { if (type == "{") return contCommasep(importSpec, "}"); if (type == "variable") register(value); return cont(); } function maybeFrom(_type, value) { if (value == "from") { cx.marked = "keyword"; return cont(expression); } } function arrayLiteral(type) { if (type == "]") return cont(); return pass(expressionNoComma, maybeArrayComprehension); } function maybeArrayComprehension(type) { if (type == "for") return pass(comprehension, expect("]")); if (type == ",") return cont(commasep(expressionNoComma, "]")); return pass(commasep(expressionNoComma, "]")); } function comprehension(type) { if (type == "for") return cont(forspec, comprehension); if (type == "if") return cont(expression, comprehension); } // Interface return { startState: function(basecolumn) { var state = { tokenize: tokenBase, lastType: "sof", cc: [], lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), localVars: parserConfig.localVars, context: parserConfig.localVars && {vars: parserConfig.localVars}, indented: 0 }; if (parserConfig.globalVars) state.globalVars = parserConfig.globalVars; return state; }, token: function(stream, state) { if (stream.sol()) { if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; state.indented = stream.indentation(); findFatArrow(stream, state); } if (state.tokenize != tokenComment && stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (type == "comment") return style; state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; return parseJS(state, style, type, content, stream); }, indent: function(state, textAfter) { if (state.tokenize == tokenComment) return CodeMirror.Pass; if (state.tokenize != tokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; // Kludge to prevent 'maybelse' from blocking lexical scope pops for (var i = state.cc.length - 1; i >= 0; --i) { var c = state.cc[i]; if (c == poplex) lexical = lexical.prev; else if (c != maybeelse) break; } if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") lexical = lexical.prev; var type = lexical.type, closing = firstChar == type; if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0); else if (type == "form" && firstChar == "{") return lexical.indented; else if (type == "form") return lexical.indented + indentUnit; else if (type == "stat") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? statementIndent || indentUnit : 0); else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); else if (lexical.align) return lexical.column + (closing ? 0 : 1); else return lexical.indented + (closing ? 0 : indentUnit); }, electricChars: ":{}", blockCommentStart: jsonMode ? null : "/*", blockCommentEnd: jsonMode ? null : "*/", lineComment: jsonMode ? null : "//", fold: "brace", helperType: jsonMode ? "json" : "javascript", jsonldMode: jsonldMode, jsonMode: jsonMode }; }); CodeMirror.defineMIME("text/javascript", "javascript"); CodeMirror.defineMIME("text/ecmascript", "javascript"); CodeMirror.defineMIME("application/javascript", "javascript"); CodeMirror.defineMIME("application/ecmascript", "javascript"); CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true}); CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true}); CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Contests/list-categories-page.js ================================================ // TODO: Fix nesting problem function CategoryExpander() { var treeview, treeviewSelector, currentlySelectedId; var data = []; var firstLoad = true; var self; var init = function(treeView, treeViewSelector) { treeview = treeView; treeviewSelector = treeViewSelector; self = this; }; function onDataBound() { var categoryId; if (firstLoad && window.location.hash) { categoryId = getCategoryIdFromHash(); self.select(categoryId); firstLoad = false; } else { categoryId = currentlySelectedId; } var element = treeview.dataSource.get(categoryId); var nodeToSelect = { elementId: categoryId, elementName: element !== undefined ? element.NameUrl : null, uid: element !== undefined ? element.uid : null }; if (categoryId) { treeview.trigger('select', nodeToSelect); } } var categorySelected = function(e) { $("#contestsList").html(""); $("#contestsList").addClass("k-loading"); var elementId; var elementName; var elementNode; if (e.elementId) { elementId = parseInt(e.elementId); elementName = e.elementName; var el = treeview.dataSource.get(elementId); if (el) { elementNode = treeviewSelector.find('[data-uid=' + el.uid + ']'); } } else { elementNode = e.node; var element = treeview.dataItem(elementNode); elementId = element.Id; elementName = element.NameUrl; } if (elementNode) { treeview.expand(elementNode); } if (window.location.hash !== undefined && elementName) { window.location.hash = '!/List/ByCategory/' + elementId + '/' + elementName; } var ajaxUrl = "/Contests/List/ByCategory/" + elementId; $("#contestsList").load(ajaxUrl, function() { $("#contestsList").removeClass("k-loading"); }); }; var setNestingData = function(categoriesArray) { if (categoriesArray) { data = categoriesArray; } }; var expandSubcategories = function() { for (var i = 0; i < data.length; i++) { var id = data[i]; self.select(id); } }; var select = function(id) { currentlySelectedId = id; var el = treeview.dataSource.get(id); if (!el && data.indexOf(id) < 0) { var parentsUrl = "/Contests/List/GetParents/" + id; $.ajax({ url: parentsUrl, success: function(data) { self.setNestingData(data); self.expandSubcategories(); } }); } else if (el) { var element = treeviewSelector.find('[data-uid=' + el.uid + ']'); var elementObj = { elementId: id }; treeview.trigger('select', elementObj); treeview.expand(element); treeview.select(element); } }; var currentId = function() { return currentlySelectedId; }; return { expandSubcategories: expandSubcategories, select: select, currentId: currentId, setNestingData: setNestingData, onDataBound: onDataBound, categorySelected: categorySelected, init: init }; } function getCategoryIdFromHash() { var hash = window.location.hash; var categoryId = hash.split('/')[3]; return categoryId; } var expander = new CategoryExpander(); $(document).ready(function() { $(window).on("hashchange", function() { var categoryId = getCategoryIdFromHash(); if (expander && categoryId !== expander.currentId()) { expander.select(categoryId); } }); var treeviewSelector = $("#contestsCategories"); var treeview = treeviewSelector.data("kendoTreeView"); expander.init(treeview, treeviewSelector); }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Contests/submission-page.js ================================================ var countdownTimer = function (endingTime) { "use strict"; var endTime = new Date( endingTime.year, endingTime.month, endingTime.day, endingTime.hour, endingTime.minute, endingTime.second ); var ts = countdown(null, endTime, countdown.HOURS | countdown.MINUTES | countdown.SECONDS); var hoursContainer = $('#hours-remaining'); var minutesContainer = $('#minutes-remaining'); var secondsContainer = $('#seconds-remaining'); var countdownTimer = $('#countdown-timer'); var start = function () { updateCountdown(); var timerId = window.setInterval(function () { if (ts.hours === 0 && ts.minutes <= 4) { if (!countdownTimer.hasClass('countdown-warning')) { countdownTimer.addClass('countdown-warning'); } if (ts.start > ts.end) { window.clearInterval(timerId); // TODO: Handle contest over. } } updateCountdown(); ts = countdown(null, endTime, countdown.HOURS | countdown.MINUTES | countdown.SECONDS); }, 1000); }; function updateCountdown() { hoursContainer.text(ts.hours); minutesContainer.text(ts.minutes); secondsContainer.text(ts.seconds); countdownTimer.show(); } return { start: start }; }; function Notifier() { function showMessage(data) { var container = $("div[id^='notify-container']").filter(':visible'); var notification = $('
', { text: data.message, "class": data.cssClass, style: "display: none" }).appendTo(container); notification.show({ duration: 500 }); if (data.response) { var grid = $('#Submissions_' + data.response).getKendoGrid(); if (grid) { grid.dataSource.read(); } } setTimeout(function () { var dropdown = $("[id^=SubmissionsTabStrip-]").filter(':visible').find('input[id^="dropdown_"]').getKendoDropDownList(); dropdown.close(); notification.hide(500, function () { notification.remove(); }); }, 3500); } function notifySuccess(response) { var codeMirrorInstance = getCodeMirrorInstance(); codeMirrorInstance.setValue(""); showMessage({ message: "Успешно изпратено!", response: response, cssClass: "alert alert-success" }); } function notifyFailure(error) { showMessage({ message: error.statusText, cssClass: "alert alert-danger" }); } function notifyWarning(warning) { showMessage({ message: warning.statusText, cssClass: "alert alert-warning" }); } return { showMessage: showMessage, notifySuccess: notifySuccess, notifyFailure: notifyFailure, notifyWarning: notifyWarning }; } // update the code mirror textarea to display the submission content - not used // $("#SubmissionsTabStrip").on("click", ".view-source-button", function () { // var submissionId = $(this).data("submission-id"); // // $.get("/Contests/Compete/GetSubmissionContent/" + submissionId, function (response) { // var codeMirrorInstance = getCodeMirrorInstance(); // codeMirrorInstance.setValue(response); // }).fail(function (err) { // notifyFailure(err); // }); // }); function getCodeMirrorInstance() { var codeMirrorContainer = $(".CodeMirror:visible").siblings('textarea')[0]; var codeMirrorInstance = $.data(codeMirrorContainer, 'CodeMirrorInstance'); return codeMirrorInstance; } var displayMaximumValues = function(maxMemory, maxTime, memoryString, timeString) { var memoryInMb = (maxMemory / 1024 / 1024).toFixed(2); var maxTimeInSeconds = (maxTime / 1000).toFixed(3); var result = memoryString + ": " + memoryInMb + " MB
" + timeString + ": " + maxTimeInSeconds + " s"; return result; }; function validateSubmissionContent() { var codeMirrorInstance = getCodeMirrorInstance(); var codeMirrorText = codeMirrorInstance.getValue(); if (!codeMirrorText || codeMirrorText.length < 5) { messageNotifier.showMessage({ message: "Решението трябва да съдържа поне 5 символа!", cssClass: "alert alert-warning" }); return false; } return true; } function validateBinaryFileExists(fileInput) { if (!fileInput.files[0]) { messageNotifier.notifyWarning({ statusText: 'Моля изберете файл, който да изпратите.' }); return false; } return true; } function validateBinaryFileSize(fileInput, size) { if (!size) { return true; } var file = fileInput.files[0]; if (file && file.size > size) { messageNotifier.notifyWarning({ statusText: 'Избраният файл е твърде голям. Моля, изберете файл с по-малък размер.' }); return false; } return true; } function validateBinaryFileAllowedExtensions(fileInput, extensions) { var fileName = fileInput.files[0].name; var fileExtension = fileName.split('.')[fileName.split('.').length - 1].toLowerCase(); if (!extensions || extensions.length == 0) { return true; } if ($.inArray(fileExtension, extensions) < 0) { messageNotifier.notifyWarning({ statusText: 'Избраният тип файл не е позволен. Разрешените формати са: ' + extensions.join(',') + '.' }); return false; } return true; } var messageNotifier = new Notifier(); // validate the submission time var submissionTimeValidator = function() { var lastSubmissionTime; var currentServerTime; function validate(lastSubmit, limitBetweenSubmissions, serverTime) { if (!lastSubmissionTime) { lastSubmissionTime = lastSubmit; } if (!currentServerTime) { currentServerTime = serverTime; setInterval(function() { currentServerTime = new Date(currentServerTime.getTime() + 1000); }, 1000); } var currentTime = currentServerTime; var secondsForLastSubmission = (currentTime - lastSubmissionTime) / 1000; if (!lastSubmissionTime) { lastSubmissionTime = currentServerTime; return true; } var differenceBetweenSubmissionAndLimit = parseInt(limitBetweenSubmissions - secondsForLastSubmission); if (differenceBetweenSubmissionAndLimit > 0) { messageNotifier.showMessage({ message: "Моля изчакайте още " + differenceBetweenSubmissionAndLimit + " секунди преди да изпратите решение.", cssClass: "alert alert-warning" }); return false; } lastSubmissionTime = currentServerTime; return true; } return { validate: validate }; }; var tabStripManager = new TabStripManager(); function TabStripManager() { var tabStrip; var index = 0; var self; function init(tabstrip) { self = this; tabStrip = tabstrip; tabStrip = $("#SubmissionsTabStrip").data("kendoTabStrip"); if (tabstrip) { var hashIndex = getSelectedIndexFromHashtag(); if (!hashIndex) { hashIndex = 0; } selectTabWithIndex(hashIndex); } } function selectTabWithIndex(ind) { tabStrip.select(ind); index = ind; } function tabSelected() { if (tabStrip) { var selectedIndex = tabStrip.select().index(); window.location.hash = selectedIndex; } } function onContentLoad() { createCodeMirrorForTextBox(); var hashTag = getSelectedIndexFromHashtag(); selectTabWithIndex(hashTag); }; function createCodeMirrorForTextBox() { var element = $('.code-for-problem:visible')[0]; if (!$(element).data('CodeMirrorInstance')) { var editor = new CodeMirror.fromTextArea(element, { lineNumbers: true, matchBrackets: true, mode: "text/x-csharp", theme: "the-matrix", showCursorWhenSelecting: true, undoDepth: 100, lineWrapping: true, }); $.data(element, 'CodeMirrorInstance', editor); } }; function currentIndex() { return index; } return { selectTabWithIndex: selectTabWithIndex, tabSelected: tabSelected, onContentLoad: onContentLoad, currentIndex: currentIndex, init: init }; } function getSelectedIndexFromHashtag() { return parseInt(window.location.hash.substr(1)); } $(document).ready(function() { $(window).on("hashchange", function() { var hashIndex = getSelectedIndexFromHashtag(); if (hashIndex !== tabStripManager.currentIndex()) { tabStripManager.selectTabWithIndex(hashIndex); } }); var tabStrip = $("#SubmissionsTabStrip").data("kendoTabStrip"); tabStripManager.init(tabStrip); }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/Helpers/test-results.js ================================================ var displayTestRuns = function (testRuns) { "use strict"; var result = ""; var i; for (i = 0; i < testRuns.length; i++) { if (testRuns[i].IsTrialTest) { continue; } switch (testRuns[i].ExecutionResult) { case 0: result += ''; break; case 1: result += ''; break; case 2: result += ''; break; case 3: result += ''; break; case 4: result += ''; break; } } result += " "; return result; }; function testResult(tests, points, problemMaximumPoints, maxUsedMemory, maxUsedTime, processed, isCompiledSuccessfully, submissionType) { var result = ''; if (!processed) { result += ''; result += ' Обработва се...'; } else if (!isCompiledSuccessfully) { result += ''; result += ' Грешка при компилация'; } else { result += "
" + points + " / " + problemMaximumPoints + "" + " " + (maxUsedMemory / 1024 / 1024).toFixed(2) + " MB | " + (maxUsedTime / 1000).toFixed(3) + " sec. | " + submissionType + "
"; result += displayTestRuns(tests); } return result; }; ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/KendoUI/2014.3.1411/cultures/kendo.culture.bg.js ================================================ /* * Kendo UI v2014.3.1411 (http://www.telerik.com/kendo-ui) * Copyright 2015 Telerik AD. All rights reserved. * * Kendo UI commercial licenses may be obtained at * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete * If you do not own a commercial license, this file shall be governed by the trial license terms. */ (function(f, define){ define([], f); })(function(){ (function( window, undefined ) { var kendo = window.kendo || (window.kendo = { cultures: {} }); kendo.cultures["bg"] = { name: "bg", numberFormat: { pattern: ["-n"], decimals: 2, ",": " ", ".": ",", groupSize: [3], percent: { pattern: ["-n %","n %"], decimals: 2, ",": " ", ".": ",", groupSize: [3], symbol: "%" }, currency: { pattern: ["-n $","n $"], decimals: 2, ",": " ", ".": ",", groupSize: [3], symbol: "лв." } }, calendars: { standard: { days: { names: ["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"], namesAbbr: ["нед","пон","вт","ср","четв","пет","съб"], namesShort: ["н","п","в","с","ч","п","с"] }, months: { names: ["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември",""], namesAbbr: ["ян","февр","март","апр","май","юни","юли","авг","септ","окт","ноември","дек",""] }, AM: [""], PM: [""], patterns: { d: "d.M.yyyy 'г.'", D: "dd MMMM yyyy 'г.'", F: "dd MMMM yyyy 'г.' HH:mm:ss 'ч.'", g: "d.M.yyyy 'г.' HH:mm 'ч.'", G: "d.M.yyyy 'г.' HH:mm:ss 'ч.'", m: "dd MMMM", M: "dd MMMM", s: "yyyy'-'MM'-'dd'T'HH':'mm':'ss", t: "HH:mm 'ч.'", T: "HH:mm:ss 'ч.'", u: "yyyy'-'MM'-'dd HH':'mm':'ss'Z'", y: "MMMM yyyy 'г.'", Y: "MMMM yyyy 'г.'" }, "/": ".", ":": ":", firstDay: 1 } } } })(this); return window.kendo; }, typeof define == 'function' && define.amd ? define : function(_, f){ f(); }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/KendoUI/2014.3.1411/cultures/kendo.culture.en-GB.js ================================================ /* * Kendo UI v2014.3.1411 (http://www.telerik.com/kendo-ui) * Copyright 2015 Telerik AD. All rights reserved. * * Kendo UI commercial licenses may be obtained at * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete * If you do not own a commercial license, this file shall be governed by the trial license terms. */ (function(f, define){ define([], f); })(function(){ (function( window, undefined ) { var kendo = window.kendo || (window.kendo = { cultures: {} }); kendo.cultures["en-GB"] = { name: "en-GB", numberFormat: { pattern: ["-n"], decimals: 2, ",": ",", ".": ".", groupSize: [3], percent: { pattern: ["-n %","n %"], decimals: 2, ",": ",", ".": ".", groupSize: [3], symbol: "%" }, currency: { pattern: ["-$n","$n"], decimals: 2, ",": ",", ".": ".", groupSize: [3], symbol: "£" } }, calendars: { standard: { days: { names: ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], namesAbbr: ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"], namesShort: ["Su","Mo","Tu","We","Th","Fr","Sa"] }, months: { names: ["January","February","March","April","May","June","July","August","September","October","November","December",""], namesAbbr: ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""] }, AM: ["AM","am","AM"], PM: ["PM","pm","PM"], patterns: { d: "dd/MM/yyyy", D: "dd MMMM yyyy", F: "dd MMMM yyyy HH:mm:ss", g: "dd/MM/yyyy HH:mm", G: "dd/MM/yyyy HH:mm:ss", m: "dd MMMM", M: "dd MMMM", s: "yyyy'-'MM'-'dd'T'HH':'mm':'ss", t: "HH:mm", T: "HH:mm:ss", u: "yyyy'-'MM'-'dd HH':'mm':'ss'Z'", y: "MMMM yyyy", Y: "MMMM yyyy" }, "/": "/", ":": ":", firstDay: 1 } } } })(this); return window.kendo; }, typeof define == 'function' && define.amd ? define : function(_, f){ f(); }); ================================================ FILE: Open Judge System/Web/OJS.Web/Scripts/KendoUI/2014.3.1411/kendo.all.js ================================================ /* * Kendo UI v2014.3.1411 (http://www.telerik.com/kendo-ui) * Copyright 2015 Telerik AD. All rights reserved. * * Kendo UI commercial licenses may be obtained at * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete * If you do not own a commercial license, this file shall be governed by the trial license terms. */ (function(f, define){ define([], f); })(function(){ /*jshint eqnull: true, loopfunc: true, evil: true, boss: true, freeze: false*/ (function($, window, undefined) { var kendo = window.kendo = window.kendo || { cultures: {} }, extend = $.extend, each = $.each, isArray = $.isArray, proxy = $.proxy, noop = $.noop, math = Math, Template, JSON = window.JSON || {}, support = {}, percentRegExp = /%/, formatRegExp = /\{(\d+)(:[^\}]+)?\}/g, boxShadowRegExp = /(\d+(?:\.?)\d*)px\s*(\d+(?:\.?)\d*)px\s*(\d+(?:\.?)\d*)px\s*(\d+)?/i, numberRegExp = /^(\+|-?)\d+(\.?)\d*$/, FUNCTION = "function", STRING = "string", NUMBER = "number", OBJECT = "object", NULL = "null", BOOLEAN = "boolean", UNDEFINED = "undefined", getterCache = {}, setterCache = {}, slice = [].slice, globalize = window.Globalize; kendo.version = "2014.3.1411"; function Class() {} Class.extend = function(proto) { var base = function() {}, member, that = this, subclass = proto && proto.init ? proto.init : function () { that.apply(this, arguments); }, fn; base.prototype = that.prototype; fn = subclass.fn = subclass.prototype = new base(); for (member in proto) { if (proto[member] != null && proto[member].constructor === Object) { // Merge object members fn[member] = extend(true, {}, base.prototype[member], proto[member]); } else { fn[member] = proto[member]; } } fn.constructor = subclass; subclass.extend = that.extend; return subclass; }; Class.prototype._initOptions = function(options) { this.options = deepExtend({}, this.options, options); }; var isFunction = kendo.isFunction = function(fn) { return typeof fn === "function"; }; var preventDefault = function() { this._defaultPrevented = true; }; var isDefaultPrevented = function() { return this._defaultPrevented === true; }; var Observable = Class.extend({ init: function() { this._events = {}; }, bind: function(eventName, handlers, one) { var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, original, handler, handlersIsFunction = typeof handlers === FUNCTION, events; if (handlers === undefined) { for (idx in eventName) { that.bind(idx, eventName[idx]); } return that; } for (idx = 0, length = eventNames.length; idx < length; idx++) { eventName = eventNames[idx]; handler = handlersIsFunction ? handlers : handlers[eventName]; if (handler) { if (one) { original = handler; handler = function() { that.unbind(eventName, handler); original.apply(that, arguments); }; handler.original = original; } events = that._events[eventName] = that._events[eventName] || []; events.push(handler); } } return that; }, one: function(eventNames, handlers) { return this.bind(eventNames, handlers, true); }, first: function(eventName, handlers) { var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, handler, handlersIsFunction = typeof handlers === FUNCTION, events; for (idx = 0, length = eventNames.length; idx < length; idx++) { eventName = eventNames[idx]; handler = handlersIsFunction ? handlers : handlers[eventName]; if (handler) { events = that._events[eventName] = that._events[eventName] || []; events.unshift(handler); } } return that; }, trigger: function(eventName, e) { var that = this, events = that._events[eventName], idx, length; if (events) { e = e || {}; e.sender = that; e._defaultPrevented = false; e.preventDefault = preventDefault; e.isDefaultPrevented = isDefaultPrevented; events = events.slice(); for (idx = 0, length = events.length; idx < length; idx++) { events[idx].call(that, e); } return e._defaultPrevented === true; } return false; }, unbind: function(eventName, handler) { var that = this, events = that._events[eventName], idx; if (eventName === undefined) { that._events = {}; } else if (events) { if (handler) { for (idx = events.length - 1; idx >= 0; idx--) { if (events[idx] === handler || events[idx].original === handler) { events.splice(idx, 1); } } } else { that._events[eventName] = []; } } return that; } }); function compilePart(part, stringPart) { if (stringPart) { return "'" + part.split("'").join("\\'") .split('\\"').join('\\\\\\"') .replace(/\n/g, "\\n") .replace(/\r/g, "\\r") .replace(/\t/g, "\\t") + "'"; } else { var first = part.charAt(0), rest = part.substring(1); if (first === "=") { return "+(" + rest + ")+"; } else if (first === ":") { return "+$kendoHtmlEncode(" + rest + ")+"; } else { return ";" + part + ";$kendoOutput+="; } } } var argumentNameRegExp = /^\w+/, encodeRegExp = /\$\{([^}]*)\}/g, escapedCurlyRegExp = /\\\}/g, curlyRegExp = /__CURLY__/g, escapedSharpRegExp = /\\#/g, sharpRegExp = /__SHARP__/g, zeros = ["", "0", "00", "000", "0000"]; Template = { paramName: "data", // name of the parameter of the generated template useWithBlock: true, // whether to wrap the template in a with() block render: function(template, data) { var idx, length, html = ""; for (idx = 0, length = data.length; idx < length; idx++) { html += template(data[idx]); } return html; }, compile: function(template, options) { var settings = extend({}, this, options), paramName = settings.paramName, argumentName = paramName.match(argumentNameRegExp)[0], useWithBlock = settings.useWithBlock, functionBody = "var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;", fn, parts, idx; if (isFunction(template)) { return template; } functionBody += useWithBlock ? "with(" + paramName + "){" : ""; functionBody += "$kendoOutput="; parts = template .replace(escapedCurlyRegExp, "__CURLY__") .replace(encodeRegExp, "#=$kendoHtmlEncode($1)#") .replace(curlyRegExp, "}") .replace(escapedSharpRegExp, "__SHARP__") .split("#"); for (idx = 0; idx < parts.length; idx ++) { functionBody += compilePart(parts[idx], idx % 2 === 0); } functionBody += useWithBlock ? ";}" : ";"; functionBody += "return $kendoOutput;"; functionBody = functionBody.replace(sharpRegExp, "#"); try { fn = new Function(argumentName, functionBody); fn._slotCount = Math.floor(parts.length / 2); return fn; } catch(e) { throw new Error(kendo.format("Invalid template:'{0}' Generated code:'{1}'", template, functionBody)); } } }; function pad(number, digits, end) { number = number + ""; digits = digits || 2; end = digits - number.length; if (end) { return zeros[digits].substring(0, end) + number; } return number; } //JSON stringify (function() { var escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", "\"" : '\\"', "\\": "\\\\" }, rep, toString = {}.toString; if (typeof Date.prototype.toJSON !== FUNCTION) { Date.prototype.toJSON = function () { var that = this; return isFinite(that.valueOf()) ? pad(that.getUTCFullYear(), 4) + "-" + pad(that.getUTCMonth() + 1) + "-" + pad(that.getUTCDate()) + "T" + pad(that.getUTCHours()) + ":" + pad(that.getUTCMinutes()) + ":" + pad(that.getUTCSeconds()) + "Z" : null; }; String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function () { return this.valueOf(); }; } function quote(string) { escapable.lastIndex = 0; return escapable.test(string) ? "\"" + string.replace(escapable, function (a) { var c = meta[a]; return typeof c === STRING ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); }) + "\"" : "\"" + string + "\""; } function str(key, holder) { var i, k, v, length, mind = gap, partial, value = holder[key], type; if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) { value = value.toJSON(key); } if (typeof rep === FUNCTION) { value = rep.call(holder, key, value); } type = typeof value; if (type === STRING) { return quote(value); } else if (type === NUMBER) { return isFinite(value) ? String(value) : NULL; } else if (type === BOOLEAN || type === NULL) { return String(value); } else if (type === OBJECT) { if (!value) { return NULL; } gap += indent; partial = []; if (toString.apply(value) === "[object Array]") { length = value.length; for (i = 0; i < length; i++) { partial[i] = str(i, value) || NULL; } v = partial.length === 0 ? "[]" : gap ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" : "[" + partial.join(",") + "]"; gap = mind; return v; } if (rep && typeof rep === OBJECT) { length = rep.length; for (i = 0; i < length; i++) { if (typeof rep[i] === STRING) { k = rep[i]; v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ": " : ":") + v); } } } } else { for (k in value) { if (Object.hasOwnProperty.call(value, k)) { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ": " : ":") + v); } } } } v = partial.length === 0 ? "{}" : gap ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" : "{" + partial.join(",") + "}"; gap = mind; return v; } } if (typeof JSON.stringify !== FUNCTION) { JSON.stringify = function (value, replacer, space) { var i; gap = ""; indent = ""; if (typeof space === NUMBER) { for (i = 0; i < space; i += 1) { indent += " "; } } else if (typeof space === STRING) { indent = space; } rep = replacer; if (replacer && typeof replacer !== FUNCTION && (typeof replacer !== OBJECT || typeof replacer.length !== NUMBER)) { throw new Error("JSON.stringify"); } return str("", {"": value}); }; } })(); // Date and Number formatting (function() { var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|"[^"]*"|'[^']*'/g, standardFormatRegExp = /^(n|c|p|e)(\d*)$/i, literalRegExp = /(\\.)|(['][^']*[']?)|(["][^"]*["]?)/g, commaRegExp = /\,/g, EMPTY = "", POINT = ".", COMMA = ",", SHARP = "#", ZERO = "0", PLACEHOLDER = "??", EN = "en-US", objectToString = {}.toString; //cultures kendo.cultures["en-US"] = { name: EN, numberFormat: { pattern: ["-n"], decimals: 2, ",": ",", ".": ".", groupSize: [3], percent: { pattern: ["-n %", "n %"], decimals: 2, ",": ",", ".": ".", groupSize: [3], symbol: "%" }, currency: { pattern: ["($n)", "$n"], decimals: 2, ",": ",", ".": ".", groupSize: [3], symbol: "$" } }, calendars: { standard: { days: { names: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], namesAbbr: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], namesShort: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ] }, months: { names: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], namesAbbr: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] }, AM: [ "AM", "am", "AM" ], PM: [ "PM", "pm", "PM" ], patterns: { d: "M/d/yyyy", D: "dddd, MMMM dd, yyyy", F: "dddd, MMMM dd, yyyy h:mm:ss tt", g: "M/d/yyyy h:mm tt", G: "M/d/yyyy h:mm:ss tt", m: "MMMM dd", M: "MMMM dd", s: "yyyy'-'MM'-'ddTHH':'mm':'ss", t: "h:mm tt", T: "h:mm:ss tt", u: "yyyy'-'MM'-'dd HH':'mm':'ss'Z'", y: "MMMM, yyyy", Y: "MMMM, yyyy" }, "/": "/", ":": ":", firstDay: 0, twoDigitYearMax: 2029 } } }; function findCulture(culture) { if (culture) { if (culture.numberFormat) { return culture; } if (typeof culture === STRING) { var cultures = kendo.cultures; return cultures[culture] || cultures[culture.split("-")[0]] || null; } return null; } return null; } function getCulture(culture) { if (culture) { culture = findCulture(culture); } return culture || kendo.cultures.current; } function expandNumberFormat(numberFormat) { numberFormat.groupSizes = numberFormat.groupSize; numberFormat.percent.groupSizes = numberFormat.percent.groupSize; numberFormat.currency.groupSizes = numberFormat.currency.groupSize; } kendo.culture = function(cultureName) { var cultures = kendo.cultures, culture; if (cultureName !== undefined) { culture = findCulture(cultureName) || cultures[EN]; culture.calendar = culture.calendars.standard; cultures.current = culture; if (globalize && !globalize.load) { expandNumberFormat(culture.numberFormat); } } else { return cultures.current; } }; kendo.findCulture = findCulture; kendo.getCulture = getCulture; //set current culture to en-US. kendo.culture(EN); function formatDate(date, format, culture) { culture = getCulture(culture); var calendar = culture.calendars.standard, days = calendar.days, months = calendar.months; format = calendar.patterns[format] || format; return format.replace(dateFormatRegExp, function (match) { var minutes; var result; var sign; if (match === "d") { result = date.getDate(); } else if (match === "dd") { result = pad(date.getDate()); } else if (match === "ddd") { result = days.namesAbbr[date.getDay()]; } else if (match === "dddd") { result = days.names[date.getDay()]; } else if (match === "M") { result = date.getMonth() + 1; } else if (match === "MM") { result = pad(date.getMonth() + 1); } else if (match === "MMM") { result = months.namesAbbr[date.getMonth()]; } else if (match === "MMMM") { result = months.names[date.getMonth()]; } else if (match === "yy") { result = pad(date.getFullYear() % 100); } else if (match === "yyyy") { result = pad(date.getFullYear(), 4); } else if (match === "h" ) { result = date.getHours() % 12 || 12; } else if (match === "hh") { result = pad(date.getHours() % 12 || 12); } else if (match === "H") { result = date.getHours(); } else if (match === "HH") { result = pad(date.getHours()); } else if (match === "m") { result = date.getMinutes(); } else if (match === "mm") { result = pad(date.getMinutes()); } else if (match === "s") { result = date.getSeconds(); } else if (match === "ss") { result = pad(date.getSeconds()); } else if (match === "f") { result = math.floor(date.getMilliseconds() / 100); } else if (match === "ff") { result = date.getMilliseconds(); if (result > 99) { result = math.floor(result / 10); } result = pad(result); } else if (match === "fff") { result = pad(date.getMilliseconds(), 3); } else if (match === "tt") { result = date.getHours() < 12 ? calendar.AM[0] : calendar.PM[0]; } else if (match === "zzz") { minutes = date.getTimezoneOffset(); sign = minutes < 0; result = math.abs(minutes / 60).toString().split(".")[0]; minutes = math.abs(minutes) - (result * 60); result = (sign ? "+" : "-") + pad(result); result += ":" + pad(minutes); } else if (match === "zz" || match === "z") { result = date.getTimezoneOffset() / 60; sign = result < 0; result = math.abs(result).toString().split(".")[0]; result = (sign ? "+" : "-") + (match === "zz" ? pad(result) : result); } return result !== undefined ? result : match.slice(1, match.length - 1); }); } //number formatting function formatNumber(number, format, culture) { culture = getCulture(culture); var numberFormat = culture.numberFormat, groupSize = numberFormat.groupSize[0], groupSeparator = numberFormat[COMMA], decimal = numberFormat[POINT], precision = numberFormat.decimals, pattern = numberFormat.pattern[0], literals = [], symbol, isCurrency, isPercent, customPrecision, formatAndPrecision, negative = number < 0, integer, fraction, integerLength, fractionLength, replacement = EMPTY, value = EMPTY, idx, length, ch, hasGroup, hasNegativeFormat, decimalIndex, sharpIndex, zeroIndex, hasZero, hasSharp, percentIndex, currencyIndex, startZeroIndex, start = -1, end; //return empty string if no number if (number === undefined) { return EMPTY; } if (!isFinite(number)) { return number; } //if no format then return number.toString() or number.toLocaleString() if culture.name is not defined if (!format) { return culture.name.length ? number.toLocaleString() : number.toString(); } formatAndPrecision = standardFormatRegExp.exec(format); // standard formatting if (formatAndPrecision) { format = formatAndPrecision[1].toLowerCase(); isCurrency = format === "c"; isPercent = format === "p"; if (isCurrency || isPercent) { //get specific number format information if format is currency or percent numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent; groupSize = numberFormat.groupSize[0]; groupSeparator = numberFormat[COMMA]; decimal = numberFormat[POINT]; precision = numberFormat.decimals; symbol = numberFormat.symbol; pattern = numberFormat.pattern[negative ? 0 : 1]; } customPrecision = formatAndPrecision[2]; if (customPrecision) { precision = +customPrecision; } //return number in exponential format if (format === "e") { return customPrecision ? number.toExponential(precision) : number.toExponential(); // toExponential() and toExponential(undefined) differ in FF #653438. } // multiply if format is percent if (isPercent) { number *= 100; } number = round(number, precision); negative = number < 0; number = number.split(POINT); integer = number[0]; fraction = number[1]; //exclude "-" if number is negative. if (negative) { integer = integer.substring(1); } value = integer; integerLength = integer.length; //add group separator to the number if it is longer enough if (integerLength >= groupSize) { value = EMPTY; for (idx = 0; idx < integerLength; idx++) { if (idx > 0 && (integerLength - idx) % groupSize === 0) { value += groupSeparator; } value += integer.charAt(idx); } } if (fraction) { value += decimal + fraction; } if (format === "n" && !negative) { return value; } number = EMPTY; for (idx = 0, length = pattern.length; idx < length; idx++) { ch = pattern.charAt(idx); if (ch === "n") { number += value; } else if (ch === "$" || ch === "%") { number += symbol; } else { number += ch; } } return number; } //custom formatting // //separate format by sections. //make number positive if (negative) { number = -number; } if (format.indexOf("'") > -1 || format.indexOf("\"") > -1 || format.indexOf("\\") > -1) { format = format.replace(literalRegExp, function (match) { var quoteChar = match.charAt(0).replace("\\", ""), literal = match.slice(1).replace(quoteChar, ""); literals.push(literal); return PLACEHOLDER; }); } format = format.split(";"); if (negative && format[1]) { //get negative format format = format[1]; hasNegativeFormat = true; } else if (number === 0) { //format for zeros format = format[2] || format[0]; if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) { //return format if it is string constant. return format; } } else { format = format[0]; } percentIndex = format.indexOf("%"); currencyIndex = format.indexOf("$"); isPercent = percentIndex != -1; isCurrency = currencyIndex != -1; //multiply number if the format has percent if (isPercent) { number *= 100; } if (isCurrency && format[currencyIndex - 1] === "\\") { format = format.split("\\").join(""); isCurrency = false; } if (isCurrency || isPercent) { //get specific number format information if format is currency or percent numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent; groupSize = numberFormat.groupSize[0]; groupSeparator = numberFormat[COMMA]; decimal = numberFormat[POINT]; precision = numberFormat.decimals; symbol = numberFormat.symbol; } hasGroup = format.indexOf(COMMA) > -1; if (hasGroup) { format = format.replace(commaRegExp, EMPTY); } decimalIndex = format.indexOf(POINT); length = format.length; if (decimalIndex != -1) { fraction = number.toString().split("e"); if (fraction[1]) { fraction = round(number, Math.abs(fraction[1])); } else { fraction = fraction[0]; } fraction = fraction.split(POINT)[1] || EMPTY; zeroIndex = format.lastIndexOf(ZERO) - decimalIndex; sharpIndex = format.lastIndexOf(SHARP) - decimalIndex; hasZero = zeroIndex > -1; hasSharp = sharpIndex > -1; idx = fraction.length; if (!hasZero && !hasSharp) { format = format.substring(0, decimalIndex) + format.substring(decimalIndex + 1); length = format.length; decimalIndex = -1; idx = 0; } if (hasZero && zeroIndex > sharpIndex) { idx = zeroIndex; } else if (sharpIndex > zeroIndex) { if (hasSharp && idx > sharpIndex) { idx = sharpIndex; } else if (hasZero && idx < zeroIndex) { idx = zeroIndex; } } if (idx > -1) { number = round(number, idx); } } else { number = round(number); } sharpIndex = format.indexOf(SHARP); startZeroIndex = zeroIndex = format.indexOf(ZERO); //define the index of the first digit placeholder if (sharpIndex == -1 && zeroIndex != -1) { start = zeroIndex; } else if (sharpIndex != -1 && zeroIndex == -1) { start = sharpIndex; } else { start = sharpIndex > zeroIndex ? zeroIndex : sharpIndex; } sharpIndex = format.lastIndexOf(SHARP); zeroIndex = format.lastIndexOf(ZERO); //define the index of the last digit placeholder if (sharpIndex == -1 && zeroIndex != -1) { end = zeroIndex; } else if (sharpIndex != -1 && zeroIndex == -1) { end = sharpIndex; } else { end = sharpIndex > zeroIndex ? sharpIndex : zeroIndex; } if (start == length) { end = start; } if (start != -1) { value = number.toString().split(POINT); integer = value[0]; fraction = value[1] || EMPTY; integerLength = integer.length; fractionLength = fraction.length; if (negative && (number * -1) >= 0) { negative = false; } //add group separator to the number if it is longer enough if (hasGroup) { if (integerLength === groupSize && integerLength < decimalIndex - startZeroIndex) { integer = groupSeparator + integer; } else if (integerLength > groupSize) { value = EMPTY; for (idx = 0; idx < integerLength; idx++) { if (idx > 0 && (integerLength - idx) % groupSize === 0) { value += groupSeparator; } value += integer.charAt(idx); } integer = value; } } number = format.substring(0, start); if (negative && !hasNegativeFormat) { number += "-"; } for (idx = start; idx < length; idx++) { ch = format.charAt(idx); if (decimalIndex == -1) { if (end - idx < integerLength) { number += integer; break; } } else { if (zeroIndex != -1 && zeroIndex < idx) { replacement = EMPTY; } if ((decimalIndex - idx) <= integerLength && decimalIndex - idx > -1) { number += integer; idx = decimalIndex; } if (decimalIndex === idx) { number += (fraction ? decimal : EMPTY) + fraction; idx += end - decimalIndex + 1; continue; } } if (ch === ZERO) { number += ch; replacement = ch; } else if (ch === SHARP) { number += replacement; } } if (end >= start) { number += format.substring(end + 1); } //replace symbol placeholders if (isCurrency || isPercent) { value = EMPTY; for (idx = 0, length = number.length; idx < length; idx++) { ch = number.charAt(idx); value += (ch === "$" || ch === "%") ? symbol : ch; } number = value; } length = literals.length; if (length) { for (idx = 0; idx < length; idx++) { number = number.replace(PLACEHOLDER, literals[idx]); } } } return number; } var round = function(value, precision) { precision = precision || 0; value = value.toString().split('e'); value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + precision) : precision))); value = value.toString().split('e'); value = +(value[0] + 'e' + (value[1] ? (+value[1] - precision) : -precision)); return value.toFixed(precision); }; var toString = function(value, fmt, culture) { if (fmt) { if (objectToString.call(value) === "[object Date]") { return formatDate(value, fmt, culture); } else if (typeof value === NUMBER) { return formatNumber(value, fmt, culture); } } return value !== undefined ? value : ""; }; if (globalize && !globalize.load) { toString = function(value, format, culture) { if ($.isPlainObject(culture)) { culture = culture.name; } return globalize.format(value, format, culture); }; } kendo.format = function(fmt) { var values = arguments; return fmt.replace(formatRegExp, function(match, index, placeholderFormat) { var value = values[parseInt(index, 10) + 1]; return toString(value, placeholderFormat ? placeholderFormat.substring(1) : ""); }); }; kendo._extractFormat = function (format) { if (format.slice(0,3) === "{0:") { format = format.slice(3, format.length - 1); } return format; }; kendo._activeElement = function() { try { return document.activeElement; } catch(e) { return document.documentElement.activeElement; } }; kendo._round = round; kendo.toString = toString; })(); (function() { var nonBreakingSpaceRegExp = /\u00A0/g, exponentRegExp = /[eE][\-+]?[0-9]+/, shortTimeZoneRegExp = /[+|\-]\d{1,2}/, longTimeZoneRegExp = /[+|\-]\d{1,2}:?\d{2}/, dateRegExp = /^\/Date\((.*?)\)\/$/, offsetRegExp = /[+-]\d*/, formatsSequence = ["G", "g", "d", "F", "D", "y", "m", "T", "t"], numberRegExp = { 2: /^\d{1,2}/, 3: /^\d{1,3}/, 4: /^\d{4}/ }, objectToString = {}.toString; function outOfRange(value, start, end) { return !(value >= start && value <= end); } function designatorPredicate(designator) { return designator.charAt(0); } function mapDesignators(designators) { return $.map(designators, designatorPredicate); } //if date's day is different than the typed one - adjust function adjustDST(date, hours) { if (!hours && date.getHours() === 23) { date.setHours(date.getHours() + 2); } } function lowerArray(data) { var idx = 0, length = data.length, array = []; for (; idx < length; idx++) { array[idx] = (data[idx] + "").toLowerCase(); } return array; } function lowerLocalInfo(localInfo) { var newLocalInfo = {}, property; for (property in localInfo) { newLocalInfo[property] = lowerArray(localInfo[property]); } return newLocalInfo; } function parseExact(value, format, culture) { if (!value) { return null; } var lookAhead = function (match) { var i = 0; while (format[idx] === match) { i++; idx++; } if (i > 0) { idx -= 1; } return i; }, getNumber = function(size) { var rg = numberRegExp[size] || new RegExp('^\\d{1,' + size + '}'), match = value.substr(valueIdx, size).match(rg); if (match) { match = match[0]; valueIdx += match.length; return parseInt(match, 10); } return null; }, getIndexByName = function (names, lower) { var i = 0, length = names.length, name, nameLength, subValue; for (; i < length; i++) { name = names[i]; nameLength = name.length; subValue = value.substr(valueIdx, nameLength); if (lower) { subValue = subValue.toLowerCase(); } if (subValue == name) { valueIdx += nameLength; return i + 1; } } return null; }, checkLiteral = function() { var result = false; if (value.charAt(valueIdx) === format[idx]) { valueIdx++; result = true; } return result; }, calendar = culture.calendars.standard, year = null, month = null, day = null, hours = null, minutes = null, seconds = null, milliseconds = null, idx = 0, valueIdx = 0, literal = false, date = new Date(), twoDigitYearMax = calendar.twoDigitYearMax || 2029, defaultYear = date.getFullYear(), ch, count, length, pattern, pmHour, UTC, matches, amDesignators, pmDesignators, hoursOffset, minutesOffset, hasTime, match; if (!format) { format = "d"; //shord date format } //if format is part of the patterns get real format pattern = calendar.patterns[format]; if (pattern) { format = pattern; } format = format.split(""); length = format.length; for (; idx < length; idx++) { ch = format[idx]; if (literal) { if (ch === "'") { literal = false; } else { checkLiteral(); } } else { if (ch === "d") { count = lookAhead("d"); if (!calendar._lowerDays) { calendar._lowerDays = lowerLocalInfo(calendar.days); } day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? "namesAbbr" : "names"], true); if (day === null || outOfRange(day, 1, 31)) { return null; } } else if (ch === "M") { count = lookAhead("M"); if (!calendar._lowerMonths) { calendar._lowerMonths = lowerLocalInfo(calendar.months); } month = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerMonths[count == 3 ? 'namesAbbr' : 'names'], true); if (month === null || outOfRange(month, 1, 12)) { return null; } month -= 1; //because month is zero based } else if (ch === "y") { count = lookAhead("y"); year = getNumber(count); if (year === null) { return null; } if (count == 2) { if (typeof twoDigitYearMax === "string") { twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10); } year = (defaultYear - defaultYear % 100) + year; if (year > twoDigitYearMax) { year -= 100; } } } else if (ch === "h" ) { lookAhead("h"); hours = getNumber(2); if (hours == 12) { hours = 0; } if (hours === null || outOfRange(hours, 0, 11)) { return null; } } else if (ch === "H") { lookAhead("H"); hours = getNumber(2); if (hours === null || outOfRange(hours, 0, 23)) { return null; } } else if (ch === "m") { lookAhead("m"); minutes = getNumber(2); if (minutes === null || outOfRange(minutes, 0, 59)) { return null; } } else if (ch === "s") { lookAhead("s"); seconds = getNumber(2); if (seconds === null || outOfRange(seconds, 0, 59)) { return null; } } else if (ch === "f") { count = lookAhead("f"); match = value.substr(valueIdx, count).match(numberRegExp[3]); milliseconds = getNumber(count); if (milliseconds !== null) { match = match[0].length; if (match < 3) { milliseconds *= Math.pow(10, (3 - match)); } if (count > 3) { milliseconds = parseInt(milliseconds.toString().substring(0, 3), 10); } } if (milliseconds === null || outOfRange(milliseconds, 0, 999)) { return null; } } else if (ch === "t") { count = lookAhead("t"); amDesignators = calendar.AM; pmDesignators = calendar.PM; if (count === 1) { amDesignators = mapDesignators(amDesignators); pmDesignators = mapDesignators(pmDesignators); } pmHour = getIndexByName(pmDesignators); if (!pmHour && !getIndexByName(amDesignators)) { return null; } } else if (ch === "z") { UTC = true; count = lookAhead("z"); if (value.substr(valueIdx, 1) === "Z") { checkLiteral(); continue; } matches = value.substr(valueIdx, 6) .match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp); if (!matches) { return null; } matches = matches[0].split(":"); hoursOffset = matches[0]; minutesOffset = matches[1]; if (!minutesOffset && hoursOffset.length > 3) { //(+|-)[hh][mm] format is used valueIdx = hoursOffset.length - 2; minutesOffset = hoursOffset.substring(valueIdx); hoursOffset = hoursOffset.substring(0, valueIdx); } hoursOffset = parseInt(hoursOffset, 10); if (outOfRange(hoursOffset, -12, 13)) { return null; } if (count > 2) { minutesOffset = parseInt(minutesOffset, 10); if (isNaN(minutesOffset) || outOfRange(minutesOffset, 0, 59)) { return null; } } } else if (ch === "'") { literal = true; checkLiteral(); } else if (!checkLiteral()) { return null; } } } hasTime = hours !== null || minutes !== null || seconds || null; if (year === null && month === null && day === null && hasTime) { year = defaultYear; month = date.getMonth(); day = date.getDate(); } else { if (year === null) { year = defaultYear; } if (day === null) { day = 1; } } if (pmHour && hours < 12) { hours += 12; } if (UTC) { if (hoursOffset) { hours += -hoursOffset; } if (minutesOffset) { minutes += -minutesOffset; } value = new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds)); } else { value = new Date(year, month, day, hours, minutes, seconds, milliseconds); adjustDST(value, hours); } if (year < 100) { value.setFullYear(year); } if (value.getDate() !== day && UTC === undefined) { return null; } return value; } function parseMicrosoftFormatOffset(offset) { var sign = offset.substr(0, 1) === "-" ? -1 : 1; offset = offset.substring(1); offset = (parseInt(offset.substr(0, 2), 10) * 60) + parseInt(offset.substring(2), 10); return sign * offset; } kendo.parseDate = function(value, formats, culture) { if (objectToString.call(value) === "[object Date]") { return value; } var idx = 0; var date = null; var length, patterns; var tzoffset; var sign; if (value && value.indexOf("/D") === 0) { date = dateRegExp.exec(value); if (date) { date = date[1]; tzoffset = offsetRegExp.exec(date.substring(1)); date = new Date(parseInt(date, 10)); if (tzoffset) { tzoffset = parseMicrosoftFormatOffset(tzoffset[0]); date = kendo.timezone.apply(date, 0); date = kendo.timezone.convert(date, 0, -1 * tzoffset); } return date; } } culture = kendo.getCulture(culture); if (!formats) { formats = []; patterns = culture.calendar.patterns; length = formatsSequence.length; for (; idx < length; idx++) { formats[idx] = patterns[formatsSequence[idx]]; } idx = 0; formats = [ "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM/dd", "ddd MMM dd yyyy HH:mm:ss", "yyyy-MM-ddTHH:mm:ss.fffffffzzz", "yyyy-MM-ddTHH:mm:ss.fffzzz", "yyyy-MM-ddTHH:mm:sszzz", "yyyy-MM-ddTHH:mm:ss.fffffff", "yyyy-MM-ddTHH:mm:ss.fff", "yyyy-MM-ddTHH:mmzzz", "yyyy-MM-ddTHH:mmzz", "yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mm", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd", "HH:mm:ss", "HH:mm" ].concat(formats); } formats = isArray(formats) ? formats: [formats]; length = formats.length; for (; idx < length; idx++) { date = parseExact(value, formats[idx], culture); if (date) { return date; } } return date; }; kendo.parseInt = function(value, culture) { var result = kendo.parseFloat(value, culture); if (result) { result = result | 0; } return result; }; kendo.parseFloat = function(value, culture, format) { if (!value && value !== 0) { return null; } if (typeof value === NUMBER) { return value; } value = value.toString(); culture = kendo.getCulture(culture); var number = culture.numberFormat, percent = number.percent, currency = number.currency, symbol = currency.symbol, percentSymbol = percent.symbol, negative = value.indexOf("-"), parts, isPercent; //handle exponential number if (exponentRegExp.test(value)) { value = parseFloat(value.replace(number["."], ".")); if (isNaN(value)) { value = null; } return value; } if (negative > 0) { return null; } else { negative = negative > -1; } if (value.indexOf(symbol) > -1 || (format && format.toLowerCase().indexOf("c") > -1)) { number = currency; parts = number.pattern[0].replace("$", symbol).split("n"); if (value.indexOf(parts[0]) > -1 && value.indexOf(parts[1]) > -1) { value = value.replace(parts[0], "").replace(parts[1], ""); negative = true; } } else if (value.indexOf(percentSymbol) > -1) { isPercent = true; number = percent; symbol = percentSymbol; } value = value.replace("-", "") .replace(symbol, "") .replace(nonBreakingSpaceRegExp, " ") .split(number[","].replace(nonBreakingSpaceRegExp, " ")).join("") .replace(number["."], "."); value = parseFloat(value); if (isNaN(value)) { value = null; } else if (negative) { value *= -1; } if (value && isPercent) { value /= 100; } return value; }; if (globalize && !globalize.load) { kendo.parseDate = function (value, format, culture) { if (objectToString.call(value) === "[object Date]") { return value; } return globalize.parseDate(value, format, culture); }; kendo.parseFloat = function (value, culture) { if (typeof value === NUMBER) { return value; } if (value === undefined || value === null) { return null; } if ($.isPlainObject(culture)) { culture = culture.name; } value = globalize.parseFloat(value, culture); return isNaN(value) ? null : value; }; } })(); function getShadows(element) { var shadow = element.css(kendo.support.transitions.css + "box-shadow") || element.css("box-shadow"), radius = shadow ? shadow.match(boxShadowRegExp) || [ 0, 0, 0, 0, 0 ] : [ 0, 0, 0, 0, 0 ], blur = math.max((+radius[3]), +(radius[4] || 0)); return { left: (-radius[1]) + blur, right: (+radius[1]) + blur, bottom: (+radius[2]) + blur }; } function wrap(element, autosize) { var browser = support.browser, percentage, isRtl = element.css("direction") == "rtl"; if (!element.parent().hasClass("k-animation-container")) { var shadows = getShadows(element), width = element[0].style.width, height = element[0].style.height, percentWidth = percentRegExp.test(width), percentHeight = percentRegExp.test(height); if (browser.opera) { // Box shadow can't be retrieved in Opera shadows.left = shadows.right = shadows.bottom = 5; } percentage = percentWidth || percentHeight; if (!percentWidth && (!autosize || (autosize && width))) { width = element.outerWidth(); } if (!percentHeight && (!autosize || (autosize && height))) { height = element.outerHeight(); } element.wrap( $("
") .addClass("k-animation-container") .css({ width: width, height: height, marginLeft: shadows.left * (isRtl ? 1 : -1), paddingLeft: shadows.left, paddingRight: shadows.right, paddingBottom: shadows.bottom })); if (percentage) { element.css({ width: "100%", height: "100%", boxSizing: "border-box", mozBoxSizing: "border-box", webkitBoxSizing: "border-box" }); } } else { var wrapper = element.parent(".k-animation-container"), wrapperStyle = wrapper[0].style; if (wrapper.is(":hidden")) { wrapper.show(); } percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height); if (!percentage) { wrapper.css({ width: element.outerWidth(), height: element.outerHeight(), boxSizing: "content-box", mozBoxSizing: "content-box", webkitBoxSizing: "content-box" }); } } if (browser.msie && math.floor(browser.version) <= 7) { element.css({ zoom: 1 }); element.children(".k-menu").width(element.width()); } return element.parent(); } function deepExtend(destination) { var i = 1, length = arguments.length; for (i = 1; i < length; i++) { deepExtendOne(destination, arguments[i]); } return destination; } function deepExtendOne(destination, source) { var ObservableArray = kendo.data.ObservableArray, LazyObservableArray = kendo.data.LazyObservableArray, DataSource = kendo.data.DataSource, HierarchicalDataSource = kendo.data.HierarchicalDataSource, property, propValue, propType, propInit, destProp; for (property in source) { propValue = source[property]; propType = typeof propValue; if (propType === OBJECT && propValue !== null) { propInit = propValue.constructor; } else { propInit = null; } if (propInit && propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray && propInit !== DataSource && propInit !== HierarchicalDataSource) { if (propValue instanceof Date) { destination[property] = new Date(propValue.getTime()); } else if (isFunction(propValue.clone)) { destination[property] = propValue.clone(); } else { destProp = destination[property]; if (typeof (destProp) === OBJECT) { destination[property] = destProp || {}; } else { destination[property] = {}; } deepExtendOne(destination[property], propValue); } } else if (propType !== UNDEFINED) { destination[property] = propValue; } } return destination; } function testRx(agent, rxs, dflt) { for (var rx in rxs) { if (rxs.hasOwnProperty(rx) && rxs[rx].test(agent)) { return rx; } } return dflt !== undefined ? dflt : agent; } function toHyphens(str) { return str.replace(/([a-z][A-Z])/g, function (g) { return g.charAt(0) + '-' + g.charAt(1).toLowerCase(); }); } function toCamelCase(str) { return str.replace(/\-(\w)/g, function (strMatch, g1) { return g1.toUpperCase(); }); } function getComputedStyles(element, properties) { var styles = {}, computedStyle; if (document.defaultView && document.defaultView.getComputedStyle) { computedStyle = document.defaultView.getComputedStyle(element, ""); if (properties) { $.each(properties, function(idx, value) { styles[value] = computedStyle.getPropertyValue(value); }); } } else { computedStyle = element.currentStyle; if (properties) { $.each(properties, function(idx, value) { styles[value] = computedStyle[toCamelCase(value)]; }); } } if (!kendo.size(styles)) { styles = computedStyle; } return styles; } (function () { support._scrollbar = undefined; support.scrollbar = function (refresh) { if (!isNaN(support._scrollbar) && !refresh) { return support._scrollbar; } else { var div = document.createElement("div"), result; div.style.cssText = "overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block"; div.innerHTML = " "; document.body.appendChild(div); support._scrollbar = result = div.offsetWidth - div.scrollWidth; document.body.removeChild(div); return result; } }; support.isRtl = function(element) { return $(element).closest(".k-rtl").length > 0; }; var table = document.createElement("table"); // Internet Explorer does not support setting the innerHTML of TBODY and TABLE elements try { table.innerHTML = ""; support.tbodyInnerHtml = true; } catch (e) { support.tbodyInnerHtml = false; } support.touch = "ontouchstart" in window; support.msPointers = window.MSPointerEvent; support.pointers = window.PointerEvent; var transitions = support.transitions = false, transforms = support.transforms = false, elementProto = "HTMLElement" in window ? HTMLElement.prototype : []; support.hasHW3D = ("WebKitCSSMatrix" in window && "m11" in new window.WebKitCSSMatrix()) || "MozPerspective" in document.documentElement.style || "msPerspective" in document.documentElement.style; each([ "Moz", "webkit", "O", "ms" ], function () { var prefix = this.toString(), hasTransitions = typeof table.style[prefix + "Transition"] === STRING; if (hasTransitions || typeof table.style[prefix + "Transform"] === STRING) { var lowPrefix = prefix.toLowerCase(); transforms = { css: (lowPrefix != "ms") ? "-" + lowPrefix + "-" : "", prefix: prefix, event: (lowPrefix === "o" || lowPrefix === "webkit") ? lowPrefix : "" }; if (hasTransitions) { transitions = transforms; transitions.event = transitions.event ? transitions.event + "TransitionEnd" : "transitionend"; } return false; } }); table = null; support.transforms = transforms; support.transitions = transitions; support.devicePixelRatio = window.devicePixelRatio === undefined ? 1 : window.devicePixelRatio; try { support.screenWidth = window.outerWidth || window.screen ? window.screen.availWidth : window.innerWidth; support.screenHeight = window.outerHeight || window.screen ? window.screen.availHeight : window.innerHeight; } catch(e) { //window.outerWidth throws error when in IE showModalDialog. support.screenWidth = window.screen.availWidth; support.screenHeight = window.screen.availHeight; } support.detectOS = function (ua) { var os = false, minorVersion, match = [], notAndroidPhone = !/mobile safari/i.test(ua), agentRxs = { wp: /(Windows Phone(?: OS)?)\s(\d+)\.(\d+(\.\d+)?)/, fire: /(Silk)\/(\d+)\.(\d+(\.\d+)?)/, android: /(Android|Android.*(?:Opera|Firefox).*?\/)\s*(\d+)\.(\d+(\.\d+)?)/, iphone: /(iPhone|iPod).*OS\s+(\d+)[\._]([\d\._]+)/, ipad: /(iPad).*OS\s+(\d+)[\._]([\d_]+)/, meego: /(MeeGo).+NokiaBrowser\/(\d+)\.([\d\._]+)/, webos: /(webOS)\/(\d+)\.(\d+(\.\d+)?)/, blackberry: /(BlackBerry|BB10).*?Version\/(\d+)\.(\d+(\.\d+)?)/, playbook: /(PlayBook).*?Tablet\s*OS\s*(\d+)\.(\d+(\.\d+)?)/, windows: /(MSIE)\s+(\d+)\.(\d+(\.\d+)?)/, tizen: /(tizen).*?Version\/(\d+)\.(\d+(\.\d+)?)/i, sailfish: /(sailfish).*rv:(\d+)\.(\d+(\.\d+)?).*firefox/i, ffos: /(Mobile).*rv:(\d+)\.(\d+(\.\d+)?).*Firefox/ }, osRxs = { ios: /^i(phone|pad|pod)$/i, android: /^android|fire$/i, blackberry: /^blackberry|playbook/i, windows: /windows/, wp: /wp/, flat: /sailfish|ffos|tizen/i, meego: /meego/ }, formFactorRxs = { tablet: /playbook|ipad|fire/i }, browserRxs = { omini: /Opera\sMini/i, omobile: /Opera\sMobi/i, firefox: /Firefox|Fennec/i, mobilesafari: /version\/.*safari/i, ie: /MSIE|Windows\sPhone/i, chrome: /chrome|crios/i, webkit: /webkit/i }; for (var agent in agentRxs) { if (agentRxs.hasOwnProperty(agent)) { match = ua.match(agentRxs[agent]); if (match) { if (agent == "windows" && "plugins" in navigator) { return false; } // Break if not Metro/Mobile Windows os = {}; os.device = agent; os.tablet = testRx(agent, formFactorRxs, false); os.browser = testRx(ua, browserRxs, "default"); os.name = testRx(agent, osRxs); os[os.name] = true; os.majorVersion = match[2]; os.minorVersion = match[3].replace("_", "."); minorVersion = os.minorVersion.replace(".", "").substr(0, 2); os.flatVersion = os.majorVersion + minorVersion + (new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join("0")); os.cordova = typeof window.PhoneGap !== UNDEFINED || typeof window.cordova !== UNDEFINED; // Use file protocol to detect appModes. os.appMode = window.navigator.standalone || (/file|local|wmapp/).test(window.location.protocol) || os.cordova; // Use file protocol to detect appModes. if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) { os.tablet = agent; } break; } } } return os; }; var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent); support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0; support.kineticScrollNeeded = mobileOS && (support.touch || support.msPointers || support.pointers); support.hasNativeScrolling = false; if (mobileOS.ios || (mobileOS.android && mobileOS.majorVersion > 2) || mobileOS.wp) { support.hasNativeScrolling = mobileOS; } support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android); support.detectBrowser = function(ua) { var browser = false, match = [], browserRxs = { webkit: /(chrome)[ \/]([\w.]+)/i, safari: /(webkit)[ \/]([\w.]+)/i, opera: /(opera)(?:.*version|)[ \/]([\w.]+)/i, msie: /(msie\s|trident.*? rv:)([\w.]+)/i, mozilla: /(mozilla)(?:.*? rv:([\w.]+)|)/i }; for (var agent in browserRxs) { if (browserRxs.hasOwnProperty(agent)) { match = ua.match(browserRxs[agent]); if (match) { browser = {}; browser[agent] = true; browser[match[1].toLowerCase().split(" ")[0].split("/")[0]] = true; browser.version = parseInt(document.documentMode || match[2], 10); break; } } } return browser; }; support.browser = support.detectBrowser(navigator.userAgent); support.zoomLevel = function() { try { return support.touch ? (document.documentElement.clientWidth / window.innerWidth) : support.browser.msie && support.browser.version >= 10 ? ((top || window).document.documentElement.offsetWidth / (top || window).innerWidth) : 1; } catch(e) { return 1; } }; support.cssBorderSpacing = typeof document.documentElement.style.borderSpacing != "undefined" && !(support.browser.msie && support.browser.version < 8); (function(browser) { // add browser-specific CSS class var cssClass = "", docElement = $(document.documentElement), majorVersion = parseInt(browser.version, 10); if (browser.msie) { cssClass = "ie"; } else if (browser.mozilla) { cssClass = "ff"; } else if (browser.safari) { cssClass = "safari"; } else if (browser.webkit) { cssClass = "webkit"; } else if (browser.opera) { cssClass = "opera"; } if (cssClass) { cssClass = "k-" + cssClass + " k-" + cssClass + majorVersion; } if (support.mobileOS) { cssClass += " k-mobile"; } docElement.addClass(cssClass); })(support.browser); support.eventCapture = document.documentElement.addEventListener; var input = document.createElement("input"); support.placeholder = "placeholder" in input; support.propertyChangeEvent = "onpropertychange" in input; support.input = (function() { var types = ["number", "date", "time", "month", "week", "datetime", "datetime-local"]; var length = types.length; var value = "test"; var result = {}; var idx = 0; var type; for (;idx < length; idx++) { type = types[idx]; input.setAttribute("type", type); input.value = value; result[type.replace("-", "")] = input.type !== "text" && input.value !== value; } return result; })(); input.style.cssText = "float:left;"; support.cssFloat = !!input.style.cssFloat; input = null; support.stableSort = (function() { // Chrome sort is not stable for more than *10* items // IE9+ sort is not stable for than *512* items var threshold = 513; var sorted = [{ index: 0, field: "b" }]; for (var i = 1; i < threshold; i++) { sorted.push({ index: i, field: "a" }); } sorted.sort(function(a, b) { return a.field > b.field ? 1 : (a.field < b.field ? -1 : 0); }); return sorted[0].index === 1; })(); support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector || elementProto.msMatchesSelector || elementProto.oMatchesSelector || elementProto.matchesSelector || elementProto.matches || function( selector ) { var nodeList = document.querySelectorAll ? ( this.parentNode || document ).querySelectorAll( selector ) || [] : $(selector), i = nodeList.length; while (i--) { if (nodeList[i] == this) { return true; } } return false; }; support.pushState = window.history && window.history.pushState; var documentMode = document.documentMode; support.hashChange = ("onhashchange" in window) && !(support.browser.msie && (!documentMode || documentMode <= 8)); // old IE detection })(); function size(obj) { var result = 0, key; for (key in obj) { if (obj.hasOwnProperty(key) && key != "toJSON") { // Ignore fake IE7 toJSON. result++; } } return result; } function getOffset(element, type, positioned) { if (!type) { type = "offset"; } var result = element[type](), mobileOS = support.mobileOS; // IE10 touch zoom is living in a separate viewport if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) { result.top -= (window.pageYOffset - document.documentElement.scrollTop); result.left -= (window.pageXOffset - document.documentElement.scrollLeft); } return result; } var directions = { left: { reverse: "right" }, right: { reverse: "left" }, down: { reverse: "up" }, up: { reverse: "down" }, top: { reverse: "bottom" }, bottom: { reverse: "top" }, "in": { reverse: "out" }, out: { reverse: "in" } }; function parseEffects(input) { var effects = {}; each((typeof input === "string" ? input.split(" ") : input), function(idx) { effects[idx] = this; }); return effects; } function fx(element) { return new kendo.effects.Element(element); } var effects = {}; $.extend(effects, { enabled: true, Element: function(element) { this.element = $(element); }, promise: function(element, options) { if (!element.is(":visible")) { element.css({ display: element.data("olddisplay") || "block" }).css("display"); } if (options.hide) { element.data("olddisplay", element.css("display")).hide(); } if (options.init) { options.init(); } if (options.completeCallback) { options.completeCallback(element); // call the external complete callback with the element } element.dequeue(); }, disable: function() { this.enabled = false; this.promise = this.promiseShim; }, enable: function() { this.enabled = true; this.promise = this.animatedPromise; } }); effects.promiseShim = effects.promise; function prepareAnimationOptions(options, duration, reverse, complete) { if (typeof options === STRING) { // options is the list of effect names separated by space e.g. animate(element, "fadeIn slideDown") // only callback is provided e.g. animate(element, options, function() {}); if (isFunction(duration)) { complete = duration; duration = 400; reverse = false; } if (isFunction(reverse)) { complete = reverse; reverse = false; } if (typeof duration === BOOLEAN){ reverse = duration; duration = 400; } options = { effects: options, duration: duration, reverse: reverse, complete: complete }; } return extend({ //default options effects: {}, duration: 400, //jQuery default duration reverse: false, init: noop, teardown: noop, hide: false }, options, { completeCallback: options.complete, complete: noop }); // Move external complete callback, so deferred.resolve can be always executed. } function animate(element, options, duration, reverse, complete) { var idx = 0, length = element.length, instance; for (; idx < length; idx ++) { instance = $(element[idx]); instance.queue(function() { effects.promise(instance, prepareAnimationOptions(options, duration, reverse, complete)); }); } return element; } function toggleClass(element, classes, options, add) { if (classes) { classes = classes.split(" "); each(classes, function(idx, value) { element.toggleClass(value, add); }); } return element; } if (!("kendoAnimate" in $.fn)) { extend($.fn, { kendoStop: function(clearQueue, gotoEnd) { return this.stop(clearQueue, gotoEnd); }, kendoAnimate: function(options, duration, reverse, complete) { return animate(this, options, duration, reverse, complete); }, kendoAddClass: function(classes, options){ return kendo.toggleClass(this, classes, options, true); }, kendoRemoveClass: function(classes, options){ return kendo.toggleClass(this, classes, options, false); }, kendoToggleClass: function(classes, options, toggle){ return kendo.toggleClass(this, classes, options, toggle); } }); } var ampRegExp = /&/g, ltRegExp = //g; function htmlEncode(value) { return ("" + value).replace(ampRegExp, "&").replace(ltRegExp, "<").replace(gtRegExp, ">").replace(quoteRegExp, """).replace(aposRegExp, "'"); } var eventTarget = function (e) { return e.target; }; if (support.touch) { eventTarget = function(e) { var touches = "originalEvent" in e ? e.originalEvent.changedTouches : "changedTouches" in e ? e.changedTouches : null; return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target; }; each(["swipe", "swipeLeft", "swipeRight", "swipeUp", "swipeDown", "doubleTap", "tap"], function(m, value) { $.fn[value] = function(callback) { return this.bind(value, callback); }; }); } if (support.touch) { if (!support.mobileOS) { support.mousedown = "mousedown touchstart"; support.mouseup = "mouseup touchend"; support.mousemove = "mousemove touchmove"; support.mousecancel = "mouseleave touchcancel"; support.click = "click"; support.resize = "resize"; } else { support.mousedown = "touchstart"; support.mouseup = "touchend"; support.mousemove = "touchmove"; support.mousecancel = "touchcancel"; support.click = "touchend"; support.resize = "orientationchange"; } } else if (support.pointers) { support.mousemove = "pointermove"; support.mousedown = "pointerdown"; support.mouseup = "pointerup"; support.mousecancel = "pointercancel"; support.click = "pointerup"; support.resize = "orientationchange resize"; } else if (support.msPointers) { support.mousemove = "MSPointerMove"; support.mousedown = "MSPointerDown"; support.mouseup = "MSPointerUp"; support.mousecancel = "MSPointerCancel"; support.click = "MSPointerUp"; support.resize = "orientationchange resize"; } else { support.mousemove = "mousemove"; support.mousedown = "mousedown"; support.mouseup = "mouseup"; support.mousecancel = "mouseleave"; support.click = "click"; support.resize = "resize"; } var wrapExpression = function(members, paramName) { var result = paramName || "d", index, idx, length, member, count = 1; for (idx = 0, length = members.length; idx < length; idx++) { member = members[idx]; if (member !== "") { index = member.indexOf("["); if (index !== 0) { if (index == -1) { member = "." + member; } else { count++; member = "." + member.substring(0, index) + " || {})" + member.substring(index); } } count++; result += member + ((idx < length - 1) ? " || {})" : ")"); } } return new Array(count).join("(") + result; }, localUrlRe = /^([a-z]+:)?\/\//i; extend(kendo, { ui: kendo.ui || {}, fx: kendo.fx || fx, effects: kendo.effects || effects, mobile: kendo.mobile || { }, data: kendo.data || {}, dataviz: kendo.dataviz || {}, keys: { INSERT: 45, DELETE: 46, BACKSPACE: 8, TAB: 9, ENTER: 13, ESC: 27, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, END: 35, HOME: 36, SPACEBAR: 32, PAGEUP: 33, PAGEDOWN: 34, F2: 113, F10: 121, F12: 123, NUMPAD_PLUS: 107, NUMPAD_MINUS: 109, NUMPAD_DOT: 110 }, support: kendo.support || support, animate: kendo.animate || animate, ns: "", attr: function(value) { return "data-" + kendo.ns + value; }, getShadows: getShadows, wrap: wrap, deepExtend: deepExtend, getComputedStyles: getComputedStyles, size: size, toCamelCase: toCamelCase, toHyphens: toHyphens, getOffset: kendo.getOffset || getOffset, parseEffects: kendo.parseEffects || parseEffects, toggleClass: kendo.toggleClass || toggleClass, directions: kendo.directions || directions, Observable: Observable, Class: Class, Template: Template, template: proxy(Template.compile, Template), render: proxy(Template.render, Template), stringify: proxy(JSON.stringify, JSON), eventTarget: eventTarget, htmlEncode: htmlEncode, isLocalUrl: function(url) { return url && !localUrlRe.test(url); }, expr: function(expression, safe, paramName) { expression = expression || ""; if (typeof safe == STRING) { paramName = safe; safe = false; } paramName = paramName || "d"; if (expression && expression.charAt(0) !== "[") { expression = "." + expression; } if (safe) { expression = wrapExpression(expression.split("."), paramName); } else { expression = paramName + expression; } return expression; }, getter: function(expression, safe) { var key = expression + safe; return getterCache[key] = getterCache[key] || new Function("d", "return " + kendo.expr(expression, safe)); }, setter: function(expression) { return setterCache[expression] = setterCache[expression] || new Function("d,value", kendo.expr(expression) + "=value"); }, accessor: function(expression) { return { get: kendo.getter(expression), set: kendo.setter(expression) }; }, guid: function() { var id = "", i, random; for (i = 0; i < 32; i++) { random = math.random() * 16 | 0; if (i == 8 || i == 12 || i == 16 || i == 20) { id += "-"; } id += (i == 12 ? 4 : (i == 16 ? (random & 3 | 8) : random)).toString(16); } return id; }, roleSelector: function(role) { return role.replace(/(\S+)/g, "[" + kendo.attr("role") + "=$1],").slice(0, -1); }, directiveSelector: function(directives) { var selectors = directives.split(" "); if (selectors) { for (var i = 0; i < selectors.length; i++) { if (selectors[i] != "view") { selectors[i] = selectors[i].replace(/(\w*)(view|bar|strip|over)$/, "$1-$2"); } } } return selectors.join(" ").replace(/(\S+)/g, "kendo-mobile-$1,").slice(0, -1); }, triggeredByInput: function(e) { return (/^(label|input|textarea|select)$/i).test(e.target.tagName); }, logToConsole: function(message) { var console = window.console; if (!kendo.suppressLog && typeof(console) != "undefined" && console.log) { console.log(message); } } }); var Widget = Observable.extend( { init: function(element, options) { var that = this; that.element = kendo.jQuery(element).handler(that); that.angular("init", options); Observable.fn.init.call(that); var dataSource = options ? options.dataSource : null; if (dataSource) { // avoid deep cloning the data source options = extend({}, options, { dataSource: {} }); } options = that.options = extend(true, {}, that.options, options); if (dataSource) { options.dataSource = dataSource; } if (!that.element.attr(kendo.attr("role"))) { that.element.attr(kendo.attr("role"), (options.name || "").toLowerCase()); } that.element.data("kendo" + options.prefix + options.name, that); that.bind(that.events, options); }, events: [], options: { prefix: "" }, _hasBindingTarget: function() { return !!this.element[0].kendoBindingTarget; }, _tabindex: function(target) { target = target || this.wrapper; var element = this.element, TABINDEX = "tabindex", tabindex = target.attr(TABINDEX) || element.attr(TABINDEX); element.removeAttr(TABINDEX); target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0); }, setOptions: function(options) { this._setEvents(options); $.extend(this.options, options); }, _setEvents: function(options) { var that = this, idx = 0, length = that.events.length, e; for (; idx < length; idx ++) { e = that.events[idx]; if (that.options[e] && options[e]) { that.unbind(e, that.options[e]); } } that.bind(that.events, options); }, resize: function(force) { var size = this.getSize(), currentSize = this._size; if (force || !currentSize || size.width !== currentSize.width || size.height !== currentSize.height) { this._size = size; this._resize(size); this.trigger("resize", size); } }, getSize: function() { return kendo.dimensions(this.element); }, size: function(size) { if (!size) { return this.getSize(); } else { this.setSize(size); } }, setSize: $.noop, _resize: $.noop, destroy: function() { var that = this; that.element.removeData("kendo" + that.options.prefix + that.options.name); that.element.removeData("handler"); that.unbind(); }, angular: function(){} }); var DataBoundWidget = Widget.extend({ // Angular consumes these. dataItems: function() { return this.dataSource.flatView(); }, _angularItems: function(cmd) { var that = this; that.angular(cmd, function(){ return { elements: that.items(), data: $.map(that.dataItems(), function(dataItem){ return { dataItem: dataItem }; }) }; }); } }); kendo.dimensions = function(element, dimensions) { var domElement = element[0]; if (dimensions) { element.css(dimensions); } return { width: domElement.offsetWidth, height: domElement.offsetHeight }; }; kendo.notify = noop; var templateRegExp = /template$/i, jsonRegExp = /^\s*(?:\{(?:.|\r\n|\n)*\}|\[(?:.|\r\n|\n)*\])\s*$/, jsonFormatRegExp = /^\{(\d+)(:[^\}]+)?\}|^\[[A-Za-z_]*\]$/, dashRegExp = /([A-Z])/g; function parseOption(element, option) { var value; if (option.indexOf("data") === 0) { option = option.substring(4); option = option.charAt(0).toLowerCase() + option.substring(1); } option = option.replace(dashRegExp, "-$1"); value = element.getAttribute("data-" + kendo.ns + option); if (value === null) { value = undefined; } else if (value === "null") { value = null; } else if (value === "true") { value = true; } else if (value === "false") { value = false; } else if (numberRegExp.test(value)) { value = parseFloat(value); } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) { value = new Function("return (" + value + ")")(); } return value; } function parseOptions(element, options) { var result = {}, option, value; for (option in options) { value = parseOption(element, option); if (value !== undefined) { if (templateRegExp.test(option)) { value = kendo.template($("#" + value).html()); } result[option] = value; } } return result; } kendo.initWidget = function(element, options, roles) { var result, option, widget, idx, length, role, value, dataSource, fullPath, widgetKeyRegExp; // Preserve backwards compatibility with (element, options, namespace) signature, where namespace was kendo.ui if (!roles) { roles = kendo.ui.roles; } else if (roles.roles) { roles = roles.roles; } element = element.nodeType ? element : element[0]; role = element.getAttribute("data-" + kendo.ns + "role"); if (!role) { return; } fullPath = role.indexOf(".") === -1; // look for any widget that may be already instantiated based on this role. // The prefix used is unknown, hence the regexp // if (fullPath) { widget = roles[role]; } else { // full namespace path - like kendo.ui.Widget widget = kendo.getter(role)(window); } var data = $(element).data(), widgetKey = widget ? "kendo" + widget.fn.options.prefix + widget.fn.options.name : ""; if (fullPath) { widgetKeyRegExp = new RegExp("^kendo.*" + role + "$", "i"); } else { // full namespace path - like kendo.ui.Widget widgetKeyRegExp = new RegExp("^" + widgetKey + "$", "i"); } for(var key in data) { if (key.match(widgetKeyRegExp)) { // we have detected a widget of the same kind - save its reference, we will set its options if (key === widgetKey) { result = data[key]; } else { return data[key]; } } } if (!widget) { return; } dataSource = parseOption(element, "dataSource"); options = $.extend({}, parseOptions(element, widget.fn.options), options); if (dataSource) { if (typeof dataSource === STRING) { options.dataSource = kendo.getter(dataSource)(window); } else { options.dataSource = dataSource; } } for (idx = 0, length = widget.fn.events.length; idx < length; idx++) { option = widget.fn.events[idx]; value = parseOption(element, option); if (value !== undefined) { options[option] = kendo.getter(value)(window); } } if (!result) { result = new widget(element, options); } else if (!$.isEmptyObject(options)) { result.setOptions(options); } return result; }; kendo.rolesFromNamespaces = function(namespaces) { var roles = [], idx, length; if (!namespaces[0]) { namespaces = [kendo.ui, kendo.dataviz.ui]; } for (idx = 0, length = namespaces.length; idx < length; idx ++) { roles[idx] = namespaces[idx].roles; } return extend.apply(null, [{}].concat(roles.reverse())); }; kendo.init = function(element) { var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1)); $(element).find("[data-" + kendo.ns + "role]").addBack().each(function(){ kendo.initWidget(this, {}, roles); }); }; kendo.destroy = function(element) { $(element).find("[data-" + kendo.ns + "role]").addBack().each(function(){ var data = $(this).data(); for (var key in data) { if (key.indexOf("kendo") === 0 && typeof data[key].destroy === FUNCTION) { data[key].destroy(); } } }); }; function containmentComparer(a, b) { return $.contains(a, b) ? -1 : 1; } function resizableWidget() { var widget = $(this); return ($.inArray(widget.attr("data-" + kendo.ns + "role"), ["slider", "rangeslider"]) > -1) || widget.is(":visible"); } kendo.resize = function(element, force) { var widgets = $(element).find("[data-" + kendo.ns + "role]").addBack().filter(resizableWidget); if (!widgets.length) { return; } // sort widgets based on their parent-child relation var widgetsArray = $.makeArray(widgets); widgetsArray.sort(containmentComparer); // resize widgets $.each(widgetsArray, function () { var widget = kendo.widgetInstance($(this)); if (widget) { widget.resize(force); } }); }; kendo.parseOptions = parseOptions; extend(kendo.ui, { Widget: Widget, DataBoundWidget: DataBoundWidget, roles: {}, progress: function(container, toggle) { var mask = container.find(".k-loading-mask"), support = kendo.support, browser = support.browser, isRtl, leftRight, webkitCorrection, containerScrollLeft; if (toggle) { if (!mask.length) { isRtl = support.isRtl(container); leftRight = isRtl ? "right" : "left"; containerScrollLeft = container.scrollLeft(); webkitCorrection = browser.webkit ? (!isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft) : 0; mask = $("
Loading...
") .width("100%").height("100%") .css("top", container.scrollTop()) .css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection) .prependTo(container); } } else if (mask) { mask.remove(); } }, plugin: function(widget, register, prefix) { var name = widget.fn.options.name, getter; register = register || kendo.ui; prefix = prefix || ""; register[name] = widget; register.roles[name.toLowerCase()] = widget; getter = "getKendo" + prefix + name; name = "kendo" + prefix + name; $.fn[name] = function(options) { var value = this, args; if (typeof options === STRING) { args = slice.call(arguments, 1); this.each(function(){ var widget = $.data(this, name), method, result; if (!widget) { throw new Error(kendo.format("Cannot call method '{0}' of {1} before it is initialized", options, name)); } method = widget[options]; if (typeof method !== FUNCTION) { throw new Error(kendo.format("Cannot find method '{0}' of {1}", options, name)); } result = method.apply(widget, args); if (result !== undefined) { value = result; return false; } }); } else { this.each(function() { new widget(this, options); }); } return value; }; $.fn[name].widget = widget; $.fn[getter] = function() { return this.data(name); }; } }); var ContainerNullObject = { bind: function () { return this; }, nullObject: true, options: {} }; var MobileWidget = Widget.extend({ init: function(element, options) { Widget.fn.init.call(this, element, options); this.element.autoApplyNS(); this.wrapper = this.element; this.element.addClass("km-widget"); }, destroy: function() { Widget.fn.destroy.call(this); this.element.kendoDestroy(); }, options: { prefix: "Mobile" }, events: [], view: function() { var viewElement = this.element.closest(kendo.roleSelector("view splitview modalview drawer")); return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject; }, viewHasNativeScrolling: function() { var view = this.view(); return view && view.options.useNativeScrolling; }, container: function() { var element = this.element.closest(kendo.roleSelector("view layout modalview drawer splitview")); return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject; } }); extend(kendo.mobile, { init: function(element) { kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui); }, appLevelNativeScrolling: function() { return kendo.mobile.application && kendo.mobile.application.options && kendo.mobile.application.options.useNativeScrolling; }, roles: {}, ui: { Widget: MobileWidget, DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype), roles: {}, plugin: function(widget) { kendo.ui.plugin(widget, kendo.mobile.ui, "Mobile"); } } }); deepExtend(kendo.dataviz, { init: function(element) { kendo.init(element, kendo.dataviz.ui); }, ui: { roles: {}, themes: {}, views: [], plugin: function(widget) { kendo.ui.plugin(widget, kendo.dataviz.ui); } }, roles: {} }); kendo.touchScroller = function(elements, options) { // return the first touch scroller return $(elements).map(function(idx, element) { element = $(element); if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data("kendoMobileScroller")) { element.kendoMobileScroller(options); return element.data("kendoMobileScroller"); } else { return false; } })[0]; }; kendo.preventDefault = function(e) { e.preventDefault(); }; kendo.widgetInstance = function(element, suites) { var role = element.data(kendo.ns + "role"), widgets = [], i, length; if (role) { // HACK!!! mobile view scroller widgets are instantiated on data-role="content" elements. We need to discover them when resizing. if (role === "content") { role = "scroller"; } if (suites) { if (suites[0]) { for (i = 0, length = suites.length; i < length; i ++) { widgets.push(suites[i].roles[role]); } } else { widgets.push(suites.roles[role]); } } else { widgets = [ kendo.ui.roles[role], kendo.dataviz.ui.roles[role], kendo.mobile.ui.roles[role] ]; } if (role.indexOf(".") >= 0) { widgets = [ kendo.getter(role)(window) ]; } for (i = 0, length = widgets.length; i < length; i ++) { var widget = widgets[i]; if (widget) { var instance = element.data("kendo" + widget.fn.options.prefix + widget.fn.options.name); if (instance) { return instance; } } } } }; kendo.onResize = function(callback) { var handler = callback; if (support.mobileOS.android) { handler = function() { setTimeout(callback, 600); }; } $(window).on(support.resize, handler); return handler; }; kendo.unbindResize = function(callback) { $(window).off(support.resize, callback); }; kendo.attrValue = function(element, key) { return element.data(kendo.ns + key); }; kendo.days = { Sunday: 0, Monday: 1, Tuesday: 2, Wednesday: 3, Thursday: 4, Friday: 5, Saturday: 6 }; function focusable(element, isTabIndexNotNaN) { var nodeName = element.nodeName.toLowerCase(); return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN ) && visible(element); } function visible(element) { return !$(element).parents().addBack().filter(function() { return $.css(this,"visibility") === "hidden" || $.expr.filters.hidden(this); }).length; } $.extend($.expr[ ":" ], { kendoFocusable: function(element) { var idx = $.attr(element, "tabindex"); return focusable(element, !isNaN(idx) && idx > -1); } }); var MOUSE_EVENTS = ["mousedown", "mousemove", "mouseenter", "mouseleave", "mouseover", "mouseout", "mouseup", "click"]; var EXCLUDE_BUST_CLICK_SELECTOR = "label, input, [data-rel=external]"; var MouseEventNormalizer = { setupMouseMute: function() { var idx = 0, length = MOUSE_EVENTS.length, element = document.documentElement; if (MouseEventNormalizer.mouseTrap || !support.eventCapture) { return; } MouseEventNormalizer.mouseTrap = true; MouseEventNormalizer.bustClick = false; MouseEventNormalizer.captureMouse = false; var handler = function(e) { if (MouseEventNormalizer.captureMouse) { if (e.type === "click") { if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) { e.preventDefault(); e.stopPropagation(); } } else { e.stopPropagation(); } } }; for (; idx < length; idx++) { element.addEventListener(MOUSE_EVENTS[idx], handler, true); } }, muteMouse: function(e) { MouseEventNormalizer.captureMouse = true; if (e.data.bustClick) { MouseEventNormalizer.bustClick = true; } clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID); }, unMuteMouse: function() { clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID); MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function() { MouseEventNormalizer.captureMouse = false; MouseEventNormalizer.bustClick = false; }, 400); } }; var eventMap = { down: "touchstart mousedown", move: "mousemove touchmove", up: "mouseup touchend touchcancel", cancel: "mouseleave touchcancel" }; if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) { eventMap = { down: "touchstart", move: "touchmove", up: "touchend touchcancel", cancel: "touchcancel" }; } else if (support.pointers) { eventMap = { down: "pointerdown", move: "pointermove", up: "pointerup", cancel: "pointercancel pointerleave" }; } else if (support.msPointers) { eventMap = { down: "MSPointerDown", move: "MSPointerMove", up: "MSPointerUp", cancel: "MSPointerCancel MSPointerLeave" }; } if (support.msPointers && !("onmspointerenter" in window)) { // IE10 // Create MSPointerEnter/MSPointerLeave events using mouseover/out and event-time checks $.each({ MSPointerEnter: "MSPointerOver", MSPointerLeave: "MSPointerOut" }, function( orig, fix ) { $.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !$.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); } var getEventMap = function(e) { return (eventMap[e] || e); }, eventRegEx = /([^ ]+)/g; kendo.applyEventMap = function(events, ns) { events = events.replace(eventRegEx, getEventMap); if (ns) { events = events.replace(eventRegEx, "$1." + ns); } return events; }; var on = $.fn.on; function kendoJQuery(selector, context) { return new kendoJQuery.fn.init(selector, context); } extend(true, kendoJQuery, $); kendoJQuery.fn = kendoJQuery.prototype = new $(); kendoJQuery.fn.constructor = kendoJQuery; kendoJQuery.fn.init = function(selector, context) { if (context && context instanceof $ && !(context instanceof kendoJQuery)) { context = kendoJQuery(context); } return $.fn.init.call(this, selector, context, rootjQuery); }; kendoJQuery.fn.init.prototype = kendoJQuery.fn; var rootjQuery = kendoJQuery(document); extend(kendoJQuery.fn, { handler: function(handler) { this.data("handler", handler); return this; }, autoApplyNS: function(ns) { this.data("kendoNS", ns || kendo.guid()); return this; }, on: function() { var that = this, ns = that.data("kendoNS"); // support for event map signature if (arguments.length === 1) { return on.call(that, arguments[0]); } var context = that, args = slice.call(arguments); if (typeof args[args.length -1] === UNDEFINED) { args.pop(); } var callback = args[args.length - 1], events = kendo.applyEventMap(args[0], ns); // setup mouse trap if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) { MouseEventNormalizer.setupMouseMute(); var selector = args.length === 2 ? null : args[1], bustClick = events.indexOf("click") > -1 && events.indexOf("touchend") > -1; on.call(this, { touchstart: MouseEventNormalizer.muteMouse, touchend: MouseEventNormalizer.unMuteMouse }, selector, { bustClick: bustClick }); } if (typeof callback === STRING) { context = that.data("handler"); callback = context[callback]; args[args.length - 1] = function(e) { callback.call(context, e); }; } args[0] = events; on.apply(that, args); return that; }, kendoDestroy: function(ns) { ns = ns || this.data("kendoNS"); if (ns) { this.off("." + ns); } return this; } }); kendo.jQuery = kendoJQuery; kendo.eventMap = eventMap; kendo.timezone = (function(){ var months = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 }; var days = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 }; function ruleToDate(year, rule) { var date; var targetDay; var ourDay; var month = rule[3]; var on = rule[4]; var time = rule[5]; var cache = rule[8]; if (!cache) { rule[8] = cache = {}; } if (cache[year]) { return cache[year]; } if (!isNaN(on)) { date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0)); } else if (on.indexOf("last") === 0) { date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0)); targetDay = days[on.substr(4, 3)]; ourDay = date.getUTCDay(); date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0)); } else if (on.indexOf(">=") >= 0) { date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0)); targetDay = days[on.substr(0, 3)]; ourDay = date.getUTCDay(); date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0)); } return cache[year] = date; } function findRule(utcTime, rules, zone) { rules = rules[zone]; if (!rules) { var time = zone.split(":"); var offset = 0; if (time.length > 1) { offset = time[0] * 60 + Number(time[1]); } return [-1000000, 'max', '-', 'Jan', 1, [0, 0, 0], offset, '-']; } var year = new Date(utcTime).getUTCFullYear(); rules = jQuery.grep(rules, function(rule) { var from = rule[0]; var to = rule[1]; return from <= year && (to >= year || (from == year && to == "only") || to == "max"); }); rules.push(utcTime); rules.sort(function(a, b) { if (typeof a != "number") { a = Number(ruleToDate(year, a)); } if (typeof b != "number") { b = Number(ruleToDate(year, b)); } return a - b; }); var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1]; return isNaN(rule) ? rule : null; } function findZone(utcTime, zones, timezone) { var zoneRules = zones[timezone]; if (typeof zoneRules === "string") { zoneRules = zones[zoneRules]; } if (!zoneRules) { throw new Error('Timezone "' + timezone + '" is either incorrect, or kendo.timezones.min.js is not included.'); } for (var idx = zoneRules.length - 1; idx >= 0; idx--) { var until = zoneRules[idx][3]; if (until && utcTime > until) { break; } } var zone = zoneRules[idx + 1]; if (!zone) { throw new Error('Timezone "' + timezone + '" not found on ' + utcTime + "."); } return zone; } function zoneAndRule(utcTime, zones, rules, timezone) { if (typeof utcTime != NUMBER) { utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(), utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(), utcTime.getSeconds(), utcTime.getMilliseconds()); } var zone = findZone(utcTime, zones, timezone); return { zone: zone, rule: findRule(utcTime, rules, zone[1]) }; } function offset(utcTime, timezone) { if (timezone == "Etc/UTC" || timezone == "Etc/GMT") { return 0; } var info = zoneAndRule(utcTime, this.zones, this.rules, timezone); var zone = info.zone; var rule = info.rule; return kendo.parseFloat(rule? zone[0] - rule[6] : zone[0]); } function abbr(utcTime, timezone) { var info = zoneAndRule(utcTime, this.zones, this.rules, timezone); var zone = info.zone; var rule = info.rule; var base = zone[2]; if (base.indexOf("/") >= 0) { return base.split("/")[rule && +rule[6] ? 1 : 0]; } else if (base.indexOf("%s") >= 0) { return base.replace("%s", (!rule || rule[7] == "-") ? '' : rule[7]); } return base; } function convert(date, fromOffset, toOffset) { if (typeof fromOffset == STRING) { fromOffset = this.offset(date, fromOffset); } if (typeof toOffset == STRING) { toOffset = this.offset(date, toOffset); } var fromLocalOffset = date.getTimezoneOffset(); date = new Date(date.getTime() + (fromOffset - toOffset) * 60000); var toLocalOffset = date.getTimezoneOffset(); return new Date(date.getTime() + (toLocalOffset - fromLocalOffset) * 60000); } function apply(date, timezone) { return this.convert(date, date.getTimezoneOffset(), timezone); } function remove(date, timezone) { return this.convert(date, timezone, date.getTimezoneOffset()); } function toLocalDate(time) { return this.apply(new Date(time), "Etc/UTC"); } return { zones: {}, rules: {}, offset: offset, convert: convert, apply: apply, remove: remove, abbr: abbr, toLocalDate: toLocalDate }; })(); kendo.date = (function(){ var MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000; function adjustDST(date, hours) { if (hours === 0 && date.getHours() === 23) { date.setHours(date.getHours() + 2); return true; } return false; } function setDayOfWeek(date, day, dir) { var hours = date.getHours(); dir = dir || 1; day = ((day - date.getDay()) + (7 * dir)) % 7; date.setDate(date.getDate() + day); adjustDST(date, hours); } function dayOfWeek(date, day, dir) { date = new Date(date); setDayOfWeek(date, day, dir); return date; } function firstDayOfMonth(date) { return new Date( date.getFullYear(), date.getMonth(), 1 ); } function lastDayOfMonth(date) { var last = new Date(date.getFullYear(), date.getMonth() + 1, 0), first = firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset()); if (timeOffset) { last.setHours(first.getHours() + (timeOffset / 60)); } return last; } function getDate(date) { date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); adjustDST(date, 0); return date; } function toUtcTime(date) { return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()); } function getMilliseconds(date) { return date.getTime() - getDate(date); } function isInTimeRange(value, min, max) { var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue; if (!value || msMin == msMax) { return true; } if (min >= max) { max += MS_PER_DAY; } msValue = getMilliseconds(value); if (msMin > msValue) { msValue += MS_PER_DAY; } if (msMax < msMin) { msMax += MS_PER_DAY; } return msValue >= msMin && msValue <= msMax; } function isInDateRange(value, min, max) { var msMin = min.getTime(), msMax = max.getTime(), msValue; if (msMin >= msMax) { msMax += MS_PER_DAY; } msValue = value.getTime(); return msValue >= msMin && msValue <= msMax; } function addDays(date, offset) { var hours = date.getHours(); date = new Date(date); setTime(date, offset * MS_PER_DAY); adjustDST(date, hours); return date; } function setTime(date, milliseconds, ignoreDST) { var offset = date.getTimezoneOffset(); var difference; date.setTime(date.getTime() + milliseconds); if (!ignoreDST) { difference = date.getTimezoneOffset() - offset; date.setTime(date.getTime() + difference * MS_PER_MINUTE); } } function today() { return getDate(new Date()); } function isToday(date) { return getDate(date).getTime() == today().getTime(); } function toInvariantTime(date) { var staticDate = new Date(1980, 1, 1, 0, 0, 0); if (date) { staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()); } return staticDate; } return { adjustDST: adjustDST, dayOfWeek: dayOfWeek, setDayOfWeek: setDayOfWeek, getDate: getDate, isInDateRange: isInDateRange, isInTimeRange: isInTimeRange, isToday: isToday, nextDay: function(date) { return addDays(date, 1); }, previousDay: function(date) { return addDays(date, -1); }, toUtcTime: toUtcTime, MS_PER_DAY: MS_PER_DAY, MS_PER_HOUR: 60 * MS_PER_MINUTE, MS_PER_MINUTE: MS_PER_MINUTE, setTime: setTime, addDays: addDays, today: today, toInvariantTime: toInvariantTime, firstDayOfMonth: firstDayOfMonth, lastDayOfMonth: lastDayOfMonth, getMilliseconds: getMilliseconds //TODO methods: combine date portion and time portion from arguments - date1, date 2 }; })(); kendo.stripWhitespace = function(element) { if (document.createNodeIterator) { var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function(node) { return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT; }, false); while (iterator.nextNode()) { if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) { iterator.referenceNode.parentNode.removeChild(iterator.referenceNode); } } } else { // IE7/8 support for (var i = 0; i < element.childNodes.length; i++) { var child = element.childNodes[i]; if (child.nodeType == 3 && !/\S/.test(child.nodeValue)) { element.removeChild(child); i--; } if (child.nodeType == 1) { kendo.stripWhitespace(child); } } } }; var animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback){ setTimeout(callback, 1000 / 60); }; kendo.animationFrame = function(callback) { animationFrame.call(window, callback); }; var animationQueue = []; kendo.queueAnimation = function(callback) { animationQueue[animationQueue.length] = callback; if (animationQueue.length === 1) { kendo.runNextAnimation(); } }; kendo.runNextAnimation = function() { kendo.animationFrame(function() { if (animationQueue[0]) { animationQueue.shift()(); if (animationQueue[0]) { kendo.runNextAnimation(); } } }); }; kendo.parseQueryStringParams = function(url) { var queryString = url.split('?')[1] || "", params = {}, paramParts = queryString.split(/&|=/), length = paramParts.length, idx = 0; for (; idx < length; idx += 2) { if(paramParts[idx] !== "") { params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]); } } return params; }; kendo.elementUnderCursor = function(e) { return document.elementFromPoint(e.x.client, e.y.client); }; kendo.wheelDeltaY = function(jQueryEvent) { var e = jQueryEvent.originalEvent, deltaY = e.wheelDeltaY, delta; if (e.wheelDelta) { // Webkit and IE if (deltaY === undefined || deltaY) { // IE does not have deltaY, thus always scroll (horizontal scrolling is treated as vertical) delta = e.wheelDelta; } } else if (e.detail && e.axis === e.VERTICAL_AXIS) { // Firefox and Opera delta = (-e.detail) * 10; } return delta; }; kendo.throttle = function(fn, delay) { var timeout; var lastExecTime = 0; if (!delay || delay <= 0) { return fn; } var throttled = function() { var that = this; var elapsed = +new Date() - lastExecTime; var args = arguments; function exec() { fn.apply(that, args); lastExecTime = +new Date(); } // first execution if (!lastExecTime) { return exec(); } if (timeout) { clearTimeout(timeout); } if (elapsed > delay) { exec(); } else { timeout = setTimeout(exec, delay - elapsed); } }; throttled.cancel = function() { clearTimeout(timeout); }; return throttled; }; kendo.caret = function (element, start, end) { var rangeElement; var isPosition = start !== undefined; if (end === undefined) { end = start; } if (element[0]) { element = element[0]; } if (isPosition && element.disabled) { return; } try { if (element.selectionStart !== undefined) { if (isPosition) { element.focus(); element.setSelectionRange(start, end); } else { start = [element.selectionStart, element.selectionEnd]; } } else if (document.selection) { if ($(element).is(":visible")) { element.focus(); } rangeElement = element.createTextRange(); if (isPosition) { rangeElement.collapse(true); rangeElement.moveStart("character", start); rangeElement.moveEnd("character", end - start); rangeElement.select(); } else { var rangeDuplicated = rangeElement.duplicate(), selectionStart, selectionEnd; rangeElement.moveToBookmark(document.selection.createRange().getBookmark()); rangeDuplicated.setEndPoint('EndToStart', rangeElement); selectionStart = rangeDuplicated.text.length; selectionEnd = selectionStart + rangeElement.text.length; start = [selectionStart, selectionEnd]; } } } catch(e) { /* element is not focused or it is not in the DOM */ start = []; } return start; }; kendo.compileMobileDirective = function(element, scopeSetup) { var angular = window.angular; element.attr("data-" + kendo.ns + "role", element[0].tagName.toLowerCase().replace('kendo-mobile-', '').replace('-', '')); angular.element(element).injector().invoke(["$compile", function($compile) { var scope = angular.element(element).scope(); if (scopeSetup) { scopeSetup(scope); } $compile(element)(scope); if (!/^\$(digest|apply)$/.test(scope.$$phase)) { scope.$digest(); } }]); return kendo.widgetInstance(element, kendo.mobile.ui); }; kendo.antiForgeryTokens = function() { var tokens = { }, csrf_token = $("meta[name=csrf-token]").attr("content"), csrf_param = $("meta[name=csrf-param]").attr("content"); $("input[name^='__RequestVerificationToken']").each(function() { tokens[this.name] = this.value; }); if (csrf_param !== undefined && csrf_token !== undefined) { tokens[csrf_param] = csrf_token; } return tokens; }; // kendo.saveAs ----------------------------------------------- (function() { function postToProxy(dataURI, fileName, proxyURL) { var form = $("
").attr({ action: proxyURL, method: "POST" }); var data = kendo.antiForgeryTokens(); data.fileName = fileName; var parts = dataURI.split(";base64,"); data.contentType = parts[0].replace("data:", ""); data.base64 = parts[1]; for (var name in data) { if (data.hasOwnProperty(name)) { $('').attr({ value: data[name], name: name, type: "hidden" }).appendTo(form); } } form.appendTo("body").submit().remove(); } var fileSaver = document.createElement("a"); var downloadAttribute = "download" in fileSaver; function saveAsBlob(dataURI, fileName) { var blob = dataURI; // could be a Blob object if (typeof dataURI == "string") { var parts = dataURI.split(";base64,"); var contentType = parts[0]; var base64 = atob(parts[1]); var array = new Uint8Array(base64.length); for (var idx = 0; idx < base64.length; idx++) { array[idx] = base64.charCodeAt(idx); } blob = new Blob([array.buffer], { type: contentType }); } navigator.msSaveBlob(blob, fileName); } function saveAsDataURI(dataURI, fileName) { if (window.Blob && dataURI instanceof Blob) { dataURI = URL.createObjectURL(dataURI); } fileSaver.download = fileName; fileSaver.href = dataURI; var e = document.createEvent("MouseEvents"); e.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); fileSaver.dispatchEvent(e); } kendo.saveAs = function(options) { var save = postToProxy; if (!options.forceProxy) { if (downloadAttribute) { save = saveAsDataURI; } else if (navigator.msSaveBlob) { save = saveAsBlob; } } save(options.dataURI, options.fileName, options.proxyURL); }; })(); })(jQuery, window); (function($, undefined) { var kendo = window.kendo, CHANGE = "change", BACK = "back", SAME = "same", support = kendo.support, location = window.location, history = window.history, CHECK_URL_INTERVAL = 50, BROKEN_BACK_NAV = kendo.support.browser.msie, hashStrip = /^#*/, document = window.document; function absoluteURL(path, pathPrefix) { if (!pathPrefix) { return path; } if (path + "/" === pathPrefix) { path = pathPrefix; } var regEx = new RegExp("^" + pathPrefix, "i"); if (!regEx.test(path)) { path = pathPrefix + "/" + path; } return location.protocol + '//' + (location.host + "/" + path).replace(/\/\/+/g, '/'); } function hashDelimiter(bang) { return bang ? "#!" : "#"; } function locationHash(hashDelimiter) { var href = location.href; // ignore normal anchors if in hashbang mode - however, still return "" if no hash present if (hashDelimiter === "#!" && href.indexOf("#") > -1 && href.indexOf("#!") < 0) { return null; } return href.split(hashDelimiter)[1] || ""; } function stripRoot(root, url) { if (url.indexOf(root) === 0) { return (url.substr(root.length)).replace(/\/\//g, '/'); } else { return url; } } var HistoryAdapter = kendo.Class.extend({ back: function() { if (BROKEN_BACK_NAV) { setTimeout(function() { history.back(); }); } else { history.back(); } }, forward: function() { if (BROKEN_BACK_NAV) { setTimeout(function() { history.forward(); }); } else { history.forward(); } }, length: function() { return history.length; }, replaceLocation: function(url) { location.replace(url); } }); var PushStateAdapter = HistoryAdapter.extend({ init: function(root) { this.root = root; }, navigate: function(to) { history.pushState({}, document.title, absoluteURL(to, this.root)); }, replace: function(to) { history.replaceState({}, document.title, absoluteURL(to, this.root)); }, normalize: function(url) { return stripRoot(this.root, url); }, current: function() { var current = location.pathname; if (location.search) { current += location.search; } return stripRoot(this.root, current); }, change: function(callback) { $(window).bind("popstate.kendo", callback); }, stop: function() { $(window).unbind("popstate.kendo"); }, normalizeCurrent: function(options) { var fixedUrl, root = options.root, pathname = location.pathname, hash = locationHash(hashDelimiter(options.hashBang)); if (root === pathname + "/") { fixedUrl = root; } if (root === pathname && hash) { fixedUrl = absoluteURL(hash.replace(hashStrip, ''), root); } if (fixedUrl) { history.pushState({}, document.title, fixedUrl); } } }); function fixHash(url) { return url.replace(/^(#)?/, "#"); } function fixBang(url) { return url.replace(/^(#(!)?)?/, "#!"); } var HashAdapter = HistoryAdapter.extend({ init: function(bang) { this._id = kendo.guid(); this.prefix = hashDelimiter(bang); this.fix = bang ? fixBang : fixHash; }, navigate: function(to) { location.hash = this.fix(to); }, replace: function(to) { this.replaceLocation(this.fix(to)); }, normalize: function(url) { if (url.indexOf(this.prefix) < 0) { return url; } else { return url.split(this.prefix)[1]; } }, change: function(callback) { if (support.hashChange) { $(window).on("hashchange." + this._id, callback); } else { this._interval = setInterval(callback, CHECK_URL_INTERVAL); } }, stop: function() { $(window).off("hashchange." + this._id); clearInterval(this._interval); }, current: function() { return locationHash(this.prefix); }, normalizeCurrent: function(options) { var pathname = location.pathname, root = options.root; if (options.pushState && root !== pathname) { this.replaceLocation(root + this.prefix + stripRoot(root, pathname)); return true; // browser will reload at this point. } return false; } }); var History = kendo.Observable.extend({ start: function(options) { options = options || {}; this.bind([CHANGE, BACK, SAME], options); if (this._started) { return; } this._started = true; options.root = options.root || "/"; var adapter = this.createAdapter(options), current; // adapter may reload the document if (adapter.normalizeCurrent(options)) { return; } current = adapter.current(); $.extend(this, { adapter: adapter, root: options.root, historyLength: adapter.length(), current: current, locations: [current] }); adapter.change($.proxy(this, "_checkUrl")); }, createAdapter:function(options) { return support.pushState && options.pushState ? new PushStateAdapter(options.root) : new HashAdapter(options.hashBang); }, stop: function() { if (!this._started) { return; } this.adapter.stop(); this.unbind(CHANGE); this._started = false; }, change: function(callback) { this.bind(CHANGE, callback); }, replace: function(to, silent) { this._navigate(to, silent, function(adapter) { adapter.replace(to); this.locations[this.locations.length - 1] = this.current; }); }, navigate: function(to, silent) { if (to === "#:back") { this.backCalled = true; this.adapter.back(); return; } this._navigate(to, silent, function(adapter) { adapter.navigate(to); this.locations.push(this.current); }); }, _navigate: function(to, silent, callback) { var adapter = this.adapter; to = adapter.normalize(to); if (this.current === to || this.current === decodeURIComponent(to)) { this.trigger(SAME); return; } if (!silent) { if (this.trigger(CHANGE, { url: to })) { return; } } this.current = to; callback.call(this, adapter); this.historyLength = adapter.length(); }, _checkUrl: function() { var adapter = this.adapter, current = adapter.current(), newLength = adapter.length(), navigatingInExisting = this.historyLength === newLength, back = current === this.locations[this.locations.length - 2] && navigatingInExisting, backCalled = this.backCalled, prev = this.current; if (current === null || this.current === current || this.current === decodeURIComponent(current)) { return true; } this.historyLength = newLength; this.backCalled = false; this.current = current; if (back && this.trigger("back", { url: prev, to: current })) { adapter.forward(); this.current = prev; return; } if (this.trigger(CHANGE, { url: current, backButtonPressed: !backCalled })) { if (back) { adapter.forward(); } else { adapter.back(); this.historyLength --; } this.current = prev; return; } if (back) { this.locations.pop(); } else { this.locations.push(current); } } }); kendo.History = History; kendo.History.HistoryAdapter = HistoryAdapter; kendo.History.HashAdapter = HashAdapter; kendo.History.PushStateAdapter = PushStateAdapter; kendo.absoluteURL = absoluteURL; kendo.history = new History(); })(window.kendo.jQuery); (function() { var kendo = window.kendo, history = kendo.history, Observable = kendo.Observable, INIT = "init", ROUTE_MISSING = "routeMissing", CHANGE = "change", BACK = "back", SAME = "same", optionalParam = /\((.*?)\)/g, namedParam = /(\(\?)?:\w+/g, splatParam = /\*\w+/g, escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g; function namedParamReplace(match, optional) { return optional ? match : '([^\/]+)'; } function routeToRegExp(route, ignoreCase) { return new RegExp('^' + route .replace(escapeRegExp, '\\$&') .replace(optionalParam, '(?:$1)?') .replace(namedParam, namedParamReplace) .replace(splatParam, '(.*?)') + '$', ignoreCase ? "i" : ""); } function stripUrl(url) { return url.replace(/(\?.*)|(#.*)/g, ""); } var Route = kendo.Class.extend({ init: function(route, callback, ignoreCase) { if (!(route instanceof RegExp)) { route = routeToRegExp(route, ignoreCase); } this.route = route; this._callback = callback; }, callback: function(url) { var params, idx = 0, length, queryStringParams = kendo.parseQueryStringParams(url); url = stripUrl(url); params = this.route.exec(url).slice(1); length = params.length; for (; idx < length; idx ++) { if (typeof params[idx] !== 'undefined') { params[idx] = decodeURIComponent(params[idx]); } } params.push(queryStringParams); this._callback.apply(null, params); }, worksWith: function(url) { if (this.route.test(stripUrl(url))) { this.callback(url); return true; } else { return false; } } }); var Router = Observable.extend({ init: function(options) { if (!options) { options = {}; } Observable.fn.init.call(this); this.routes = []; this.pushState = options.pushState; this.hashBang = options.hashBang; this.root = options.root; this.ignoreCase = options.ignoreCase !== false; this.bind([INIT, ROUTE_MISSING, CHANGE, SAME], options); }, destroy: function() { history.unbind(CHANGE, this._urlChangedProxy); history.unbind(SAME, this._sameProxy); history.unbind(BACK, this._backProxy); this.unbind(); }, start: function() { var that = this, sameProxy = function() { that._same(); }, backProxy = function(e) { that._back(e); }, urlChangedProxy = function(e) { that._urlChanged(e); }; history.start({ same: sameProxy, change: urlChangedProxy, back: backProxy, pushState: that.pushState, hashBang: that.hashBang, root: that.root }); var initEventObject = { url: history.current || "/", preventDefault: $.noop }; if (!that.trigger(INIT, initEventObject)) { that._urlChanged(initEventObject); } this._urlChangedProxy = urlChangedProxy; this._backProxy = backProxy; }, route: function(route, callback) { this.routes.push(new Route(route, callback, this.ignoreCase)); }, navigate: function(url, silent) { kendo.history.navigate(url, silent); }, replace: function(url, silent) { kendo.history.replace(url, silent); }, _back: function(e) { if (this.trigger(BACK, { url: e.url, to: e.to })) { e.preventDefault(); } }, _same: function(e) { this.trigger(SAME); }, _urlChanged: function(e) { var url = e.url; if (!url) { url = "/"; } if (this.trigger(CHANGE, { url: e.url, params: kendo.parseQueryStringParams(e.url), backButtonPressed: e.backButtonPressed })) { e.preventDefault(); return; } var idx = 0, routes = this.routes, route, length = routes.length; for (; idx < length; idx ++) { route = routes[idx]; if (route.worksWith(url)) { return; } } if (this.trigger(ROUTE_MISSING, { url: url, params: kendo.parseQueryStringParams(url), backButtonPressed: e.backButtonPressed })) { e.preventDefault(); } } }); kendo.Router = Router; })(); (function($, undefined) { var kendo = window.kendo, extend = $.extend, odataFilters = { eq: "eq", neq: "ne", gt: "gt", gte: "ge", lt: "lt", lte: "le", contains : "substringof", doesnotcontain: "substringof", endswith: "endswith", startswith: "startswith" }, odataFiltersVersionFour = extend({}, odataFilters, { contains: "contains" }), mappers = { pageSize: $.noop, page: $.noop, filter: function(params, filter, useVersionFour) { if (filter) { params.$filter = toOdataFilter(filter, useVersionFour); } }, sort: function(params, orderby) { var expr = $.map(orderby, function(value) { var order = value.field.replace(/\./g, "/"); if (value.dir === "desc") { order += " desc"; } return order; }).join(","); if (expr) { params.$orderby = expr; } }, skip: function(params, skip) { if (skip) { params.$skip = skip; } }, take: function(params, take) { if (take) { params.$top = take; } } }, defaultDataType = { read: { dataType: "jsonp" } }; function toOdataFilter(filter, useOdataFour) { var result = [], logic = filter.logic || "and", idx, length, field, type, format, operator, value, ignoreCase, filters = filter.filters; for (idx = 0, length = filters.length; idx < length; idx++) { filter = filters[idx]; field = filter.field; value = filter.value; operator = filter.operator; if (filter.filters) { filter = toOdataFilter(filter, useOdataFour); } else { ignoreCase = filter.ignoreCase; field = field.replace(/\./g, "/"); filter = odataFilters[operator]; if (useOdataFour) { filter = odataFiltersVersionFour[operator]; } if (filter && value !== undefined) { type = $.type(value); if (type === "string") { format = "'{1}'"; value = value.replace(/'/g, "''"); if (ignoreCase === true) { field = "tolower(" + field + ")"; } } else if (type === "date") { if (useOdataFour) { format = "{1:yyyy-MM-ddTHH:mm:ss+00:00}"; } else { format = "datetime'{1:yyyy-MM-ddTHH:mm:ss}'"; } } else { format = "{1}"; } if (filter.length > 3) { if (filter !== "substringof") { format = "{0}({2}," + format + ")"; } else { format = "{0}(" + format + ",{2})"; if (operator === "doesnotcontain") { if (useOdataFour) { format = "{0}({2},'{1}') eq -1"; filter = "indexof"; } else { format += " eq false"; } } } } else { format = "{2} {0} " + format; } filter = kendo.format(format, filter, value, field); } } result.push(filter); } filter = result.join(" " + logic + " "); if (result.length > 1) { filter = "(" + filter + ")"; } return filter; } function stripMetadata(obj) { for (var name in obj) { if(name.indexOf("@odata") === 0) { delete obj[name]; } } } extend(true, kendo.data, { schemas: { odata: { type: "json", data: function(data) { return data.d.results || [data.d]; }, total: "d.__count" } }, transports: { odata: { read: { cache: true, // to prevent jQuery from adding cache buster dataType: "jsonp", jsonp: "$callback" }, update: { cache: true, dataType: "json", contentType: "application/json", // to inform the server the the request body is JSON encoded type: "PUT" // can be PUT or MERGE }, create: { cache: true, dataType: "json", contentType: "application/json", type: "POST" // must be POST to create new entity }, destroy: { cache: true, dataType: "json", type: "DELETE" }, parameterMap: function(options, type, useVersionFour) { var params, value, option, dataType; options = options || {}; type = type || "read"; dataType = (this.options || defaultDataType)[type]; dataType = dataType ? dataType.dataType : "json"; if (type === "read") { params = { $inlinecount: "allpages" }; if (dataType != "json") { params.$format = "json"; } for (option in options) { if (mappers[option]) { mappers[option](params, options[option], useVersionFour); } else { params[option] = options[option]; } } } else { if (dataType !== "json") { throw new Error("Only json dataType can be used for " + type + " operation."); } if (type !== "destroy") { for (option in options) { value = options[option]; if (typeof value === "number") { options[option] = value + ""; } } params = kendo.stringify(options); } } return params; } } } }); extend(true, kendo.data, { schemas: { "odata-v4": { type: "json", data: function(data) { data = $.extend({}, data); stripMetadata(data); if (data.value) { return data.value; } return [data]; }, total: function(data) { return data["@odata.count"]; } } }, transports: { "odata-v4": { read: { cache: true, // to prevent jQuery from adding cache buster dataType: "json" }, update: { cache: true, dataType: "json", contentType: "application/json;IEEE754Compatible=true", // to inform the server the the request body is JSON encoded type: "PUT" // can be PUT or MERGE }, create: { cache: true, dataType: "json", contentType: "application/json;IEEE754Compatible=true", type: "POST" // must be POST to create new entity }, destroy: { cache: true, dataType: "json", type: "DELETE" }, parameterMap: function(options, type) { var result = kendo.data.transports.odata.parameterMap(options, type, true); if (type == "read") { result.$count = true; delete result.$inlinecount; } return result; } } } }); })(window.kendo.jQuery); /*jshint eqnull: true, boss: true */ (function($, undefined) { var kendo = window.kendo, isArray = $.isArray, isPlainObject = $.isPlainObject, map = $.map, each = $.each, extend = $.extend, getter = kendo.getter, Class = kendo.Class; var XmlDataReader = Class.extend({ init: function(options) { var that = this, total = options.total, model = options.model, parse = options.parse, errors = options.errors, serialize = options.serialize, data = options.data; if (model) { if (isPlainObject(model)) { var base = options.modelBase || kendo.data.Model; if (model.fields) { each(model.fields, function(field, value) { if (isPlainObject(value) && value.field) { value = extend(value, { field: that.getter(value.field) }); } else { value = { field: that.getter(value) }; } model.fields[field] = value; }); } var id = model.id; if (id) { var idField = {}; idField[that.xpathToMember(id, true)] = { field : that.getter(id) }; model.fields = extend(idField, model.fields); model.id = that.xpathToMember(id); } model = base.define(model); } that.model = model; } if (total) { if (typeof total == "string") { total = that.getter(total); that.total = function(data) { return parseInt(total(data), 10); }; } else if (typeof total == "function"){ that.total = total; } } if (errors) { if (typeof errors == "string") { errors = that.getter(errors); that.errors = function(data) { return errors(data) || null; }; } else if (typeof errors == "function"){ that.errors = errors; } } if (data) { if (typeof data == "string") { data = that.xpathToMember(data); that.data = function(value) { var result = that.evaluate(value, data), modelInstance; result = isArray(result) ? result : [result]; if (that.model && model.fields) { modelInstance = new that.model(); return map(result, function(value) { if (value) { var record = {}, field; for (field in model.fields) { record[field] = modelInstance._parse(field, model.fields[field].field(value)); } return record; } }); } return result; }; } else if (typeof data == "function") { that.data = data; } } if (typeof parse == "function") { var xmlParse = that.parse; that.parse = function(data) { var xml = parse.call(that, data); return xmlParse.call(that, xml); }; } if (typeof serialize == "function") { that.serialize = serialize; } }, total: function(result) { return this.data(result).length; }, errors: function(data) { return data ? data.errors : null; }, serialize: function(data) { return data; }, parseDOM: function(element) { var result = {}, parsedNode, node, nodeType, nodeName, member, attribute, attributes = element.attributes, attributeCount = attributes.length, idx; for (idx = 0; idx < attributeCount; idx++) { attribute = attributes[idx]; result["@" + attribute.nodeName] = attribute.nodeValue; } for (node = element.firstChild; node; node = node.nextSibling) { nodeType = node.nodeType; if (nodeType === 3 || nodeType === 4) { // text nodes or CDATA are stored as #text field result["#text"] = node.nodeValue; } else if (nodeType === 1) { // elements are stored as fields parsedNode = this.parseDOM(node); nodeName = node.nodeName; member = result[nodeName]; if (isArray(member)) { // elements of same nodeName are stored as array member.push(parsedNode); } else if (member !== undefined) { member = [member, parsedNode]; } else { member = parsedNode; } result[nodeName] = member; } } return result; }, evaluate: function(value, expression) { var members = expression.split("."), member, result, length, intermediateResult, idx; while (member = members.shift()) { value = value[member]; if (isArray(value)) { result = []; expression = members.join("."); for (idx = 0, length = value.length; idx < length; idx++) { intermediateResult = this.evaluate(value[idx], expression); intermediateResult = isArray(intermediateResult) ? intermediateResult : [intermediateResult]; result.push.apply(result, intermediateResult); } return result; } } return value; }, parse: function(xml) { var documentElement, tree, result = {}; documentElement = xml.documentElement || $.parseXML(xml).documentElement; tree = this.parseDOM(documentElement); result[documentElement.nodeName] = tree; return result; }, xpathToMember: function(member, raw) { if (!member) { return ""; } member = member.replace(/^\//, "") // remove the first "/" .replace(/\//g, "."); // replace all "/" with "." if (member.indexOf("@") >= 0) { // replace @attribute with '["@attribute"]' return member.replace(/\.?(@.*)/, raw? '$1':'["$1"]'); } if (member.indexOf("text()") >= 0) { // replace ".text()" with '["#text"]' return member.replace(/(\.?text\(\))/, raw? '#text':'["#text"]'); } return member; }, getter: function(member) { return getter(this.xpathToMember(member), true); } }); $.extend(true, kendo.data, { XmlDataReader: XmlDataReader, readers: { xml: XmlDataReader } }); })(window.kendo.jQuery); /*jshint eqnull: true, loopfunc: true, evil: true */ (function($, undefined) { var extend = $.extend, proxy = $.proxy, isPlainObject = $.isPlainObject, isEmptyObject = $.isEmptyObject, isArray = $.isArray, grep = $.grep, ajax = $.ajax, map, each = $.each, noop = $.noop, kendo = window.kendo, isFunction = kendo.isFunction, Observable = kendo.Observable, Class = kendo.Class, STRING = "string", FUNCTION = "function", CREATE = "create", READ = "read", UPDATE = "update", DESTROY = "destroy", CHANGE = "change", SYNC = "sync", GET = "get", ERROR = "error", REQUESTSTART = "requestStart", PROGRESS = "progress", REQUESTEND = "requestEnd", crud = [CREATE, READ, UPDATE, DESTROY], identity = function(o) { return o; }, getter = kendo.getter, stringify = kendo.stringify, math = Math, push = [].push, join = [].join, pop = [].pop, splice = [].splice, shift = [].shift, slice = [].slice, unshift = [].unshift, toString = {}.toString, stableSort = kendo.support.stableSort, dateRegExp = /^\/Date\((.*?)\)\/$/, newLineRegExp = /(\r+|\n+)/g, quoteRegExp = /(?=['\\])/g; var ObservableArray = Observable.extend({ init: function(array, type) { var that = this; that.type = type || ObservableObject; Observable.fn.init.call(that); that.length = array.length; that.wrapAll(array, that); }, at: function(index) { return this[index]; }, toJSON: function() { var idx, length = this.length, value, json = new Array(length); for (idx = 0; idx < length; idx++){ value = this[idx]; if (value instanceof ObservableObject) { value = value.toJSON(); } json[idx] = value; } return json; }, parent: noop, wrapAll: function(source, target) { var that = this, idx, length, parent = function() { return that; }; target = target || []; for (idx = 0, length = source.length; idx < length; idx++) { target[idx] = that.wrap(source[idx], parent); } return target; }, wrap: function(object, parent) { var that = this, observable; if (object !== null && toString.call(object) === "[object Object]") { observable = object instanceof that.type || object instanceof Model; if (!observable) { object = object instanceof ObservableObject ? object.toJSON() : object; object = new that.type(object); } object.parent = parent; object.bind(CHANGE, function(e) { that.trigger(CHANGE, { field: e.field, node: e.node, index: e.index, items: e.items || [this], action: e.node ? (e.action || "itemloaded") : "itemchange" }); }); } return object; }, push: function() { var index = this.length, items = this.wrapAll(arguments), result; result = push.apply(this, items); this.trigger(CHANGE, { action: "add", index: index, items: items }); return result; }, slice: slice, sort: [].sort, join: join, pop: function() { var length = this.length, result = pop.apply(this); if (length) { this.trigger(CHANGE, { action: "remove", index: length - 1, items:[result] }); } return result; }, splice: function(index, howMany, item) { var items = this.wrapAll(slice.call(arguments, 2)), result, i, len; result = splice.apply(this, [index, howMany].concat(items)); if (result.length) { this.trigger(CHANGE, { action: "remove", index: index, items: result }); for (i = 0, len = result.length; i < len; i++) { if (result[i].children) { result[i].unbind(CHANGE); } } } if (item) { this.trigger(CHANGE, { action: "add", index: index, items: items }); } return result; }, shift: function() { var length = this.length, result = shift.apply(this); if (length) { this.trigger(CHANGE, { action: "remove", index: 0, items:[result] }); } return result; }, unshift: function() { var items = this.wrapAll(arguments), result; result = unshift.apply(this, items); this.trigger(CHANGE, { action: "add", index: 0, items: items }); return result; }, indexOf: function(item) { var that = this, idx, length; for (idx = 0, length = that.length; idx < length; idx++) { if (that[idx] === item) { return idx; } } return -1; }, forEach: function(callback) { var idx = 0, length = this.length; for (; idx < length; idx++) { callback(this[idx], idx, this); } }, map: function(callback) { var idx = 0, result = [], length = this.length; for (; idx < length; idx++) { result[idx] = callback(this[idx], idx, this); } return result; }, filter: function(callback) { var idx = 0, result = [], item, length = this.length; for (; idx < length; idx++) { item = this[idx]; if (callback(item, idx, this)) { result[result.length] = item; } } return result; }, find: function(callback) { var idx = 0, item, length = this.length; for (; idx < length; idx++) { item = this[idx]; if (callback(item, idx, this)) { return item; } } }, every: function(callback) { var idx = 0, item, length = this.length; for (; idx < length; idx++) { item = this[idx]; if (!callback(item, idx, this)) { return false; } } return true; }, some: function(callback) { var idx = 0, item, length = this.length; for (; idx < length; idx++) { item = this[idx]; if (callback(item, idx, this)) { return true; } } return false; }, // non-standard collection methods remove: function(item) { var idx = this.indexOf(item); if (idx !== -1) { this.splice(idx, 1); } }, empty: function() { this.splice(0, this.length); } }); var LazyObservableArray = ObservableArray.extend({ init: function(data, type) { Observable.fn.init.call(this); this.type = type || ObservableObject; for (var idx = 0; idx < data.length; idx++) { this[idx] = data[idx]; } this.length = idx; this._parent = proxy(function() { return this; }, this); }, at: function(index) { var item = this[index]; if (!(item instanceof this.type)) { item = this[index] = this.wrap(item, this._parent); } else { item.parent = this._parent; } return item; } }); function eventHandler(context, type, field, prefix) { return function(e) { var event = {}, key; for (key in e) { event[key] = e[key]; } if (prefix) { event.field = field + "." + e.field; } else { event.field = field; } if (type == CHANGE && context._notifyChange) { context._notifyChange(event); } context.trigger(type, event); }; } var ObservableObject = Observable.extend({ init: function(value) { var that = this, member, field, parent = function() { return that; }; Observable.fn.init.call(this); for (field in value) { member = value[field]; if (typeof member === "object" && member && !member.getTime && field.charAt(0) != "_") { member = that.wrap(member, field, parent); } that[field] = member; } that.uid = kendo.guid(); }, shouldSerialize: function(field) { return this.hasOwnProperty(field) && field !== "_events" && typeof this[field] !== FUNCTION && field !== "uid"; }, forEach: function(f) { for (var i in this) { if (this.shouldSerialize(i)) { f(this[i], i); } } }, toJSON: function() { var result = {}, value, field; for (field in this) { if (this.shouldSerialize(field)) { value = this[field]; if (value instanceof ObservableObject || value instanceof ObservableArray) { value = value.toJSON(); } result[field] = value; } } return result; }, get: function(field) { var that = this, result; that.trigger(GET, { field: field }); if (field === "this") { result = that; } else { result = kendo.getter(field, true)(that); } return result; }, _set: function(field, value) { var that = this; var composite = field.indexOf(".") >= 0; if (composite) { var paths = field.split("."), path = ""; while (paths.length > 1) { path += paths.shift(); var obj = kendo.getter(path, true)(that); if (obj instanceof ObservableObject) { obj.set(paths.join("."), value); return composite; } path += "."; } } kendo.setter(field)(that, value); return composite; }, set: function(field, value) { var that = this, composite = field.indexOf(".") >= 0, current = kendo.getter(field, true)(that); if (current !== value) { if (!that.trigger("set", { field: field, value: value })) { if (!composite) { value = that.wrap(value, field, function() { return that; }); } if (!that._set(field, value) || field.indexOf("(") >= 0 || field.indexOf("[") >= 0) { that.trigger(CHANGE, { field: field }); } } } }, parent: noop, wrap: function(object, field, parent) { var that = this, type = toString.call(object); if (object != null && (type === "[object Object]" || type === "[object Array]")) { var isObservableArray = object instanceof ObservableArray; var isDataSource = object instanceof DataSource; if (type === "[object Object]" && !isDataSource && !isObservableArray) { if (!(object instanceof ObservableObject)) { object = new ObservableObject(object); } if (object.parent() != parent()) { object.bind(GET, eventHandler(that, GET, field, true)); object.bind(CHANGE, eventHandler(that, CHANGE, field, true)); } } else if (type === "[object Array]" || isObservableArray || isDataSource) { if (!isObservableArray && !isDataSource) { object = new ObservableArray(object); } if (object.parent() != parent()) { object.bind(CHANGE, eventHandler(that, CHANGE, field, false)); } } object.parent = parent; } return object; } }); function equal(x, y) { if (x === y) { return true; } var xtype = $.type(x), ytype = $.type(y), field; if (xtype !== ytype) { return false; } if (xtype === "date") { return x.getTime() === y.getTime(); } if (xtype !== "object" && xtype !== "array") { return false; } for (field in x) { if (!equal(x[field], y[field])) { return false; } } return true; } var parsers = { "number": function(value) { return kendo.parseFloat(value); }, "date": function(value) { return kendo.parseDate(value); }, "boolean": function(value) { if (typeof value === STRING) { return value.toLowerCase() === "true"; } return value != null ? !!value : value; }, "string": function(value) { return value != null ? (value + "") : value; }, "default": function(value) { return value; } }; var defaultValues = { "string": "", "number": 0, "date": new Date(), "boolean": false, "default": "" }; function getFieldByName(obj, name) { var field, fieldName; for (fieldName in obj) { field = obj[fieldName]; if (isPlainObject(field) && field.field && field.field === name) { return field; } else if (field === name) { return field; } } return null; } var Model = ObservableObject.extend({ init: function(data) { var that = this; if (!data || $.isEmptyObject(data)) { data = $.extend({}, that.defaults, data); if (that._initializers) { for (var idx = 0; idx < that._initializers.length; idx++) { var name = that._initializers[idx]; data[name] = that.defaults[name](); } } } ObservableObject.fn.init.call(that, data); that.dirty = false; if (that.idField) { that.id = that.get(that.idField); if (that.id === undefined) { that.id = that._defaultId; } } }, shouldSerialize: function(field) { return ObservableObject.fn.shouldSerialize.call(this, field) && field !== "uid" && !(this.idField !== "id" && field === "id") && field !== "dirty" && field !== "_accessors"; }, _parse: function(field, value) { var that = this, fieldName = field, fields = (that.fields || {}), parse; field = fields[field]; if (!field) { field = getFieldByName(fields, fieldName); } if (field) { parse = field.parse; if (!parse && field.type) { parse = parsers[field.type.toLowerCase()]; } } return parse ? parse(value) : value; }, _notifyChange: function(e) { var action = e.action; if (action == "add" || action == "remove") { this.dirty = true; } }, editable: function(field) { field = (this.fields || {})[field]; return field ? field.editable !== false : true; }, set: function(field, value, initiator) { var that = this; if (that.editable(field)) { value = that._parse(field, value); if (!equal(value, that.get(field))) { that.dirty = true; ObservableObject.fn.set.call(that, field, value, initiator); } } }, accept: function(data) { var that = this, parent = function() { return that; }, field; for (field in data) { var value = data[field]; if (field.charAt(0) != "_") { value = that.wrap(data[field], field, parent); } that._set(field, value); } if (that.idField) { that.id = that.get(that.idField); } that.dirty = false; }, isNew: function() { return this.id === this._defaultId; } }); Model.define = function(base, options) { if (options === undefined) { options = base; base = Model; } var model, proto = extend({ defaults: {} }, options), name, field, type, value, idx, length, fields = {}, originalName, id = proto.id, functionFields = []; if (id) { proto.idField = id; } if (proto.id) { delete proto.id; } if (id) { proto.defaults[id] = proto._defaultId = ""; } if (toString.call(proto.fields) === "[object Array]") { for (idx = 0, length = proto.fields.length; idx < length; idx++) { field = proto.fields[idx]; if (typeof field === STRING) { fields[field] = {}; } else if (field.field) { fields[field.field] = field; } } proto.fields = fields; } for (name in proto.fields) { field = proto.fields[name]; type = field.type || "default"; value = null; originalName = name; name = typeof (field.field) === STRING ? field.field : name; if (!field.nullable) { value = proto.defaults[originalName !== name ? originalName : name] = field.defaultValue !== undefined ? field.defaultValue : defaultValues[type.toLowerCase()]; if (typeof value === "function") { functionFields.push(name); } } if (options.id === name) { proto._defaultId = value; } proto.defaults[originalName !== name ? originalName : name] = value; field.parse = field.parse || parsers[type]; } if (functionFields.length > 0) { proto._initializers = functionFields; } model = base.extend(proto); model.define = function(options) { return Model.define(model, options); }; if (proto.fields) { model.fields = proto.fields; model.idField = proto.idField; } return model; }; var Comparer = { selector: function(field) { return isFunction(field) ? field : getter(field); }, compare: function(field) { var selector = this.selector(field); return function (a, b) { a = selector(a); b = selector(b); if (a == null && b == null) { return 0; } if (a == null) { return -1; } if (b == null) { return 1; } if (a.localeCompare) { return a.localeCompare(b); } return a > b ? 1 : (a < b ? -1 : 0); }; }, create: function(sort) { var compare = sort.compare || this.compare(sort.field); if (sort.dir == "desc") { return function(a, b) { return compare(b, a, true); }; } return compare; }, combine: function(comparers) { return function(a, b) { var result = comparers[0](a, b), idx, length; for (idx = 1, length = comparers.length; idx < length; idx ++) { result = result || comparers[idx](a, b); } return result; }; } }; var StableComparer = extend({}, Comparer, { asc: function(field) { var selector = this.selector(field); return function (a, b) { var valueA = selector(a); var valueB = selector(b); if (valueA && valueA.getTime && valueB && valueB.getTime) { valueA = valueA.getTime(); valueB = valueB.getTime(); } if (valueA === valueB) { return a.__position - b.__position; } if (valueA == null) { return -1; } if (valueB == null) { return 1; } if (valueA.localeCompare) { return valueA.localeCompare(valueB); } return valueA > valueB ? 1 : -1; }; }, desc: function(field) { var selector = this.selector(field); return function (a, b) { var valueA = selector(a); var valueB = selector(b); if (valueA && valueA.getTime && valueB && valueB.getTime) { valueA = valueA.getTime(); valueB = valueB.getTime(); } if (valueA === valueB) { return a.__position - b.__position; } if (valueA == null) { return 1; } if (valueB == null) { return -1; } if (valueB.localeCompare) { return valueB.localeCompare(valueA); } return valueA < valueB ? 1 : -1; }; }, create: function(sort) { return this[sort.dir](sort.field); } }); map = function (array, callback) { var idx, length = array.length, result = new Array(length); for (idx = 0; idx < length; idx++) { result[idx] = callback(array[idx], idx, array); } return result; }; var operators = (function(){ function quote(value) { return value.replace(quoteRegExp, "\\").replace(newLineRegExp, ""); } function operator(op, a, b, ignore) { var date; if (b != null) { if (typeof b === STRING) { b = quote(b); date = dateRegExp.exec(b); if (date) { b = new Date(+date[1]); } else if (ignore) { b = "'" + b.toLowerCase() + "'"; a = "(" + a + " || '').toLowerCase()"; } else { b = "'" + b + "'"; } } if (b.getTime) { //b looks like a Date a = "(" + a + "?" + a + ".getTime():" + a + ")"; b = b.getTime(); } } return a + " " + op + " " + b; } return { eq: function(a, b, ignore) { return operator("==", a, b, ignore); }, neq: function(a, b, ignore) { return operator("!=", a, b, ignore); }, gt: function(a, b, ignore) { return operator(">", a, b, ignore); }, gte: function(a, b, ignore) { return operator(">=", a, b, ignore); }, lt: function(a, b, ignore) { return operator("<", a, b, ignore); }, lte: function(a, b, ignore) { return operator("<=", a, b, ignore); }, startswith: function(a, b, ignore) { if (ignore) { a = "(" + a + " || '').toLowerCase()"; if (b) { b = b.toLowerCase(); } } if (b) { b = quote(b); } return a + ".lastIndexOf('" + b + "', 0) == 0"; }, endswith: function(a, b, ignore) { if (ignore) { a = "(" + a + " || '').toLowerCase()"; if (b) { b = b.toLowerCase(); } } if (b) { b = quote(b); } return a + ".indexOf('" + b + "', " + a + ".length - " + (b || "").length + ") >= 0"; }, contains: function(a, b, ignore) { if (ignore) { a = "(" + a + " || '').toLowerCase()"; if (b) { b = b.toLowerCase(); } } if (b) { b = quote(b); } return a + ".indexOf('" + b + "') >= 0"; }, doesnotcontain: function(a, b, ignore) { if (ignore) { a = "(" + a + " || '').toLowerCase()"; if (b) { b = b.toLowerCase(); } } if (b) { b = quote(b); } return a + ".indexOf('" + b + "') == -1"; } }; })(); function Query(data) { this.data = data || []; } Query.filterExpr = function(expression) { var expressions = [], logic = { and: " && ", or: " || " }, idx, length, filter, expr, fieldFunctions = [], operatorFunctions = [], field, operator, filters = expression.filters; for (idx = 0, length = filters.length; idx < length; idx++) { filter = filters[idx]; field = filter.field; operator = filter.operator; if (filter.filters) { expr = Query.filterExpr(filter); //Nested function fields or operators - update their index e.g. __o[0] -> __o[1] filter = expr.expression .replace(/__o\[(\d+)\]/g, function(match, index) { index = +index; return "__o[" + (operatorFunctions.length + index) + "]"; }) .replace(/__f\[(\d+)\]/g, function(match, index) { index = +index; return "__f[" + (fieldFunctions.length + index) + "]"; }); operatorFunctions.push.apply(operatorFunctions, expr.operators); fieldFunctions.push.apply(fieldFunctions, expr.fields); } else { if (typeof field === FUNCTION) { expr = "__f[" + fieldFunctions.length +"](d)"; fieldFunctions.push(field); } else { expr = kendo.expr(field); } if (typeof operator === FUNCTION) { filter = "__o[" + operatorFunctions.length + "](" + expr + ", " + filter.value + ")"; operatorFunctions.push(operator); } else { filter = operators[(operator || "eq").toLowerCase()](expr, filter.value, filter.ignoreCase !== undefined? filter.ignoreCase : true); } } expressions.push(filter); } return { expression: "(" + expressions.join(logic[expression.logic]) + ")", fields: fieldFunctions, operators: operatorFunctions }; }; function normalizeSort(field, dir) { if (field) { var descriptor = typeof field === STRING ? { field: field, dir: dir } : field, descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined ? [descriptor] : []); return grep(descriptors, function(d) { return !!d.dir; }); } } var operatorMap = { "==": "eq", equals: "eq", isequalto: "eq", equalto: "eq", equal: "eq", "!=": "neq", ne: "neq", notequals: "neq", isnotequalto: "neq", notequalto: "neq", notequal: "neq", "<": "lt", islessthan: "lt", lessthan: "lt", less: "lt", "<=": "lte", le: "lte", islessthanorequalto: "lte", lessthanequal: "lte", ">": "gt", isgreaterthan: "gt", greaterthan: "gt", greater: "gt", ">=": "gte", isgreaterthanorequalto: "gte", greaterthanequal: "gte", ge: "gte", notsubstringof: "doesnotcontain" }; function normalizeOperator(expression) { var idx, length, filter, operator, filters = expression.filters; if (filters) { for (idx = 0, length = filters.length; idx < length; idx++) { filter = filters[idx]; operator = filter.operator; if (operator && typeof operator === STRING) { filter.operator = operatorMap[operator.toLowerCase()] || operator; } normalizeOperator(filter); } } } function normalizeFilter(expression) { if (expression && !isEmptyObject(expression)) { if (isArray(expression) || !expression.filters) { expression = { logic: "and", filters: isArray(expression) ? expression : [expression] }; } normalizeOperator(expression); return expression; } } Query.normalizeFilter = normalizeFilter; function normalizeAggregate(expressions) { return isArray(expressions) ? expressions : [expressions]; } function normalizeGroup(field, dir) { var descriptor = typeof field === STRING ? { field: field, dir: dir } : field, descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined ? [descriptor] : []); return map(descriptors, function(d) { return { field: d.field, dir: d.dir || "asc", aggregates: d.aggregates }; }); } Query.prototype = { toArray: function () { return this.data; }, range: function(index, count) { return new Query(this.data.slice(index, index + count)); }, skip: function (count) { return new Query(this.data.slice(count)); }, take: function (count) { return new Query(this.data.slice(0, count)); }, select: function (selector) { return new Query(map(this.data, selector)); }, order: function(selector, dir) { var sort = { dir: dir }; if (selector) { if (selector.compare) { sort.compare = selector.compare; } else { sort.field = selector; } } return new Query(this.data.slice(0).sort(Comparer.create(sort))); }, orderBy: function(selector) { return this.order(selector, "asc"); }, orderByDescending: function(selector) { return this.order(selector, "desc"); }, sort: function(field, dir, comparer) { var idx, length, descriptors = normalizeSort(field, dir), comparers = []; comparer = comparer || Comparer; if (descriptors.length) { for (idx = 0, length = descriptors.length; idx < length; idx++) { comparers.push(comparer.create(descriptors[idx])); } return this.orderBy({ compare: comparer.combine(comparers) }); } return this; }, filter: function(expressions) { var idx, current, length, compiled, predicate, data = this.data, fields, operators, result = [], filter; expressions = normalizeFilter(expressions); if (!expressions || expressions.filters.length === 0) { return this; } compiled = Query.filterExpr(expressions); fields = compiled.fields; operators = compiled.operators; predicate = filter = new Function("d, __f, __o", "return " + compiled.expression); if (fields.length || operators.length) { filter = function(d) { return predicate(d, fields, operators); }; } for (idx = 0, length = data.length; idx < length; idx++) { current = data[idx]; if (filter(current)) { result.push(current); } } return new Query(result); }, group: function(descriptors, allData) { descriptors = normalizeGroup(descriptors || []); allData = allData || this.data; var that = this, result = new Query(that.data), descriptor; if (descriptors.length > 0) { descriptor = descriptors[0]; result = result.groupBy(descriptor).select(function(group) { var data = new Query(allData).filter([ { field: group.field, operator: "eq", value: group.value, ignoreCase: false } ]); return { field: group.field, value: group.value, items: descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), data.toArray()).toArray() : group.items, hasSubgroups: descriptors.length > 1, aggregates: data.aggregate(descriptor.aggregates) }; }); } return result; }, groupBy: function(descriptor) { if (isEmptyObject(descriptor) || !this.data.length) { return new Query([]); } var field = descriptor.field, sorted = this._sortForGrouping(field, descriptor.dir || "asc"), accessor = kendo.accessor(field), item, groupValue = accessor.get(sorted[0], field), group = { field: field, value: groupValue, items: [] }, currentValue, idx, len, result = [group]; for(idx = 0, len = sorted.length; idx < len; idx++) { item = sorted[idx]; currentValue = accessor.get(item, field); if(!groupValueComparer(groupValue, currentValue)) { groupValue = currentValue; group = { field: field, value: groupValue, items: [] }; result.push(group); } group.items.push(item); } return new Query(result); }, _sortForGrouping: function(field, dir) { var idx, length, data = this.data; if (!stableSort) { for (idx = 0, length = data.length; idx < length; idx++) { data[idx].__position = idx; } data = new Query(data).sort(field, dir, StableComparer).toArray(); for (idx = 0, length = data.length; idx < length; idx++) { delete data[idx].__position; } return data; } return this.sort(field, dir).toArray(); }, aggregate: function (aggregates) { var idx, len, result = {}, state = {}; if (aggregates && aggregates.length) { for(idx = 0, len = this.data.length; idx < len; idx++) { calculateAggregate(result, aggregates, this.data[idx], idx, len, state); } } return result; } }; function groupValueComparer(a, b) { if (a && a.getTime && b && b.getTime) { return a.getTime() === b.getTime(); } return a === b; } function calculateAggregate(accumulator, aggregates, item, index, length, state) { aggregates = aggregates || []; var idx, aggr, functionName, len = aggregates.length; for (idx = 0; idx < len; idx++) { aggr = aggregates[idx]; functionName = aggr.aggregate; var field = aggr.field; accumulator[field] = accumulator[field] || {}; state[field] = state[field] || {}; state[field][functionName] = state[field][functionName] || {}; accumulator[field][functionName] = functions[functionName.toLowerCase()](accumulator[field][functionName], item, kendo.accessor(field), index, length, state[field][functionName]); } } var functions = { sum: function(accumulator, item, accessor) { var value = accessor.get(item); if (!isNumber(accumulator)) { accumulator = value; } else if (isNumber(value)) { accumulator += value; } return accumulator; }, count: function(accumulator) { return (accumulator || 0) + 1; }, average: function(accumulator, item, accessor, index, length, state) { var value = accessor.get(item); if (state.count === undefined) { state.count = 0; } if (!isNumber(accumulator)) { accumulator = value; } else if (isNumber(value)) { accumulator += value; } if (isNumber(value)) { state.count++; } if(index == length - 1 && isNumber(accumulator)) { accumulator = accumulator / state.count; } return accumulator; }, max: function(accumulator, item, accessor) { var value = accessor.get(item); if (!isNumber(accumulator) && !isDate(accumulator)) { accumulator = value; } if(accumulator < value && (isNumber(value) || isDate(value))) { accumulator = value; } return accumulator; }, min: function(accumulator, item, accessor) { var value = accessor.get(item); if (!isNumber(accumulator) && !isDate(accumulator)) { accumulator = value; } if(accumulator > value && (isNumber(value) || isDate(value))) { accumulator = value; } return accumulator; } }; function isNumber(val) { return typeof val === "number" && !isNaN(val); } function isDate(val) { return val && val.getTime; } function toJSON(array) { var idx, length = array.length, result = new Array(length); for (idx = 0; idx < length; idx++) { result[idx] = array[idx].toJSON(); } return result; } Query.process = function(data, options) { options = options || {}; var query = new Query(data), group = options.group, sort = normalizeGroup(group || []).concat(normalizeSort(options.sort || [])), total, filterCallback = options.filterCallback, filter = options.filter, skip = options.skip, take = options.take; if (filter) { query = query.filter(filter); if (filterCallback) { query = filterCallback(query); } total = query.toArray().length; } if (sort) { query = query.sort(sort); if (group) { data = query.toArray(); } } if (skip !== undefined && take !== undefined) { query = query.range(skip, take); } if (group) { query = query.group(group, data); } return { total: total, data: query.toArray() }; }; var LocalTransport = Class.extend({ init: function(options) { this.data = options.data; }, read: function(options) { options.success(this.data); }, update: function(options) { options.success(options.data); }, create: function(options) { options.success(options.data); }, destroy: function(options) { options.success(options.data); } }); var RemoteTransport = Class.extend( { init: function(options) { var that = this, parameterMap; options = that.options = extend({}, that.options, options); each(crud, function(index, type) { if (typeof options[type] === STRING) { options[type] = { url: options[type] }; } }); that.cache = options.cache? Cache.create(options.cache) : { find: noop, add: noop }; parameterMap = options.parameterMap; if (isFunction(options.push)) { that.push = options.push; } if (!that.push) { that.push = identity; } that.parameterMap = isFunction(parameterMap) ? parameterMap : function(options) { var result = {}; each(options, function(option, value) { if (option in parameterMap) { option = parameterMap[option]; if (isPlainObject(option)) { value = option.value(value); option = option.key; } } result[option] = value; }); return result; }; }, options: { parameterMap: identity }, create: function(options) { return ajax(this.setup(options, CREATE)); }, read: function(options) { var that = this, success, error, result, cache = that.cache; options = that.setup(options, READ); success = options.success || noop; error = options.error || noop; result = cache.find(options.data); if(result !== undefined) { success(result); } else { options.success = function(result) { cache.add(options.data, result); success(result); }; $.ajax(options); } }, update: function(options) { return ajax(this.setup(options, UPDATE)); }, destroy: function(options) { return ajax(this.setup(options, DESTROY)); }, setup: function(options, type) { options = options || {}; var that = this, parameters, operation = that.options[type], data = isFunction(operation.data) ? operation.data(options.data) : operation.data; options = extend(true, {}, operation, options); parameters = extend(true, {}, data, options.data); options.data = that.parameterMap(parameters, type); if (isFunction(options.url)) { options.url = options.url(parameters); } return options; } }); var Cache = Class.extend({ init: function() { this._store = {}; }, add: function(key, data) { if(key !== undefined) { this._store[stringify(key)] = data; } }, find: function(key) { return this._store[stringify(key)]; }, clear: function() { this._store = {}; }, remove: function(key) { delete this._store[stringify(key)]; } }); Cache.create = function(options) { var store = { "inmemory": function() { return new Cache(); } }; if (isPlainObject(options) && isFunction(options.find)) { return options; } if (options === true) { return new Cache(); } return store[options](); }; function serializeRecords(data, getters, modelInstance, originalFieldNames, fieldNames) { var record, getter, originalName, idx, length; for (idx = 0, length = data.length; idx < length; idx++) { record = data[idx]; for (getter in getters) { originalName = fieldNames[getter]; if (originalName && originalName !== getter) { record[originalName] = getters[getter](record); delete record[getter]; } } } } function convertRecords(data, getters, modelInstance, originalFieldNames, fieldNames) { var record, getter, originalName, idx, length; for (idx = 0, length = data.length; idx < length; idx++) { record = data[idx]; for (getter in getters) { record[getter] = modelInstance._parse(getter, getters[getter](record)); originalName = fieldNames[getter]; if (originalName && originalName !== getter) { delete record[originalName]; } } } } function convertGroup(data, getters, modelInstance, originalFieldNames, fieldNames) { var record, idx, fieldName, length; for (idx = 0, length = data.length; idx < length; idx++) { record = data[idx]; fieldName = originalFieldNames[record.field]; if (fieldName && fieldName != record.field) { record.field = fieldName; } record.value = modelInstance._parse(record.field, record.value); if (record.hasSubgroups) { convertGroup(record.items, getters, modelInstance, originalFieldNames, fieldNames); } else { convertRecords(record.items, getters, modelInstance, originalFieldNames, fieldNames); } } } function wrapDataAccess(originalFunction, model, converter, getters, originalFieldNames, fieldNames) { return function(data) { data = originalFunction(data); if (data && !isEmptyObject(getters)) { if (toString.call(data) !== "[object Array]" && !(data instanceof ObservableArray)) { data = [data]; } converter(data, getters, new model(), originalFieldNames, fieldNames); } return data || []; }; } var DataReader = Class.extend({ init: function(schema) { var that = this, member, get, model, base; schema = schema || {}; for (member in schema) { get = schema[member]; that[member] = typeof get === STRING ? getter(get) : get; } base = schema.modelBase || Model; if (isPlainObject(that.model)) { that.model = model = base.define(that.model); } var dataFunction = proxy(that.data, that); that._dataAccessFunction = dataFunction; if (that.model) { var groupsFunction = proxy(that.groups, that), serializeFunction = proxy(that.serialize, that), originalFieldNames = {}, getters = {}, serializeGetters = {}, fieldNames = {}, shouldSerialize = false, fieldName; model = that.model; if (model.fields) { each(model.fields, function(field, value) { var fromName; fieldName = field; if (isPlainObject(value) && value.field) { fieldName = value.field; } else if (typeof value === STRING) { fieldName = value; } if (isPlainObject(value) && value.from) { fromName = value.from; } shouldSerialize = shouldSerialize || (fromName && fromName !== field) || fieldName !== field; getters[field] = getter(fromName || fieldName); serializeGetters[field] = getter(field); originalFieldNames[fromName || fieldName] = field; fieldNames[field] = fromName || fieldName; }); if (!schema.serialize && shouldSerialize) { that.serialize = wrapDataAccess(serializeFunction, model, serializeRecords, serializeGetters, originalFieldNames, fieldNames); } } that._dataAccessFunction = dataFunction; that.data = wrapDataAccess(dataFunction, model, convertRecords, getters, originalFieldNames, fieldNames); that.groups = wrapDataAccess(groupsFunction, model, convertGroup, getters, originalFieldNames, fieldNames); } }, errors: function(data) { return data ? data.errors : null; }, parse: identity, data: identity, total: function(data) { return data.length; }, groups: identity, aggregates: function() { return {}; }, serialize: function(data) { return data; } }); function mergeGroups(target, dest, skip, take) { var group, idx = 0, items; while (dest.length && take) { group = dest[idx]; items = group.items; var length = items.length; if (target && target.field === group.field && target.value === group.value) { if (target.hasSubgroups && target.items.length) { mergeGroups(target.items[target.items.length - 1], group.items, skip, take); } else { items = items.slice(skip, skip + take); target.items = target.items.concat(items); } dest.splice(idx--, 1); } else if (group.hasSubgroups && items.length) { mergeGroups(group, items, skip, take); } else { items = items.slice(skip, skip + take); group.items = items; if (!group.items.length) { dest.splice(idx--, 1); } } if (items.length === 0) { skip -= length; } else { skip = 0; take -= items.length; } if (++idx >= dest.length) { break; } } if (idx < dest.length) { dest.splice(idx, dest.length - idx); } } function flattenGroups(data) { var idx, result = [], length, items, itemIndex; for (idx = 0, length = data.length; idx < length; idx++) { var group = data.at(idx); if (group.hasSubgroups) { result = result.concat(flattenGroups(group.items)); } else { items = group.items; for (itemIndex = 0; itemIndex < items.length; itemIndex++) { result.push(items.at(itemIndex)); } } } return result; } function wrapGroupItems(data, model) { var idx, length, group, items; if (model) { for (idx = 0, length = data.length; idx < length; idx++) { group = data.at(idx); if (group.hasSubgroups) { wrapGroupItems(group.items, model); } else { group.items = new LazyObservableArray(group.items, model); } } } } function eachGroupItems(data, func) { for (var idx = 0, length = data.length; idx < length; idx++) { if (data[idx].hasSubgroups) { if (eachGroupItems(data[idx].items, func)) { return true; } } else if (func(data[idx].items, data[idx])) { return true; } } } function replaceInRanges(ranges, data, item, observable) { for (var idx = 0; idx < ranges.length; idx++) { if (ranges[idx].data === data) { break; } if (replaceInRange(ranges[idx].data, item, observable)) { break; } } } function replaceInRange(items, item, observable) { for (var idx = 0, length = items.length; idx < length; idx++) { if (items[idx] && items[idx].hasSubgroups) { return replaceInRange(items[idx].items, item, observable); } else if (items[idx] === item || items[idx] === observable) { items[idx] = observable; return true; } } } function replaceWithObservable(view, data, ranges, type, serverGrouping) { for (var viewIndex = 0, length = view.length; viewIndex < length; viewIndex++) { var item = view[viewIndex]; if (!item || item instanceof type) { continue; } if (item.hasSubgroups !== undefined && !serverGrouping) { replaceWithObservable(item.items, data, ranges, type, serverGrouping); } else { for (var idx = 0; idx < data.length; idx++) { if (data[idx] === item) { view[viewIndex] = data.at(idx); replaceInRanges(ranges, data, item, view[viewIndex]); break; } } } } } function removeModel(data, model) { var idx, length; for (idx = 0, length = data.length; idx < length; idx++) { var dataItem = data.at(idx); if (dataItem.uid == model.uid) { data.splice(idx, 1); return dataItem; } } } function wrapInEmptyGroup(groups, model) { var parent, group, idx, length; for (idx = groups.length-1, length = 0; idx >= length; idx--) { group = groups[idx]; parent = { value: model.get(group.field), field: group.field, items: parent ? [parent] : [model], hasSubgroups: !!parent, aggregates: {} }; } return parent; } function indexOfPristineModel(data, model) { if (model) { return indexOf(data, function(item) { if (item.uid) { return item.uid == model.uid; } return item[model.idField] === model.id; }); } return -1; } function indexOfModel(data, model) { if (model) { return indexOf(data, function(item) { return item.uid == model.uid; }); } return -1; } function indexOf(data, comparer) { var idx, length; for (idx = 0, length = data.length; idx < length; idx++) { if (comparer(data[idx])) { return idx; } } return -1; } function fieldNameFromModel(fields, name) { if (fields && !isEmptyObject(fields)) { var descriptor = fields[name]; var fieldName; if (isPlainObject(descriptor)) { fieldName = descriptor.from || descriptor.field || name; } else { fieldName = fields[name] || name; } if (isFunction(fieldName)) { return name; } return fieldName; } return name; } function convertFilterDescriptorsField(descriptor, model) { var idx, length, target = {}; for (var field in descriptor) { if (field !== "filters") { target[field] = descriptor[field]; } } if (descriptor.filters) { target.filters = []; for (idx = 0, length = descriptor.filters.length; idx < length; idx++) { target.filters[idx] = convertFilterDescriptorsField(descriptor.filters[idx], model); } } else { target.field = fieldNameFromModel(model.fields, target.field); } return target; } function convertDescriptorsField(descriptors, model) { var idx, length, result = [], target, descriptor; for (idx = 0, length = descriptors.length; idx < length; idx ++) { target = {}; descriptor = descriptors[idx]; for (var field in descriptor) { target[field] = descriptor[field]; } target.field = fieldNameFromModel(model.fields, target.field); if (target.aggregates && isArray(target.aggregates)) { target.aggregates = convertDescriptorsField(target.aggregates, model); } result.push(target); } return result; } var DataSource = Observable.extend({ init: function(options) { var that = this, model, data; if (options) { data = options.data; } options = that.options = extend({}, that.options, options); that._map = {}; that._prefetch = {}; that._data = []; that._pristineData = []; that._ranges = []; that._view = []; that._pristineTotal = 0; that._destroyed = []; that._pageSize = options.pageSize; that._page = options.page || (options.pageSize ? 1 : undefined); that._sort = normalizeSort(options.sort); that._filter = normalizeFilter(options.filter); that._group = normalizeGroup(options.group); that._aggregate = options.aggregate; that._total = options.total; that._shouldDetachObservableParents = true; Observable.fn.init.call(that); that.transport = Transport.create(options, data); if (isFunction(that.transport.push)) { that.transport.push({ pushCreate: proxy(that._pushCreate, that), pushUpdate: proxy(that._pushUpdate, that), pushDestroy: proxy(that._pushDestroy, that) }); } if (options.offlineStorage != null) { if (typeof options.offlineStorage == "string") { var key = options.offlineStorage; that._storage = { getItem: function() { return JSON.parse(localStorage.getItem(key)); }, setItem: function(item) { localStorage.setItem(key, stringify(item)); } }; } else { that._storage = options.offlineStorage; } } that.reader = new kendo.data.readers[options.schema.type || "json" ](options.schema); model = that.reader.model || {}; that._detachObservableParents(); that._data = that._observe(that._data); that._online = true; that.bind(["push", ERROR, CHANGE, REQUESTSTART, SYNC, REQUESTEND, PROGRESS], options); }, options: { data: null, schema: { modelBase: Model }, offlineStorage: null, serverSorting: false, serverPaging: false, serverFiltering: false, serverGrouping: false, serverAggregates: false, batch: false }, online: function(value) { if (value !== undefined) { if (this._online != value) { this._online = value; if (value) { return this.sync(); } } return $.Deferred().resolve().promise(); } else { return this._online; } }, offlineData: function(state) { if (this.options.offlineStorage == null) { return null; } if (state !== undefined) { return this._storage.setItem(state); } return this._storage.getItem() || {}; }, _isServerGrouped: function() { var group = this.group() || []; return this.options.serverGrouping && group.length; }, _pushCreate: function(result) { this._push(result, "pushCreate"); }, _pushUpdate: function(result) { this._push(result, "pushUpdate"); }, _pushDestroy: function(result) { this._push(result, "pushDestroy"); }, _push: function(result, operation) { var data = this._readData(result); if (!data) { data = result; } this[operation](data); }, _flatData: function(data, skip) { if (data) { if (this._isServerGrouped()) { return flattenGroups(data); } if (!skip) { for (var idx = 0; idx < data.length; idx++) { data.at(idx); } } } return data; }, parent: noop, get: function(id) { var idx, length, data = this._flatData(this._data); for (idx = 0, length = data.length; idx < length; idx++) { if (data[idx].id == id) { return data[idx]; } } }, getByUid: function(id) { var idx, length, data = this._flatData(this._data); if (!data) { return; } for (idx = 0, length = data.length; idx < length; idx++) { if (data[idx].uid == id) { return data[idx]; } } }, indexOf: function(model) { return indexOfModel(this._data, model); }, at: function(index) { return this._data.at(index); }, data: function(value) { var that = this; if (value !== undefined) { that._detachObservableParents(); that._data = this._observe(value); that._pristineData = value.slice(0); that._storeData(); that._ranges = []; that.trigger("reset"); that._addRange(that._data); that._total = that._data.length; that._pristineTotal = that._total; that._process(that._data); } else { if (that._data) { for (var idx = 0; idx < that._data.length; idx++) { that._data.at(idx); } } return that._data; } }, view: function(value) { if (value === undefined) { return this._view; } else { this._view = this._observeView(value); } }, _observeView: function(data) { var that = this; replaceWithObservable(data, that._data, that._ranges, that.reader.model || ObservableObject, that._isServerGrouped()); var view = new LazyObservableArray(data, that.reader.model); view.parent = function() { return that.parent(); }; return view; }, flatView: function() { var groups = this.group() || []; if (groups.length) { return flattenGroups(this._view); } else { return this._view; } }, add: function(model) { return this.insert(this._data.length, model); }, _createNewModel: function(model) { if (this.reader.model) { return new this.reader.model(model); } if (model instanceof ObservableObject) { return model; } return new ObservableObject(model); }, insert: function(index, model) { if (!model) { model = index; index = 0; } if (!(model instanceof Model)) { model = this._createNewModel(model); } if (this._isServerGrouped()) { this._data.splice(index, 0, wrapInEmptyGroup(this.group(), model)); } else { this._data.splice(index, 0, model); } return model; }, pushCreate: function(items) { if (!isArray(items)) { items = [items]; } var pushed = []; var autoSync = this.options.autoSync; this.options.autoSync = false; try { for (var idx = 0; idx < items.length; idx ++) { var item = items[idx]; var result = this.add(item); pushed.push(result); var pristine = result.toJSON(); if (this._isServerGrouped()) { pristine = wrapInEmptyGroup(this.group(), pristine); } this._pristineData.push(pristine); } } finally { this.options.autoSync = autoSync; } if (pushed.length) { this.trigger("push", { type: "create", items: pushed }); } }, pushUpdate: function(items) { if (!isArray(items)) { items = [items]; } var pushed = []; for (var idx = 0; idx < items.length; idx ++) { var item = items[idx]; var model = this._createNewModel(item); var target = this.get(model.id); if (target) { pushed.push(target); target.accept(item); target.trigger(CHANGE); this._updatePristineForModel(target, item); } else { this.pushCreate(item); } } if (pushed.length) { this.trigger("push", { type: "update", items: pushed }); } }, pushDestroy: function(items) { var pushed = this._removeItems(items); if (pushed.length) { this.trigger("push", { type: "destroy", items: pushed }); } }, _removeItems: function(items) { if (!isArray(items)) { items = [items]; } var destroyed = []; var autoSync = this.options.autoSync; this.options.autoSync = false; try { for (var idx = 0; idx < items.length; idx ++) { var item = items[idx]; var model = this._createNewModel(item); var found = false; this._eachItem(this._data, function(items){ for (var idx = 0; idx < items.length; idx++) { var item = items.at(idx); if (item.id === model.id) { destroyed.push(item); items.splice(idx, 1); found = true; break; } } }); if (found) { this._removePristineForModel(model); this._destroyed.pop(); } } } finally { this.options.autoSync = autoSync; } return destroyed; }, remove: function(model) { var result, that = this, hasGroups = that._isServerGrouped(); this._eachItem(that._data, function(items) { result = removeModel(items, model); if (result && hasGroups) { if (!result.isNew || !result.isNew()) { that._destroyed.push(result); } return true; } }); this._removeModelFromRanges(model); this._updateRangesLength(); return model; }, sync: function() { var that = this, idx, length, created = [], updated = [], destroyed = that._destroyed, data = that._flatData(that._data); var promise = $.Deferred().resolve().promise(); if (that.online()) { if (!that.reader.model) { return promise; } for (idx = 0, length = data.length; idx < length; idx++) { if (data[idx].isNew()) { created.push(data[idx]); } else if (data[idx].dirty) { updated.push(data[idx]); } } var promises = []; promises.push.apply(promises, that._send("create", created)); promises.push.apply(promises, that._send("update", updated)); promises.push.apply(promises, that._send("destroy", destroyed)); promise = $.when .apply(null, promises) .then(function() { var idx, length; for (idx = 0, length = arguments.length; idx < length; idx++){ that._accept(arguments[idx]); } that._storeData(true); that._change({ action: "sync" }); that.trigger(SYNC); }); } else { that._storeData(true); that._change({ action: "sync" }); } return promise; }, cancelChanges: function(model) { var that = this; if (model instanceof kendo.data.Model) { that._cancelModel(model); } else { that._destroyed = []; that._detachObservableParents(); that._data = that._observe(that._pristineData); if (that.options.serverPaging) { that._total = that._pristineTotal; } that._ranges = []; that._addRange(that._data); that._change(); } }, hasChanges: function() { var idx, length, data = this._data; if (this._destroyed.length) { return true; } for (idx = 0, length = data.length; idx < length; idx++) { if ((data[idx].isNew && data[idx].isNew()) || data[idx].dirty) { return true; } } return false; }, _accept: function(result) { var that = this, models = result.models, response = result.response, idx = 0, serverGroup = that._isServerGrouped(), pristine = that._pristineData, type = result.type, length; that.trigger(REQUESTEND, { response: response, type: type }); if (response && !isEmptyObject(response)) { response = that.reader.parse(response); if (that._handleCustomErrors(response)) { return; } response = that.reader.data(response); if (!isArray(response)) { response = [response]; } } else { response = $.map(models, function(model) { return model.toJSON(); } ); } if (type === "destroy") { that._destroyed = []; } for (idx = 0, length = models.length; idx < length; idx++) { if (type !== "destroy") { models[idx].accept(response[idx]); if (type === "create") { pristine.push(serverGroup ? wrapInEmptyGroup(that.group(), models[idx]) : response[idx]); } else if (type === "update") { that._updatePristineForModel(models[idx], response[idx]); } } else { that._removePristineForModel(models[idx]); } } }, _updatePristineForModel: function(model, values) { this._executeOnPristineForModel(model, function(index, items) { kendo.deepExtend(items[index], values); }); }, _executeOnPristineForModel: function(model, callback) { this._eachPristineItem( function(items) { var index = indexOfPristineModel(items, model); if (index > -1) { callback(index, items); return true; } }); }, _removePristineForModel: function(model) { this._executeOnPristineForModel(model, function(index, items) { items.splice(index, 1); }); }, _readData: function(data) { var read = !this._isServerGrouped() ? this.reader.data : this.reader.groups; return read.call(this.reader, data); }, _eachPristineItem: function(callback) { this._eachItem(this._pristineData, callback); }, _eachItem: function(data, callback) { if (data && data.length) { if (this._isServerGrouped()) { eachGroupItems(data, callback); } else { callback(data); } } }, _pristineForModel: function(model) { var pristine, idx, callback = function(items) { idx = indexOfPristineModel(items, model); if (idx > -1) { pristine = items[idx]; return true; } }; this._eachPristineItem(callback); return pristine; }, _cancelModel: function(model) { var pristine = this._pristineForModel(model); this._eachItem(this._data, function(items) { var idx = indexOfModel(items, model); if (idx >= 0) { if (pristine && (!model.isNew() || pristine.__state__)) { items[idx].accept(pristine); } else { items.splice(idx, 1); } } }); }, _promise: function(data, models, type) { var that = this; return $.Deferred(function(deferred) { that.trigger(REQUESTSTART, { type: type }); that.transport[type].call(that.transport, extend({ success: function(response) { deferred.resolve({ response: response, models: models, type: type }); }, error: function(response, status, error) { deferred.reject(response); that.error(response, status, error); } }, data)); }).promise(); }, _send: function(method, data) { var that = this, idx, length, promises = [], converted = that.reader.serialize(toJSON(data)); if (that.options.batch) { if (data.length) { promises.push(that._promise( { data: { models: converted } }, data , method)); } } else { for (idx = 0, length = data.length; idx < length; idx++) { promises.push(that._promise( { data: converted[idx] }, [ data[idx] ], method)); } } return promises; }, read: function(data) { var that = this, params = that._params(data); var deferred = $.Deferred(); that._queueRequest(params, function() { var isPrevented = that.trigger(REQUESTSTART, { type: "read" }); if (!isPrevented) { that.trigger(PROGRESS); that._ranges = []; that.trigger("reset"); if (that.online()) { that.transport.read({ data: params, success: function(data) { that.success(data); deferred.resolve(); }, error: function() { var args = slice.call(arguments); that.error.apply(that, args); deferred.reject.apply(deferred, args); } }); } else if (that.options.offlineStorage != null){ that.success(that.offlineData()); deferred.resolve(); } } else { that._dequeueRequest(); deferred.resolve(isPrevented); } }); return deferred.promise(); }, _readAggregates: function(data) { return this.reader.aggregates(data); }, success: function(data) { var that = this, options = that.options; that.trigger(REQUESTEND, { response: data, type: "read" }); if (that.online()) { data = that.reader.parse(data); if (that._handleCustomErrors(data)) { that._dequeueRequest(); return; } that._total = that.reader.total(data); if (that._aggregate && options.serverAggregates) { that._aggregateResult = that._readAggregates(data); } data = that._readData(data); } else { data = that._readData(data); var items = []; for (var idx = 0; idx < data.length; idx++) { var item = data[idx]; var state = item.__state__; if (state == "destroy") { this._destroyed.push(this._createNewModel(item)); } else { items.push(item); } } data = items; that._total = data.length; } that._pristineTotal = that._total; that._pristineData = data.slice(0); that._detachObservableParents(); that._data = that._observe(data); if (that.options.offlineStorage != null) { that._eachItem(that._data, function(items) { for (var idx = 0; idx < items.length; idx++) { var item = items.at(idx); if (item.__state__ == "update") { item.dirty = true; } } }); } that._storeData(); that._addRange(that._data); that._process(that._data); that._dequeueRequest(); }, _detachObservableParents: function() { if (this._data && this._shouldDetachObservableParents) { for (var idx = 0; idx < this._data.length; idx++) { if (this._data[idx].parent) { this._data[idx].parent = noop; } } } }, _storeData: function(updatePristine) { var serverGrouping = this._isServerGrouped(); var model = this.reader.model; function items(data) { var state = []; for (var idx = 0; idx < data.length; idx++) { var dataItem = data.at(idx); var item = dataItem.toJSON(); if (serverGrouping && dataItem.items) { item.items = items(dataItem.items); } else { item.uid = dataItem.uid; if (model) { if (dataItem.isNew()) { item.__state__ = "create"; } else if (dataItem.dirty) { item.__state__ = "update"; } } } state.push(item); } return state; } if (this.options.offlineStorage != null) { var state = items(this._data); for (var idx = 0; idx < this._destroyed.length; idx++) { var item = this._destroyed[idx].toJSON(); item.__state__ = "destroy"; state.push(item); } this.offlineData(state); if (updatePristine) { this._pristineData = state; } } }, _addRange: function(data) { var that = this, start = that._skip || 0, end = start + that._flatData(data, true).length; that._ranges.push({ start: start, end: end, data: data }); that._ranges.sort( function(x, y) { return x.start - y.start; } ); }, error: function(xhr, status, errorThrown) { this._dequeueRequest(); this.trigger(REQUESTEND, { }); this.trigger(ERROR, { xhr: xhr, status: status, errorThrown: errorThrown }); }, _params: function(data) { var that = this, options = extend({ take: that.take(), skip: that.skip(), page: that.page(), pageSize: that.pageSize(), sort: that._sort, filter: that._filter, group: that._group, aggregate: that._aggregate }, data); if (!that.options.serverPaging) { delete options.take; delete options.skip; delete options.page; delete options.pageSize; } if (!that.options.serverGrouping) { delete options.group; } else if (that.reader.model && options.group) { options.group = convertDescriptorsField(options.group, that.reader.model); } if (!that.options.serverFiltering) { delete options.filter; } else if (that.reader.model && options.filter) { options.filter = convertFilterDescriptorsField(options.filter, that.reader.model); } if (!that.options.serverSorting) { delete options.sort; } else if (that.reader.model && options.sort) { options.sort = convertDescriptorsField(options.sort, that.reader.model); } if (!that.options.serverAggregates) { delete options.aggregate; } else if (that.reader.model && options.aggregate) { options.aggregate = convertDescriptorsField(options.aggregate, that.reader.model); } return options; }, _queueRequest: function(options, callback) { var that = this; if (!that._requestInProgress) { that._requestInProgress = true; that._pending = undefined; callback(); } else { that._pending = { callback: proxy(callback, that), options: options }; } }, _dequeueRequest: function() { var that = this; that._requestInProgress = false; if (that._pending) { that._queueRequest(that._pending.options, that._pending.callback); } }, _handleCustomErrors: function(response) { if (this.reader.errors) { var errors = this.reader.errors(response); if (errors) { this.trigger(ERROR, { xhr: null, status: "customerror", errorThrown: "custom error", errors: errors }); return true; } } return false; }, _observe: function(data) { var that = this, model = that.reader.model, wrap = false; that._shouldDetachObservableParents = true; if (model && data.length) { wrap = !(data[0] instanceof model); } if (data instanceof ObservableArray) { that._shouldDetachObservableParents = false; if (wrap) { data.type = that.reader.model; data.wrapAll(data, data); } } else { var arrayType = that.pageSize() && !that.options.serverPaging ? LazyObservableArray : ObservableArray; data = new arrayType(data, that.reader.model); data.parent = function() { return that.parent(); }; } if (that._isServerGrouped()) { wrapGroupItems(data, model); } if (that._changeHandler && that._data && that._data instanceof ObservableArray) { that._data.unbind(CHANGE, that._changeHandler); } else { that._changeHandler = proxy(that._change, that); } return data.bind(CHANGE, that._changeHandler); }, _change: function(e) { var that = this, idx, length, action = e ? e.action : ""; if (action === "remove") { for (idx = 0, length = e.items.length; idx < length; idx++) { if (!e.items[idx].isNew || !e.items[idx].isNew()) { that._destroyed.push(e.items[idx]); } } } if (that.options.autoSync && (action === "add" || action === "remove" || action === "itemchange")) { that.sync(); } else { var total = parseInt(that._total, 10); if (!isNumber(that._total)) { total = parseInt(that._pristineTotal, 10); } if (action === "add") { total += e.items.length; } else if (action === "remove") { total -= e.items.length; } else if (action !== "itemchange" && action !== "sync" && !that.options.serverPaging) { total = that._pristineTotal; } else if (action === "sync") { total = that._pristineTotal = parseInt(that._total, 10); } that._total = total; that._process(that._data, e); } }, _calculateAggregates: function (data, options) { options = options || {}; var query = new Query(data), aggregates = options.aggregate, filter = options.filter; if (filter) { query = query.filter(filter); } return query.aggregate(aggregates); }, _process: function (data, e) { var that = this, options = {}, result; if (that.options.serverPaging !== true) { options.skip = that._skip; options.take = that._take || that._pageSize; if(options.skip === undefined && that._page !== undefined && that._pageSize !== undefined) { options.skip = (that._page - 1) * that._pageSize; } } if (that.options.serverSorting !== true) { options.sort = that._sort; } if (that.options.serverFiltering !== true) { options.filter = that._filter; } if (that.options.serverGrouping !== true) { options.group = that._group; } if (that.options.serverAggregates !== true) { options.aggregate = that._aggregate; that._aggregateResult = that._calculateAggregates(data, options); } result = that._queryProcess(data, options); that.view(result.data); if (result.total !== undefined && !that.options.serverFiltering) { that._total = result.total; } e = e || {}; e.items = e.items || that._view; that.trigger(CHANGE, e); }, _queryProcess: function(data, options) { return Query.process(data, options); }, _mergeState: function(options) { var that = this; if (options !== undefined) { that._pageSize = options.pageSize; that._page = options.page; that._sort = options.sort; that._filter = options.filter; that._group = options.group; that._aggregate = options.aggregate; that._skip = options.skip; that._take = options.take; if(that._skip === undefined) { that._skip = that.skip(); options.skip = that.skip(); } if(that._take === undefined && that._pageSize !== undefined) { that._take = that._pageSize; options.take = that._take; } if (options.sort) { that._sort = options.sort = normalizeSort(options.sort); } if (options.filter) { that._filter = options.filter = normalizeFilter(options.filter); } if (options.group) { that._group = options.group = normalizeGroup(options.group); } if (options.aggregate) { that._aggregate = options.aggregate = normalizeAggregate(options.aggregate); } } return options; }, query: function(options) { var result; var remote = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates; if (remote || ((this._data === undefined || this._data.length === 0) && !this._destroyed.length)) { return this.read(this._mergeState(options)); } var isPrevented = this.trigger(REQUESTSTART, { type: "read" }); if (!isPrevented) { this.trigger(PROGRESS); result = this._queryProcess(this._data, this._mergeState(options)); if (!this.options.serverFiltering) { if (result.total !== undefined) { this._total = result.total; } else { this._total = this._data.length; } } this._aggregateResult = this._calculateAggregates(this._data, options); this.view(result.data); this.trigger(REQUESTEND, { }); this.trigger(CHANGE, { items: result.data }); } return $.Deferred().resolve(isPrevented).promise(); }, fetch: function(callback) { var that = this; var fn = function(isPrevented) { if (isPrevented !== true && isFunction(callback)) { callback.call(that); } }; return this._query().then(fn); }, _query: function(options) { var that = this; return that.query(extend({}, { page: that.page(), pageSize: that.pageSize(), sort: that.sort(), filter: that.filter(), group: that.group(), aggregate: that.aggregate() }, options)); }, next: function(options) { var that = this, page = that.page(), total = that.total(); options = options || {}; if (!page || (total && page + 1 > that.totalPages())) { return; } that._skip = page * that.take(); page += 1; options.page = page; that._query(options); return page; }, prev: function(options) { var that = this, page = that.page(); options = options || {}; if (!page || page === 1) { return; } that._skip = that._skip - that.take(); page -= 1; options.page = page; that._query(options); return page; }, page: function(val) { var that = this, skip; if(val !== undefined) { val = math.max(math.min(math.max(val, 1), that.totalPages()), 1); that._query({ page: val }); return; } skip = that.skip(); return skip !== undefined ? math.round((skip || 0) / (that.take() || 1)) + 1 : undefined; }, pageSize: function(val) { var that = this; if(val !== undefined) { that._query({ pageSize: val, page: 1 }); return; } return that.take(); }, sort: function(val) { var that = this; if(val !== undefined) { that._query({ sort: val }); return; } return that._sort; }, filter: function(val) { var that = this; if (val === undefined) { return that._filter; } that._query({ filter: val, page: 1 }); }, group: function(val) { var that = this; if(val !== undefined) { that._query({ group: val }); return; } return that._group; }, total: function() { return parseInt(this._total || 0, 10); }, aggregate: function(val) { var that = this; if(val !== undefined) { that._query({ aggregate: val }); return; } return that._aggregate; }, aggregates: function() { return this._aggregateResult; }, totalPages: function() { var that = this, pageSize = that.pageSize() || that.total(); return math.ceil((that.total() || 0) / pageSize); }, inRange: function(skip, take) { var that = this, end = math.min(skip + take, that.total()); if (!that.options.serverPaging && that._data.length > 0) { return true; } return that._findRange(skip, end).length > 0; }, lastRange: function() { var ranges = this._ranges; return ranges[ranges.length - 1] || { start: 0, end: 0, data: [] }; }, firstItemUid: function() { var ranges = this._ranges; return ranges.length && ranges[0].data.length && ranges[0].data[0].uid; }, enableRequestsInProgress: function() { this._skipRequestsInProgress = false; }, range: function(skip, take) { skip = math.min(skip || 0, this.total()); var that = this, pageSkip = math.max(math.floor(skip / take), 0) * take, size = math.min(pageSkip + take, that.total()), data; that._skipRequestsInProgress = false; data = that._findRange(skip, math.min(skip + take, that.total())); if (data.length) { that._skipRequestsInProgress = true; that._pending = undefined; that._skip = skip > that.skip() ? math.min(size, (that.totalPages() - 1) * that.take()) : pageSkip; that._take = take; var paging = that.options.serverPaging; var sorting = that.options.serverSorting; var filtering = that.options.serverFiltering; var aggregates = that.options.serverAggregates; try { that.options.serverPaging = true; if (!that._isServerGrouped() && !(that.group() && that.group().length)) { that.options.serverSorting = true; } that.options.serverFiltering = true; that.options.serverPaging = true; that.options.serverAggregates = true; if (paging) { that._detachObservableParents(); that._data = data = that._observe(data); } that._process(data); } finally { that.options.serverPaging = paging; that.options.serverSorting = sorting; that.options.serverFiltering = filtering; that.options.serverAggregates = aggregates; } return; } if (take !== undefined) { if (!that._rangeExists(pageSkip, size)) { that.prefetch(pageSkip, take, function() { if (skip > pageSkip && size < that.total() && !that._rangeExists(size, math.min(size + take, that.total()))) { that.prefetch(size, take, function() { that.range(skip, take); }); } else { that.range(skip, take); } }); } else if (pageSkip < skip) { that.prefetch(size, take, function() { that.range(skip, take); }); } } }, _findRange: function(start, end) { var that = this, ranges = that._ranges, range, data = [], skipIdx, takeIdx, startIndex, endIndex, rangeData, rangeEnd, processed, options = that.options, remote = options.serverSorting || options.serverPaging || options.serverFiltering || options.serverGrouping || options.serverAggregates, flatData, count, length; for (skipIdx = 0, length = ranges.length; skipIdx < length; skipIdx++) { range = ranges[skipIdx]; if (start >= range.start && start <= range.end) { count = 0; for (takeIdx = skipIdx; takeIdx < length; takeIdx++) { range = ranges[takeIdx]; flatData = that._flatData(range.data, true); if (flatData.length && start + count >= range.start) { rangeData = range.data; rangeEnd = range.end; if (!remote) { var sort = normalizeGroup(that.group() || []).concat(normalizeSort(that.sort() || [])); processed = that._queryProcess(range.data, { sort: sort, filter: that.filter() }); flatData = rangeData = processed.data; if (processed.total !== undefined) { rangeEnd = processed.total; } } startIndex = 0; if (start + count > range.start) { startIndex = (start + count) - range.start; } endIndex = flatData.length; if (rangeEnd > end) { endIndex = endIndex - (rangeEnd - end); } count += endIndex - startIndex; data = that._mergeGroups(data, rangeData, startIndex, endIndex); if (end <= range.end && count == end - start) { return data; } } } break; } } return []; }, _mergeGroups: function(data, range, skip, take) { if (this._isServerGrouped()) { var temp = range.toJSON(), prevGroup; if (data.length) { prevGroup = data[data.length - 1]; } mergeGroups(prevGroup, temp, skip, take); return data.concat(temp); } return data.concat(range.slice(skip, take)); }, skip: function() { var that = this; if (that._skip === undefined) { return (that._page !== undefined ? (that._page - 1) * (that.take() || 1) : undefined); } return that._skip; }, take: function() { return this._take || this._pageSize; }, _prefetchSuccessHandler: function (skip, size, callback) { var that = this; return function(data) { var found = false, range = { start: skip, end: size, data: [] }, idx, length, temp; that._dequeueRequest(); that.trigger(REQUESTEND, { response: data, type: "read" }); data = that.reader.parse(data); temp = that._readData(data); if (temp.length) { for (idx = 0, length = that._ranges.length; idx < length; idx++) { if (that._ranges[idx].start === skip) { found = true; range = that._ranges[idx]; break; } } if (!found) { that._ranges.push(range); } } range.data = that._observe(temp); range.end = range.start + that._flatData(range.data, true).length; that._ranges.sort( function(x, y) { return x.start - y.start; } ); that._total = that.reader.total(data); if (!that._skipRequestsInProgress) { if (callback && temp.length) { callback(); } else { that.trigger(CHANGE, {}); } } }; }, prefetch: function(skip, take, callback) { var that = this, size = math.min(skip + take, that.total()), options = { take: take, skip: skip, page: skip / take + 1, pageSize: take, sort: that._sort, filter: that._filter, group: that._group, aggregate: that._aggregate }; if (!that._rangeExists(skip, size)) { clearTimeout(that._timeout); that._timeout = setTimeout(function() { that._queueRequest(options, function() { if (!that.trigger(REQUESTSTART, { type: "read" })) { that.transport.read({ data: that._params(options), success: that._prefetchSuccessHandler(skip, size, callback) }); } else { that._dequeueRequest(); } }); }, 100); } else if (callback) { callback(); } }, _rangeExists: function(start, end) { var that = this, ranges = that._ranges, idx, length; for (idx = 0, length = ranges.length; idx < length; idx++) { if (ranges[idx].start <= start && ranges[idx].end >= end) { return true; } } return false; }, _removeModelFromRanges: function(model) { var result, found, range; for (var idx = 0, length = this._ranges.length; idx < length; idx++) { range = this._ranges[idx]; this._eachItem(range.data, function(items) { result = removeModel(items, model); if (result) { found = true; } }); if (found) { break; } } }, _updateRangesLength: function() { var startOffset = 0, range, rangeLength; for (var idx = 0, length = this._ranges.length; idx < length; idx++) { range = this._ranges[idx]; range.start = range.start - startOffset; rangeLength = this._flatData(range.data, true).length; startOffset = range.end - rangeLength; range.end = range.start + rangeLength; } } }); var Transport = {}; Transport.create = function(options, data) { var transport, transportOptions = options.transport; if (transportOptions) { transportOptions.read = typeof transportOptions.read === STRING ? { url: transportOptions.read } : transportOptions.read; if (options.type) { kendo.data.transports = kendo.data.transports || {}; kendo.data.schemas = kendo.data.schemas || {}; if (kendo.data.transports[options.type] && !isPlainObject(kendo.data.transports[options.type])) { transport = new kendo.data.transports[options.type](extend(transportOptions, { data: data })); } else { transportOptions = extend(true, {}, kendo.data.transports[options.type], transportOptions); } options.schema = extend(true, {}, kendo.data.schemas[options.type], options.schema); } if (!transport) { transport = isFunction(transportOptions.read) ? transportOptions : new RemoteTransport(transportOptions); } } else { transport = new LocalTransport({ data: options.data || [] }); } return transport; }; DataSource.create = function(options) { if (isArray(options) || options instanceof ObservableArray) { options = { data: options }; } var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, table = dataSource.table, select = dataSource.select, idx, length, model = {}, field; if (!data && fields && !dataSource.transport) { if (table) { data = inferTable(table, fields); } else if (select) { data = inferSelect(select, fields); } } if (kendo.data.Model && fields && (!dataSource.schema || !dataSource.schema.model)) { for (idx = 0, length = fields.length; idx < length; idx++) { field = fields[idx]; if (field.type) { model[field.field] = field; } } if (!isEmptyObject(model)) { dataSource.schema = extend(true, dataSource.schema, { model: { fields: model } }); } } dataSource.data = data; table = null; dataSource.table = null; return dataSource instanceof DataSource ? dataSource : new DataSource(dataSource); }; function inferSelect(select, fields) { var options = $(select)[0].children, idx, length, data = [], record, firstField = fields[0], secondField = fields[1], value, option; for (idx = 0, length = options.length; idx < length; idx++) { record = {}; option = options[idx]; if (option.disabled) { continue; } record[firstField.field] = option.text; value = option.attributes.value; if (value && value.specified) { value = option.value; } else { value = option.text; } record[secondField.field] = value; data.push(record); } return data; } function inferTable(table, fields) { var tbody = $(table)[0].tBodies[0], rows = tbody ? tbody.rows : [], idx, length, fieldIndex, fieldCount = fields.length, data = [], cells, record, cell, empty; for (idx = 0, length = rows.length; idx < length; idx++) { record = {}; empty = true; cells = rows[idx].cells; for (fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) { cell = cells[fieldIndex]; if(cell.nodeName.toLowerCase() !== "th") { empty = false; record[fields[fieldIndex].field] = cell.innerHTML; } } if(!empty) { data.push(record); } } return data; } var Node = Model.define({ idField: "id", init: function(value) { var that = this, hasChildren = that.hasChildren || value && value.hasChildren, childrenField = "items", childrenOptions = {}; kendo.data.Model.fn.init.call(that, value); if (typeof that.children === STRING) { childrenField = that.children; } childrenOptions = { schema: { data: childrenField, model: { hasChildren: hasChildren, id: that.idField, fields: that.fields } } }; if (typeof that.children !== STRING) { extend(childrenOptions, that.children); } childrenOptions.data = value; if (!hasChildren) { hasChildren = childrenOptions.schema.data; } if (typeof hasChildren === STRING) { hasChildren = kendo.getter(hasChildren); } if (isFunction(hasChildren)) { that.hasChildren = !!hasChildren.call(that, that); } that._childrenOptions = childrenOptions; if (that.hasChildren) { that._initChildren(); } that._loaded = !!(value && (value[childrenField] || value._loaded)); }, _initChildren: function() { var that = this; var children, transport, parameterMap; if (!(that.children instanceof HierarchicalDataSource)) { children = that.children = new HierarchicalDataSource(that._childrenOptions); transport = children.transport; parameterMap = transport.parameterMap; transport.parameterMap = function(data, type) { data[that.idField || "id"] = that.id; if (parameterMap) { data = parameterMap(data, type); } return data; }; children.parent = function(){ return that; }; children.bind(CHANGE, function(e){ e.node = e.node || that; that.trigger(CHANGE, e); }); children.bind(ERROR, function(e){ var collection = that.parent(); if (collection) { e.node = e.node || that; collection.trigger(ERROR, e); } }); that._updateChildrenField(); } }, append: function(model) { this._initChildren(); this.loaded(true); this.children.add(model); }, hasChildren: false, level: function() { var parentNode = this.parentNode(), level = 0; while (parentNode && parentNode.parentNode) { level++; parentNode = parentNode.parentNode ? parentNode.parentNode() : null; } return level; }, _updateChildrenField: function() { var fieldName = this._childrenOptions.schema.data; this[fieldName || "items"] = this.children.data(); }, _childrenLoaded: function() { this._loaded = true; this._updateChildrenField(); }, load: function() { var options = {}; var method = "_query"; var children, promise; if (this.hasChildren) { this._initChildren(); children = this.children; options[this.idField || "id"] = this.id; if (!this._loaded) { children._data = undefined; method = "read"; } children.one(CHANGE, proxy(this._childrenLoaded, this)); promise = children[method](options); } else { this.loaded(true); } return promise || $.Deferred().resolve().promise(); }, parentNode: function() { var array = this.parent(); return array.parent(); }, loaded: function(value) { if (value !== undefined) { this._loaded = value; } else { return this._loaded; } }, shouldSerialize: function(field) { return Model.fn.shouldSerialize.call(this, field) && field !== "children" && field !== "_loaded" && field !== "hasChildren" && field !== "_childrenOptions"; } }); function dataMethod(name) { return function() { var data = this._data, result = DataSource.fn[name].apply(this, slice.call(arguments)); if (this._data != data) { this._attachBubbleHandlers(); } return result; }; } var HierarchicalDataSource = DataSource.extend({ init: function(options) { var node = Node.define({ children: options }); DataSource.fn.init.call(this, extend(true, {}, { schema: { modelBase: node, model: node } }, options)); this._attachBubbleHandlers(); }, _attachBubbleHandlers: function() { var that = this; that._data.bind(ERROR, function(e) { that.trigger(ERROR, e); }); }, remove: function(node){ var parentNode = node.parentNode(), dataSource = this, result; if (parentNode && parentNode._initChildren) { dataSource = parentNode.children; } result = DataSource.fn.remove.call(dataSource, node); if (parentNode && !dataSource.data().length) { parentNode.hasChildren = false; } return result; }, success: dataMethod("success"), data: dataMethod("data"), insert: function(index, model) { var parentNode = this.parent(); if (parentNode && parentNode._initChildren) { parentNode.hasChildren = true; parentNode._initChildren(); } return DataSource.fn.insert.call(this, index, model); }, _find: function(method, value) { var idx, length, node, data, children; node = DataSource.fn[method].call(this, value); if (node) { return node; } data = this._flatData(this._data); if (!data) { return; } for (idx = 0, length = data.length; idx < length; idx++) { children = data[idx].children; if (!(children instanceof HierarchicalDataSource)) { continue; } node = children[method](value); if (node) { return node; } } }, get: function(id) { return this._find("get", id); }, getByUid: function(uid) { return this._find("getByUid", uid); } }); function inferList(list, fields) { var items = $(list).children(), idx, length, data = [], record, textField = fields[0].field, urlField = fields[1] && fields[1].field, spriteCssClassField = fields[2] && fields[2].field, imageUrlField = fields[3] && fields[3].field, item, id, textChild, className, children; function elements(collection, tagName) { return collection.filter(tagName).add(collection.find(tagName)); } for (idx = 0, length = items.length; idx < length; idx++) { record = { _loaded: true }; item = items.eq(idx); textChild = item[0].firstChild; children = item.children(); list = children.filter("ul"); children = children.filter(":not(ul)"); id = item.attr("data-id"); if (id) { record.id = id; } if (textChild) { record[textField] = textChild.nodeType == 3 ? textChild.nodeValue : children.text(); } if (urlField) { record[urlField] = elements(children, "a").attr("href"); } if (imageUrlField) { record[imageUrlField] = elements(children, "img").attr("src"); } if (spriteCssClassField) { className = elements(children, ".k-sprite").prop("className"); record[spriteCssClassField] = className && $.trim(className.replace("k-sprite", "")); } if (list.length) { record.items = inferList(list.eq(0), fields); } if (item.attr("data-hasChildren") == "true") { record.hasChildren = true; } data.push(record); } return data; } HierarchicalDataSource.create = function(options) { options = options && options.push ? { data: options } : options; var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, list = dataSource.list; if (data && data._dataSource) { return data._dataSource; } if (!data && fields && !dataSource.transport) { if (list) { data = inferList(list, fields); } } dataSource.data = data; return dataSource instanceof HierarchicalDataSource ? dataSource : new HierarchicalDataSource(dataSource); }; var Buffer = kendo.Observable.extend({ init: function(dataSource, viewSize, disablePrefetch) { kendo.Observable.fn.init.call(this); this._prefetching = false; this.dataSource = dataSource; this.prefetch = !disablePrefetch; var buffer = this; dataSource.bind("change", function() { buffer._change(); }); dataSource.bind("reset", function() { buffer._reset(); }); this._syncWithDataSource(); this.setViewSize(viewSize); }, setViewSize: function(viewSize) { this.viewSize = viewSize; this._recalculate(); }, at: function(index) { var pageSize = this.pageSize, item, itemPresent = true, changeTo; if (index >= this.total()) { this.trigger("endreached", {index: index }); return null; } if (!this.useRanges) { return this.dataSource.view()[index]; } if (this.useRanges) { // out of range request if (index < this.dataOffset || index >= this.skip + pageSize) { itemPresent = this.range(Math.floor(index / pageSize) * pageSize); } // prefetch if (index === this.prefetchThreshold) { this._prefetch(); } // mid-range jump - prefetchThreshold and nextPageThreshold may be equal, do not change to else if if (index === this.midPageThreshold) { this.range(this.nextMidRange, true); } // next range jump else if (index === this.nextPageThreshold) { this.range(this.nextFullRange); } // pull-back else if (index === this.pullBackThreshold) { if (this.offset === this.skip) { // from full range to mid range this.range(this.previousMidRange); } else { // from mid range to full range this.range(this.previousFullRange); } } if (itemPresent) { return this.dataSource.at(index - this.dataOffset); } else { this.trigger("endreached", { index: index }); return null; } } }, indexOf: function(item) { return this.dataSource.data().indexOf(item) + this.dataOffset; }, total: function() { return parseInt(this.dataSource.total(), 10); }, next: function() { var buffer = this, pageSize = buffer.pageSize, offset = buffer.skip - buffer.viewSize + pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize; this.offset = offset; this.dataSource.prefetch(pageSkip, pageSize, function() { buffer._goToRange(offset, true); }); }, range: function(offset, nextRange) { if (this.offset === offset) { return true; } var buffer = this, pageSize = this.pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize, dataSource = this.dataSource; if (nextRange) { pageSkip += pageSize; } if (dataSource.inRange(offset, pageSize)) { this.offset = offset; this._recalculate(); this._goToRange(offset); return true; } else if (this.prefetch) { dataSource.prefetch(pageSkip, pageSize, function() { buffer.offset = offset; buffer._recalculate(); buffer._goToRange(offset, true); }); return false; } return true; }, syncDataSource: function() { var offset = this.offset; this.offset = null; this.range(offset); }, destroy: function() { this.unbind(); }, _prefetch: function() { var buffer = this, pageSize = this.pageSize, prefetchOffset = this.skip + pageSize, dataSource = this.dataSource; if (!dataSource.inRange(prefetchOffset, pageSize) && !this._prefetching && this.prefetch) { this._prefetching = true; this.trigger("prefetching", { skip: prefetchOffset, take: pageSize }); dataSource.prefetch(prefetchOffset, pageSize, function() { buffer._prefetching = false; buffer.trigger("prefetched", { skip: prefetchOffset, take: pageSize }); }); } }, _goToRange: function(offset, expanding) { if (this.offset !== offset) { return; } this.dataOffset = offset; this._expanding = expanding; this.dataSource.range(offset, this.pageSize); this.dataSource.enableRequestsInProgress(); }, _reset: function() { this._syncPending = true; }, _change: function() { var dataSource = this.dataSource; this.length = this.useRanges ? dataSource.lastRange().end : dataSource.view().length; if (this._syncPending) { this._syncWithDataSource(); this._recalculate(); this._syncPending = false; this.trigger("reset", { offset: this.offset }); } this.trigger("resize"); if (this._expanding) { this.trigger("expand"); } delete this._expanding; }, _syncWithDataSource: function() { var dataSource = this.dataSource; this._firstItemUid = dataSource.firstItemUid(); this.dataOffset = this.offset = dataSource.skip() || 0; this.pageSize = dataSource.pageSize(); this.useRanges = dataSource.options.serverPaging; }, _recalculate: function() { var pageSize = this.pageSize, offset = this.offset, viewSize = this.viewSize, skip = Math.ceil(offset / pageSize) * pageSize; this.skip = skip; this.midPageThreshold = skip + pageSize - 1; this.nextPageThreshold = skip + viewSize - 1; this.prefetchThreshold = skip + Math.floor(pageSize / 3 * 2); this.pullBackThreshold = this.offset - 1; this.nextMidRange = skip + pageSize - viewSize; this.nextFullRange = skip; this.previousMidRange = offset - viewSize; this.previousFullRange = skip - pageSize; } }); var BatchBuffer = kendo.Observable.extend({ init: function(dataSource, batchSize) { var batchBuffer = this; kendo.Observable.fn.init.call(batchBuffer); this.dataSource = dataSource; this.batchSize = batchSize; this._total = 0; this.buffer = new Buffer(dataSource, batchSize * 3); this.buffer.bind({ "endreached": function (e) { batchBuffer.trigger("endreached", { index: e.index }); }, "prefetching": function (e) { batchBuffer.trigger("prefetching", { skip: e.skip, take: e.take }); }, "prefetched": function (e) { batchBuffer.trigger("prefetched", { skip: e.skip, take: e.take }); }, "reset": function () { batchBuffer._total = 0; batchBuffer.trigger("reset"); }, "resize": function () { batchBuffer._total = Math.ceil(this.length / batchBuffer.batchSize); batchBuffer.trigger("resize", { total: batchBuffer.total(), offset: this.offset }); } }); }, syncDataSource: function() { this.buffer.syncDataSource(); }, at: function(index) { var buffer = this.buffer, skip = index * this.batchSize, take = this.batchSize, view = [], item; if (buffer.offset > skip) { buffer.at(buffer.offset - 1); } for (var i = 0; i < take; i++) { item = buffer.at(skip + i); if (item === undefined) { break; } view.push(item); } return view; }, total: function() { return this._total; }, destroy: function() { this.buffer.destroy(); this.unbind(); } }); extend(true, kendo.data, { readers: { json: DataReader }, Query: Query, DataSource: DataSource, HierarchicalDataSource: HierarchicalDataSource, Node: Node, ObservableObject: ObservableObject, ObservableArray: ObservableArray, LazyObservableArray: LazyObservableArray, LocalTransport: LocalTransport, RemoteTransport: RemoteTransport, Cache: Cache, DataReader: DataReader, Model: Model, Buffer: Buffer, BatchBuffer: BatchBuffer }); })(window.kendo.jQuery); /*jshint eqnull: true */ (function ($, undefined) { var kendo = window.kendo, browser = kendo.support.browser, Observable = kendo.Observable, ObservableObject = kendo.data.ObservableObject, ObservableArray = kendo.data.ObservableArray, toString = {}.toString, binders = {}, slice = Array.prototype.slice, Class = kendo.Class, innerText, proxy = $.proxy, VALUE = "value", SOURCE = "source", EVENTS = "events", CHECKED = "checked", deleteExpando = true, CHANGE = "change"; (function() { var a = document.createElement("a"); if (a.innerText !== undefined) { innerText = "innerText"; } else if (a.textContent !== undefined) { innerText = "textContent"; } try { delete a.test; } catch(e) { deleteExpando = false; } })(); var Binding = Observable.extend( { init: function(parents, path) { var that = this; Observable.fn.init.call(that); that.source = parents[0]; that.parents = parents; that.path = path; that.dependencies = {}; that.dependencies[path] = true; that.observable = that.source instanceof Observable; that._access = function(e) { that.dependencies[e.field] = true; }; if (that.observable) { that._change = function(e) { that.change(e); }; that.source.bind(CHANGE, that._change); } }, _parents: function() { var parents = this.parents; var value = this.get(); if (value && typeof value.parent == "function") { var parent = value.parent(); if ($.inArray(parent, parents) < 0) { parents = [parent].concat(parents); } } return parents; }, change: function(e) { var dependency, ch, field = e.field, that = this; if (that.path === "this") { that.trigger(CHANGE, e); } else { for (dependency in that.dependencies) { if (dependency.indexOf(field) === 0) { ch = dependency.charAt(field.length); if (!ch || ch === "." || ch === "[") { that.trigger(CHANGE, e); break; } } } } }, start: function(source) { source.bind("get", this._access); }, stop: function(source) { source.unbind("get", this._access); }, get: function() { var that = this, source = that.source, index = 0, path = that.path, result = source; if (!that.observable) { return result; } that.start(that.source); result = source.get(path); // Traverse the observable hierarchy if the binding is not resolved at the current level. while (result === undefined && source) { source = that.parents[++index]; if (source instanceof ObservableObject) { result = source.get(path); } } // second pass try to get the parent from the object hierarchy if (result === undefined) { source = that.source; //get the initial source while (result === undefined && source) { source = source.parent(); if (source instanceof ObservableObject) { result = source.get(path); } } } // If the result is a function - invoke it if (typeof result === "function") { index = path.lastIndexOf("."); // If the function is a member of a nested observable object make that nested observable the context (this) of the function if (index > 0) { source = source.get(path.substring(0, index)); } // Invoke the function that.start(source); if (source !== that.source) { result = result.call(source, that.source); } else { result = result.call(source); } that.stop(source); } // If the binding is resolved by a parent object if (source && source !== that.source) { that.currentSource = source; // save parent object // Listen for changes in the parent object source.unbind(CHANGE, that._change) .bind(CHANGE, that._change); } that.stop(that.source); return result; }, set: function(value) { var source = this.currentSource || this.source; var field = kendo.getter(this.path)(source); if (typeof field === "function") { if (source !== this.source) { field.call(source, this.source, value); } else { field.call(source, value); } } else { source.set(this.path, value); } }, destroy: function() { if (this.observable) { this.source.unbind(CHANGE, this._change); if(this.currentSource) { this.currentSource.unbind(CHANGE, this._change); } } this.unbind(); } }); var EventBinding = Binding.extend( { get: function() { var source = this.source, path = this.path, index = 0, handler; handler = source.get(path); while (!handler && source) { source = this.parents[++index]; if (source instanceof ObservableObject) { handler = source.get(path); } } return proxy(handler, source); } }); var TemplateBinding = Binding.extend( { init: function(source, path, template) { var that = this; Binding.fn.init.call(that, source, path); that.template = template; }, render: function(value) { var html; this.start(this.source); html = kendo.render(this.template, value); this.stop(this.source); return html; } }); var Binder = Class.extend({ init: function(element, bindings, options) { this.element = element; this.bindings = bindings; this.options = options; }, bind: function(binding, attribute) { var that = this; binding = attribute ? binding[attribute] : binding; binding.bind(CHANGE, function(e) { that.refresh(attribute || e); }); that.refresh(attribute); }, destroy: function() { } }); binders.attr = Binder.extend({ refresh: function(key) { this.element.setAttribute(key, this.bindings.attr[key].get()); } }); binders.style = Binder.extend({ refresh: function(key) { this.element.style[key] = this.bindings.style[key].get() || ""; } }); binders.enabled = Binder.extend({ refresh: function() { if (this.bindings.enabled.get()) { this.element.removeAttribute("disabled"); } else { this.element.setAttribute("disabled", "disabled"); } } }); binders.readonly = Binder.extend({ refresh: function() { if (this.bindings.readonly.get()) { this.element.setAttribute("readonly", "readonly"); } else { this.element.removeAttribute("readonly"); } } }); binders.disabled = Binder.extend({ refresh: function() { if (this.bindings.disabled.get()) { this.element.setAttribute("disabled", "disabled"); } else { this.element.removeAttribute("disabled"); } } }); binders.events = Binder.extend({ init: function(element, bindings, options) { Binder.fn.init.call(this, element, bindings, options); this.handlers = {}; }, refresh: function(key) { var element = $(this.element), binding = this.bindings.events[key], handler = this.handlers[key]; if (handler) { element.off(key, handler); } handler = this.handlers[key] = binding.get(); element.on(key, binding.source, handler); }, destroy: function() { var element = $(this.element), handler; for (handler in this.handlers) { element.off(handler, this.handlers[handler]); } } }); binders.text = Binder.extend({ refresh: function() { var text = this.bindings.text.get(); if (text == null) { text = ""; } this.element[innerText] = text; } }); binders.visible = Binder.extend({ refresh: function() { if (this.bindings.visible.get()) { this.element.style.display = ""; } else { this.element.style.display = "none"; } } }); binders.invisible = Binder.extend({ refresh: function() { if (!this.bindings.invisible.get()) { this.element.style.display = ""; } else { this.element.style.display = "none"; } } }); binders.html = Binder.extend({ refresh: function() { this.element.innerHTML = this.bindings.html.get(); } }); binders.value = Binder.extend({ init: function(element, bindings, options) { Binder.fn.init.call(this, element, bindings, options); this._change = proxy(this.change, this); this.eventName = options.valueUpdate || CHANGE; $(this.element).on(this.eventName, this._change); this._initChange = false; }, change: function() { this._initChange = this.eventName != CHANGE; var value = this.element.value; var type = this.element.type; if (type == "date") { value = kendo.parseDate(value, "yyyy-MM-dd"); } else if (type == "datetime-local") { value = kendo.parseDate(value, ["yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mm"] ); } else if (type == "number") { value = kendo.parseFloat(value); } this.bindings[VALUE].set(value); this._initChange = false; }, refresh: function() { if (!this._initChange) { var value = this.bindings[VALUE].get(); if (value == null) { value = ""; } var type = this.element.type; if (type == "date") { value = kendo.toString(value, "yyyy-MM-dd"); } else if (type == "datetime-local") { value = kendo.toString(value, "yyyy-MM-ddTHH:mm:ss"); } this.element.value = value; } this._initChange = false; }, destroy: function() { $(this.element).off(this.eventName, this._change); } }); binders.source = Binder.extend({ init: function(element, bindings, options) { Binder.fn.init.call(this, element, bindings, options); var source = this.bindings.source.get(); if (source instanceof kendo.data.DataSource && options.autoBind !== false) { source.fetch(); } }, refresh: function(e) { var that = this, source = that.bindings.source.get(); if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) { e = e || {}; if (e.action == "add") { that.add(e.index, e.items); } else if (e.action == "remove") { that.remove(e.index, e.items); } else if (e.action != "itemchange") { that.render(); } } else { that.render(); } }, container: function() { var element = this.element; if (element.nodeName.toLowerCase() == "table") { if (!element.tBodies[0]) { element.appendChild(document.createElement("tbody")); } element = element.tBodies[0]; } return element; }, template: function() { var options = this.options, template = options.template, nodeName = this.container().nodeName.toLowerCase(); if (!template) { if (nodeName == "select") { if (options.valueField || options.textField) { template = kendo.format('', options.valueField || options.textField, options.textField || options.valueField); } else { template = ""; } } else if (nodeName == "tbody") { template = "#:data#"; } else if (nodeName == "ul" || nodeName == "ol") { template = "
  • #:data#
  • "; } else { template = "#:data#"; } template = kendo.template(template); } return template; }, add: function(index, items) { var element = this.container(), parents, idx, length, child, clone = element.cloneNode(false), reference = element.children[index]; $(clone).html(kendo.render(this.template(), items)); if (clone.children.length) { parents = this.bindings.source._parents(); for (idx = 0, length = items.length; idx < length; idx++) { child = clone.children[0]; element.insertBefore(child, reference || null); bindElement(child, items[idx], this.options.roles, [items[idx]].concat(parents)); } } }, remove: function(index, items) { var idx, element = this.container(); for (idx = 0; idx < items.length; idx++) { var child = element.children[index]; unbindElementTree(child); element.removeChild(child); } }, render: function() { var source = this.bindings.source.get(), parents, idx, length, element = this.container(), template = this.template(); if (source instanceof kendo.data.DataSource) { source = source.view(); } if (!(source instanceof ObservableArray) && toString.call(source) !== "[object Array]") { source = [source]; } if (this.bindings.template) { unbindElementChildren(element); $(element).html(this.bindings.template.render(source)); if (element.children.length) { parents = this.bindings.source._parents(); for (idx = 0, length = source.length; idx < length; idx++) { bindElement(element.children[idx], source[idx], this.options.roles, [source[idx]].concat(parents)); } } } else { $(element).html(kendo.render(template, source)); } } }); binders.input = { checked: Binder.extend({ init: function(element, bindings, options) { Binder.fn.init.call(this, element, bindings, options); this._change = proxy(this.change, this); $(this.element).change(this._change); }, change: function() { var element = this.element; var value = this.value(); if (element.type == "radio") { this.bindings[CHECKED].set(value); } else if (element.type == "checkbox") { var source = this.bindings[CHECKED].get(); var index; if (source instanceof ObservableArray) { value = this.element.value; if (value !== "on" && value !== "off") { index = source.indexOf(value); if (index > -1) { source.splice(index, 1); } else { source.push(value); } } } else { this.bindings[CHECKED].set(value); } } }, refresh: function() { var value = this.bindings[CHECKED].get(), source = value, element = this.element; if (element.type == "checkbox") { if (source instanceof ObservableArray) { value = this.element.value; if (source.indexOf(value) >= 0) { value = true; } } element.checked = value === true; } else if (element.type == "radio" && value != null) { if (element.value === value.toString()) { element.checked = true; } } }, value: function() { var element = this.element, value = element.value; if (element.type == "checkbox") { value = element.checked; } return value; }, destroy: function() { $(this.element).off(CHANGE, this._change); } }) }; binders.select = { value: Binder.extend({ init: function(target, bindings, options) { Binder.fn.init.call(this, target, bindings, options); this._change = proxy(this.change, this); $(this.element).change(this._change); }, change: function() { var values = [], element = this.element, source, field = this.options.valueField || this.options.textField, valuePrimitive = this.options.valuePrimitive, option, valueIndex, value, idx, length; for (idx = 0, length = element.options.length; idx < length; idx++) { option = element.options[idx]; if (option.selected) { value = option.attributes.value; if (value && value.specified) { value = option.value; } else { value = option.text; } values.push(value); } } if (field) { source = this.bindings.source.get(); if (source instanceof kendo.data.DataSource) { source = source.view(); } for (valueIndex = 0; valueIndex < values.length; valueIndex++) { for (idx = 0, length = source.length; idx < length; idx++) { if (source[idx].get(field) == values[valueIndex]) { values[valueIndex] = source[idx]; break; } } } } value = this.bindings[VALUE].get(); if (value instanceof ObservableArray) { value.splice.apply(value, [0, value.length].concat(values)); } else if (!valuePrimitive && (value instanceof ObservableObject || value === null || value === undefined || !field)) { this.bindings[VALUE].set(values[0]); } else { this.bindings[VALUE].set(values[0].get(field)); } }, refresh: function() { var optionIndex, element = this.element, options = element.options, value = this.bindings[VALUE].get(), values = value, field = this.options.valueField || this.options.textField, found = false, optionValue; if (!(values instanceof ObservableArray)) { values = new ObservableArray([value]); } element.selectedIndex = -1; for (var valueIndex = 0; valueIndex < values.length; valueIndex++) { value = values[valueIndex]; if (field && value instanceof ObservableObject) { value = value.get(field); } for (optionIndex = 0; optionIndex < options.length; optionIndex++) { optionValue = options[optionIndex].value; if (optionValue === "" && value !== "") { optionValue = options[optionIndex].text; } if (optionValue == value) { options[optionIndex].selected = true; found = true; } } } }, destroy: function() { $(this.element).off(CHANGE, this._change); } }) }; function dataSourceBinding(bindingName, fieldName, setter) { return Binder.extend({ init: function(widget, bindings, options) { var that = this; Binder.fn.init.call(that, widget.element[0], bindings, options); that.widget = widget; that._dataBinding = proxy(that.dataBinding, that); that._dataBound = proxy(that.dataBound, that); that._itemChange = proxy(that.itemChange, that); }, itemChange: function(e) { bindElement(e.item[0], e.data, this._ns(e.ns), [e.data].concat(this.bindings[bindingName]._parents())); }, dataBinding: function(e) { var idx, length, widget = this.widget, items = e.removedItems || widget.items(); for (idx = 0, length = items.length; idx < length; idx++) { unbindElementTree(items[idx]); } }, _ns: function(ns) { ns = ns || kendo.ui; var all = [ kendo.ui, kendo.dataviz.ui, kendo.mobile.ui ]; all.splice($.inArray(ns, all), 1); all.unshift(ns); return kendo.rolesFromNamespaces(all); }, dataBound: function(e) { var idx, length, widget = this.widget, items = e.addedItems || widget.items(), dataSource = widget[fieldName], view, parents, groups = dataSource.group() || []; if (items.length) { view = e.addedDataItems || dataSource.flatView(); parents = this.bindings[bindingName]._parents(); for (idx = 0, length = view.length; idx < length; idx++) { bindElement(items[idx], view[idx], this._ns(e.ns), [view[idx]].concat(parents)); } } }, refresh: function(e) { var that = this, source, widget = that.widget; e = e || {}; if (!e.action) { that.destroy(); widget.bind("dataBinding", that._dataBinding); widget.bind("dataBound", that._dataBound); widget.bind("itemChange", that._itemChange); source = that.bindings[bindingName].get(); if (widget[fieldName] instanceof kendo.data.DataSource && widget[fieldName] != source) { if (source instanceof kendo.data.DataSource) { widget[setter](source); } else if (source && source._dataSource) { widget[setter](source._dataSource); } else { widget[fieldName].data(source); } } } }, destroy: function() { var widget = this.widget; widget.unbind("dataBinding", this._dataBinding); widget.unbind("dataBound", this._dataBound); widget.unbind("itemChange", this._itemChange); } }); } binders.widget = { events : Binder.extend({ init: function(widget, bindings, options) { Binder.fn.init.call(this, widget.element[0], bindings, options); this.widget = widget; this.handlers = {}; }, refresh: function(key) { var binding = this.bindings.events[key], handler = this.handlers[key]; if (handler) { this.widget.unbind(key, handler); } handler = binding.get(); this.handlers[key] = function(e) { e.data = binding.source; handler(e); if (e.data === binding.source) { delete e.data; } }; this.widget.bind(key, this.handlers[key]); }, destroy: function() { var handler; for (handler in this.handlers) { this.widget.unbind(handler, this.handlers[handler]); } } }), checked: Binder.extend({ init: function(widget, bindings, options) { Binder.fn.init.call(this, widget.element[0], bindings, options); this.widget = widget; this._change = proxy(this.change, this); this.widget.bind(CHANGE, this._change); }, change: function() { this.bindings[CHECKED].set(this.value()); }, refresh: function() { this.widget.check(this.bindings[CHECKED].get() === true); }, value: function() { var element = this.element, value = element.value; if (value == "on" || value == "off") { value = element.checked; } return value; }, destroy: function() { this.widget.unbind(CHANGE, this._change); } }), visible: Binder.extend({ init: function(widget, bindings, options) { Binder.fn.init.call(this, widget.element[0], bindings, options); this.widget = widget; }, refresh: function() { var visible = this.bindings.visible.get(); this.widget.wrapper[0].style.display = visible ? "" : "none"; } }), invisible: Binder.extend({ init: function(widget, bindings, options) { Binder.fn.init.call(this, widget.element[0], bindings, options); this.widget = widget; }, refresh: function() { var invisible = this.bindings.invisible.get(); this.widget.wrapper[0].style.display = invisible ? "none" : ""; } }), enabled: Binder.extend({ init: function(widget, bindings, options) { Binder.fn.init.call(this, widget.element[0], bindings, options); this.widget = widget; }, refresh: function() { if (this.widget.enable) { this.widget.enable(this.bindings.enabled.get()); } } }), disabled: Binder.extend({ init: function(widget, bindings, options) { Binder.fn.init.call(this, widget.element[0], bindings, options); this.widget = widget; }, refresh: function() { if (this.widget.enable) { this.widget.enable(!this.bindings.disabled.get()); } } }), source: dataSourceBinding("source", "dataSource", "setDataSource"), value: Binder.extend({ init: function(widget, bindings, options) { Binder.fn.init.call(this, widget.element[0], bindings, options); this.widget = widget; this._change = $.proxy(this.change, this); this.widget.first(CHANGE, this._change); var value = this.bindings.value.get(); this._valueIsObservableObject = !options.valuePrimitive && (value == null || value instanceof ObservableObject); this._valueIsObservableArray = value instanceof ObservableArray; this._initChange = false; }, change: function() { var value = this.widget.value(), field = this.options.dataValueField || this.options.dataTextField, isArray = toString.call(value) === "[object Array]", isObservableObject = this._valueIsObservableObject, valueIndex, valueLength, values = [], sourceItem, sourceValue, idx, length, source; this._initChange = true; if (field) { if (this.bindings.source) { source = this.bindings.source.get(); } if (value === "" && (isObservableObject || this.options.valuePrimitive)) { value = null; } else { if (!source || source instanceof kendo.data.DataSource) { source = this.widget.dataSource.view(); } if (isArray) { valueLength = value.length; values = value.slice(0); } for (idx = 0, length = source.length; idx < length; idx++) { sourceItem = source[idx]; sourceValue = sourceItem.get(field); if (isArray) { for (valueIndex = 0; valueIndex < valueLength; valueIndex++) { if (sourceValue == values[valueIndex]) { values[valueIndex] = sourceItem; break; } } } else if (sourceValue == value) { value = isObservableObject ? sourceItem : sourceValue; break; } } if (values[0]) { if (this._valueIsObservableArray) { value = values; } else if (isObservableObject || !field) { value = values[0]; } else { value = values[0].get(field); } } } } this.bindings.value.set(value); this._initChange = false; }, refresh: function() { if (!this._initChange) { var field = this.options.dataValueField || this.options.dataTextField, value = this.bindings.value.get(), idx = 0, length, values = []; if (value === undefined) { value = null; } if (field) { if (value instanceof ObservableArray) { for (length = value.length; idx < length; idx++) { values[idx] = value[idx].get(field); } value = values; } else if (value instanceof ObservableObject) { value = value.get(field); } } this.widget.value(value); } this._initChange = false; }, destroy: function() { this.widget.unbind(CHANGE, this._change); } }), gantt: { dependencies: dataSourceBinding("dependencies", "dependencies", "setDependenciesDataSource") }, multiselect: { value: Binder.extend({ init: function(widget, bindings, options) { Binder.fn.init.call(this, widget.element[0], bindings, options); this.widget = widget; this._change = $.proxy(this.change, this); this.widget.first(CHANGE, this._change); this._initChange = false; }, change: function() { var that = this, oldValues = that.bindings[VALUE].get(), valuePrimitive = that.options.valuePrimitive, newValues = valuePrimitive ? that.widget.value() : that.widget.dataItems(); var field = this.options.dataValueField || this.options.dataTextField; newValues = newValues.slice(0); that._initChange = true; if (oldValues instanceof ObservableArray) { var remove = []; var newLength = newValues.length; var i = 0, j = 0; var old = oldValues[i]; var same = false; var removeIndex; var newValue; var found; while (old !== undefined) { found = false; for (j = 0; j < newLength; j++) { if (valuePrimitive) { same = newValues[j] == old; } else { newValue = newValues[j]; newValue = newValue.get ? newValue.get(field) : newValue; same = newValue == (old.get ? old.get(field) : old); } if (same) { newValues.splice(j, 1); newLength -= 1; found = true; break; } } if (!found) { remove.push(old); arraySplice(oldValues, i, 1); removeIndex = i; } else { i += 1; } old = oldValues[i]; } arraySplice(oldValues, oldValues.length, 0, newValues); if (remove.length) { oldValues.trigger("change", { action: "remove", items: remove, index: removeIndex }); } if (newValues.length) { oldValues.trigger("change", { action: "add", items: newValues, index: oldValues.length - 1 }); } } else { that.bindings[VALUE].set(newValues); } that._initChange = false; }, refresh: function() { if (!this._initChange) { var field = this.options.dataValueField || this.options.dataTextField, value = this.bindings.value.get(), idx = 0, length, values = [], selectedValue; if (value === undefined) { value = null; } if (field) { if (value instanceof ObservableArray) { for (length = value.length; idx < length; idx++) { selectedValue = value[idx]; values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue; } value = values; } else if (value instanceof ObservableObject) { value = value.get(field); } } this.widget.value(value); } }, destroy: function() { this.widget.unbind(CHANGE, this._change); } }) }, scheduler: { source: dataSourceBinding("source", "dataSource", "setDataSource").extend({ dataBound: function(e) { var idx; var length; var widget = this.widget; var elements = e.addedItems || widget.items(); var data, parents; if (elements.length) { data = e.addedDataItems || widget.dataItems(); parents = this.bindings.source._parents(); for (idx = 0, length = data.length; idx < length; idx++) { bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents)); } } } }) } }; var arraySplice = function(arr, idx, remove, add) { add = add || []; remove = remove || 0; var addLength = add.length; var oldLength = arr.length; var shifted = [].slice.call(arr, idx + remove); var shiftedLength = shifted.length; var index; if (addLength) { addLength = idx + addLength; index = 0; for (; idx < addLength; idx++) { arr[idx] = add[index]; index++; } arr.length = addLength; } else if (remove) { arr.length = idx; remove += idx; while (idx < remove) { delete arr[--remove]; } } if (shiftedLength) { shiftedLength = idx + shiftedLength; index = 0; for (; idx < shiftedLength; idx++) { arr[idx] = shifted[index]; index++; } arr.length = shiftedLength; } idx = arr.length; while (idx < oldLength) { delete arr[idx]; idx++; } }; var BindingTarget = Class.extend( { init: function(target, options) { this.target = target; this.options = options; this.toDestroy = []; }, bind: function(bindings) { var nodeName = this.target.nodeName.toLowerCase(), key, hasValue, hasSource, hasEvents, specificBinders = binders[nodeName] || {}; for (key in bindings) { if (key == VALUE) { hasValue = true; } else if (key == SOURCE) { hasSource = true; } else if (key == EVENTS) { hasEvents = true; } else { this.applyBinding(key, bindings, specificBinders); } } if (hasSource) { this.applyBinding(SOURCE, bindings, specificBinders); } if (hasValue) { this.applyBinding(VALUE, bindings, specificBinders); } if (hasEvents) { this.applyBinding(EVENTS, bindings, specificBinders); } }, applyBinding: function(name, bindings, specificBinders) { var binder = specificBinders[name] || binders[name], toDestroy = this.toDestroy, attribute, binding = bindings[name]; if (binder) { binder = new binder(this.target, bindings, this.options); toDestroy.push(binder); if (binding instanceof Binding) { binder.bind(binding); toDestroy.push(binding); } else { for (attribute in binding) { binder.bind(binding, attribute); toDestroy.push(binding[attribute]); } } } else if (name !== "template") { throw new Error("The " + name + " binding is not supported by the " + this.target.nodeName.toLowerCase() + " element"); } }, destroy: function() { var idx, length, toDestroy = this.toDestroy; for (idx = 0, length = toDestroy.length; idx < length; idx++) { toDestroy[idx].destroy(); } } }); var WidgetBindingTarget = BindingTarget.extend( { bind: function(bindings) { var that = this, binding, hasValue = false, hasSource = false, specificBinders = binders.widget[that.target.options.name.toLowerCase()] || {}; for (binding in bindings) { if (binding == VALUE) { hasValue = true; } else if (binding == SOURCE) { hasSource = true; } else { that.applyBinding(binding, bindings, specificBinders); } } if (hasSource) { that.applyBinding(SOURCE, bindings, specificBinders); } if (hasValue) { that.applyBinding(VALUE, bindings, specificBinders); } }, applyBinding: function(name, bindings, specificBinders) { var binder = specificBinders[name] || binders.widget[name], toDestroy = this.toDestroy, attribute, binding = bindings[name]; if (binder) { binder = new binder(this.target, bindings, this.target.options); toDestroy.push(binder); if (binding instanceof Binding) { binder.bind(binding); toDestroy.push(binding); } else { for (attribute in binding) { binder.bind(binding, attribute); toDestroy.push(binding[attribute]); } } } else { throw new Error("The " + name + " binding is not supported by the " + this.target.options.name + " widget"); } } }); function bindingTargetForRole(element, roles) { var widget = kendo.initWidget(element, {}, roles); if (widget) { return new WidgetBindingTarget(widget); } } var keyValueRegExp = /[A-Za-z0-9_\-]+:(\{([^}]*)\}|[^,}]+)/g, whiteSpaceRegExp = /\s/g; function parseBindings(bind) { var result = {}, idx, length, token, colonIndex, key, value, tokens; tokens = bind.match(keyValueRegExp); for (idx = 0, length = tokens.length; idx < length; idx++) { token = tokens[idx]; colonIndex = token.indexOf(":"); key = token.substring(0, colonIndex); value = token.substring(colonIndex + 1); if (value.charAt(0) == "{") { value = parseBindings(value); } result[key] = value; } return result; } function createBindings(bindings, source, type) { var binding, result = {}; for (binding in bindings) { result[binding] = new type(source, bindings[binding]); } return result; } function bindElement(element, source, roles, parents) { var role = element.getAttribute("data-" + kendo.ns + "role"), idx, bind = element.getAttribute("data-" + kendo.ns + "bind"), children = element.children, childrenCopy = [], deep = true, bindings, options = {}, target; parents = parents || [source]; if (role || bind) { unbindElement(element); } if (role) { target = bindingTargetForRole(element, roles); } if (bind) { bind = parseBindings(bind.replace(whiteSpaceRegExp, "")); if (!target) { options = kendo.parseOptions(element, {textField: "", valueField: "", template: "", valueUpdate: CHANGE, valuePrimitive: false, autoBind: true}); options.roles = roles; target = new BindingTarget(element, options); } target.source = source; bindings = createBindings(bind, parents, Binding); if (options.template) { bindings.template = new TemplateBinding(parents, "", options.template); } if (bindings.click) { bind.events = bind.events || {}; bind.events.click = bind.click; bindings.click.destroy(); delete bindings.click; } if (bindings.source) { deep = false; } if (bind.attr) { bindings.attr = createBindings(bind.attr, parents, Binding); } if (bind.style) { bindings.style = createBindings(bind.style, parents, Binding); } if (bind.events) { bindings.events = createBindings(bind.events, parents, EventBinding); } target.bind(bindings); } if (target) { element.kendoBindingTarget = target; } if (deep && children) { // https://github.com/telerik/kendo/issues/1240 for the weirdness. for (idx = 0; idx < children.length; idx++) { childrenCopy[idx] = children[idx]; } for (idx = 0; idx < childrenCopy.length; idx++) { bindElement(childrenCopy[idx], source, roles, parents); } } } function bind(dom, object) { var idx, length, node, roles = kendo.rolesFromNamespaces([].slice.call(arguments, 2)); object = kendo.observable(object); dom = $(dom); for (idx = 0, length = dom.length; idx < length; idx++) { node = dom[idx]; if (node.nodeType === 1) { bindElement(node, object, roles); } } } function unbindElement(element) { var bindingTarget = element.kendoBindingTarget; if (bindingTarget) { bindingTarget.destroy(); if (deleteExpando) { delete element.kendoBindingTarget; } else if (element.removeAttribute) { element.removeAttribute("kendoBindingTarget"); } else { element.kendoBindingTarget = null; } } } function unbindElementTree(element) { unbindElement(element); unbindElementChildren(element); } function unbindElementChildren(element) { var children = element.children; if (children) { for (var idx = 0, length = children.length; idx < length; idx++) { unbindElementTree(children[idx]); } } } function unbind(dom) { var idx, length; dom = $(dom); for (idx = 0, length = dom.length; idx < length; idx++ ) { unbindElementTree(dom[idx]); } } function notify(widget, namespace) { var element = widget.element, bindingTarget = element[0].kendoBindingTarget; if (bindingTarget) { bind(element, bindingTarget.source, namespace); } } kendo.unbind = unbind; kendo.bind = bind; kendo.data.binders = binders; kendo.data.Binder = Binder; kendo.notify = notify; kendo.observable = function(object) { if (!(object instanceof ObservableObject)) { object = new ObservableObject(object); } return object; }; kendo.observableHierarchy = function(array) { var dataSource = kendo.data.HierarchicalDataSource.create(array); function recursiveRead(data) { var i, children; for (i = 0; i < data.length; i++) { data[i]._initChildren(); children = data[i].children; children.fetch(); data[i].items = children.data(); recursiveRead(data[i].items); } } dataSource.fetch(); recursiveRead(dataSource.data()); dataSource._data._dataSource = dataSource; return dataSource._data; }; })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, fx = kendo.effects, each = $.each, extend = $.extend, proxy = $.proxy, support = kendo.support, browser = support.browser, transforms = support.transforms, transitions = support.transitions, scaleProperties = { scale: 0, scalex: 0, scaley: 0, scale3d: 0 }, translateProperties = { translate: 0, translatex: 0, translatey: 0, translate3d: 0 }, hasZoom = (typeof document.documentElement.style.zoom !== "undefined") && !transforms, matrix3dRegExp = /matrix3?d?\s*\(.*,\s*([\d\.\-]+)\w*?,\s*([\d\.\-]+)\w*?,\s*([\d\.\-]+)\w*?,\s*([\d\.\-]+)\w*?/i, cssParamsRegExp = /^(-?[\d\.\-]+)?[\w\s]*,?\s*(-?[\d\.\-]+)?[\w\s]*/i, translateXRegExp = /translatex?$/i, oldEffectsRegExp = /(zoom|fade|expand)(\w+)/, singleEffectRegExp = /(zoom|fade|expand)/, unitRegExp = /[xy]$/i, transformProps = ["perspective", "rotate", "rotatex", "rotatey", "rotatez", "rotate3d", "scale", "scalex", "scaley", "scalez", "scale3d", "skew", "skewx", "skewy", "translate", "translatex", "translatey", "translatez", "translate3d", "matrix", "matrix3d"], transform2d = ["rotate", "scale", "scalex", "scaley", "skew", "skewx", "skewy", "translate", "translatex", "translatey", "matrix"], transform2units = { "rotate": "deg", scale: "", skew: "px", translate: "px" }, cssPrefix = transforms.css, round = Math.round, BLANK = "", PX = "px", NONE = "none", AUTO = "auto", WIDTH = "width", HEIGHT = "height", HIDDEN = "hidden", ORIGIN = "origin", ABORT_ID = "abortId", OVERFLOW = "overflow", TRANSLATE = "translate", POSITION = "position", COMPLETE_CALLBACK = "completeCallback", TRANSITION = cssPrefix + "transition", TRANSFORM = cssPrefix + "transform", BACKFACE = cssPrefix + "backface-visibility", PERSPECTIVE = cssPrefix + "perspective", DEFAULT_PERSPECTIVE = "1500px", TRANSFORM_PERSPECTIVE = "perspective(" + DEFAULT_PERSPECTIVE + ")", ios7 = support.mobileOS && support.mobileOS.majorVersion == 7, directions = { left: { reverse: "right", property: "left", transition: "translatex", vertical: false, modifier: -1 }, right: { reverse: "left", property: "left", transition: "translatex", vertical: false, modifier: 1 }, down: { reverse: "up", property: "top", transition: "translatey", vertical: true, modifier: 1 }, up: { reverse: "down", property: "top", transition: "translatey", vertical: true, modifier: -1 }, top: { reverse: "bottom" }, bottom: { reverse: "top" }, "in": { reverse: "out", modifier: -1 }, out: { reverse: "in", modifier: 1 }, vertical: { reverse: "vertical" }, horizontal: { reverse: "horizontal" } }; kendo.directions = directions; extend($.fn, { kendoStop: function(clearQueue, gotoEnd) { if (transitions) { return fx.stopQueue(this, clearQueue || false, gotoEnd || false); } else { return this.stop(clearQueue, gotoEnd); } } }); /* jQuery support for all transform animations (FF 3.5/3.6, Opera 10.x, IE9 */ if (transforms && !transitions) { each(transform2d, function(idx, value) { $.fn[value] = function(val) { if (typeof val == "undefined") { return animationProperty(this, value); } else { var that = $(this)[0], transformValue = value + "(" + val + transform2units[value.replace(unitRegExp, "")] + ")"; if (that.style.cssText.indexOf(TRANSFORM) == -1) { $(this).css(TRANSFORM, transformValue); } else { that.style.cssText = that.style.cssText.replace(new RegExp(value + "\\(.*?\\)", "i"), transformValue); } } return this; }; $.fx.step[value] = function (fx) { $(fx.elem)[value](fx.now); }; }); var curProxy = $.fx.prototype.cur; $.fx.prototype.cur = function () { if (transform2d.indexOf(this.prop) != -1) { return parseFloat($(this.elem)[this.prop]()); } return curProxy.apply(this, arguments); }; } kendo.toggleClass = function(element, classes, options, add) { if (classes) { classes = classes.split(" "); if (transitions) { options = extend({ exclusive: "all", duration: 400, ease: "ease-out" }, options); element.css(TRANSITION, options.exclusive + " " + options.duration + "ms " + options.ease); setTimeout(function() { element.css(TRANSITION, "").css(HEIGHT); }, options.duration); // TODO: this should fire a kendoAnimate session instead. } each(classes, function(idx, value) { element.toggleClass(value, add); }); } return element; }; kendo.parseEffects = function(input, mirror) { var effects = {}; if (typeof input === "string") { each(input.split(" "), function(idx, value) { var redirectedEffect = !singleEffectRegExp.test(value), resolved = value.replace(oldEffectsRegExp, function(match, $1, $2) { return $1 + ":" + $2.toLowerCase(); }), // Support for old zoomIn/fadeOut style, now deprecated. effect = resolved.split(":"), direction = effect[1], effectBody = {}; if (effect.length > 1) { effectBody.direction = (mirror && redirectedEffect ? directions[direction].reverse : direction); } effects[effect[0]] = effectBody; }); } else { each(input, function(idx) { var direction = this.direction; if (direction && mirror && !singleEffectRegExp.test(idx)) { this.direction = directions[direction].reverse; } effects[idx] = this; }); } return effects; }; function parseInteger(value) { return parseInt(value, 10); } function parseCSS(element, property) { return parseInteger(element.css(property)); } function keys(obj) { var acc = []; for (var propertyName in obj) { acc.push(propertyName); } return acc; } function strip3DTransforms(properties) { for (var key in properties) { if (transformProps.indexOf(key) != -1 && transform2d.indexOf(key) == -1) { delete properties[key]; } } return properties; } function normalizeCSS(element, properties) { var transformation = [], cssValues = {}, lowerKey, key, value, isTransformed; for (key in properties) { lowerKey = key.toLowerCase(); isTransformed = transforms && transformProps.indexOf(lowerKey) != -1; if (!support.hasHW3D && isTransformed && transform2d.indexOf(lowerKey) == -1) { delete properties[key]; } else { value = properties[key]; if (isTransformed) { transformation.push(key + "(" + value + ")"); } else { cssValues[key] = value; } } } if (transformation.length) { cssValues[TRANSFORM] = transformation.join(" "); } return cssValues; } if (transitions) { extend(fx, { transition: function(element, properties, options) { var css, delay = 0, oldKeys = element.data("keys") || [], timeoutID; options = extend({ duration: 200, ease: "ease-out", complete: null, exclusive: "all" }, options ); var stopTransitionCalled = false; var stopTransition = function() { if (!stopTransitionCalled) { stopTransitionCalled = true; if (timeoutID) { clearTimeout(timeoutID); timeoutID = null; } element .removeData(ABORT_ID) .dequeue() .css(TRANSITION, "") .css(TRANSITION); options.complete.call(element); } }; options.duration = $.fx ? $.fx.speeds[options.duration] || options.duration : options.duration; css = normalizeCSS(element, properties); $.merge(oldKeys, keys(css)); element .data("keys", $.unique(oldKeys)) .height(); element.css(TRANSITION, options.exclusive + " " + options.duration + "ms " + options.ease).css(TRANSITION); element.css(css).css(TRANSFORM); /** * Use transitionEnd event for browsers who support it - but duplicate it with setTimeout, as the transitionEnd event will not be triggered if no CSS properties change. * This should be cleaned up at some point (widget by widget), and refactored to widgets not relying on the complete callback if no transition occurs. * * For IE9 and below, resort to setTimeout. */ if (transitions.event) { element.one(transitions.event, stopTransition); if (options.duration !== 0) { delay = 500; } } timeoutID = setTimeout(stopTransition, options.duration + delay); element.data(ABORT_ID, timeoutID); element.data(COMPLETE_CALLBACK, stopTransition); }, stopQueue: function(element, clearQueue, gotoEnd) { var cssValues, taskKeys = element.data("keys"), retainPosition = (!gotoEnd && taskKeys), completeCallback = element.data(COMPLETE_CALLBACK); if (retainPosition) { cssValues = kendo.getComputedStyles(element[0], taskKeys); } if (completeCallback) { completeCallback(); } if (retainPosition) { element.css(cssValues); } return element .removeData("keys") .stop(clearQueue); } }); } function animationProperty(element, property) { if (transforms) { var transform = element.css(TRANSFORM); if (transform == NONE) { return property == "scale" ? 1 : 0; } var match = transform.match(new RegExp(property + "\\s*\\(([\\d\\w\\.]+)")), computed = 0; if (match) { computed = parseInteger(match[1]); } else { match = transform.match(matrix3dRegExp) || [0, 0, 0, 0, 0]; property = property.toLowerCase(); if (translateXRegExp.test(property)) { computed = parseFloat(match[3] / match[2]); } else if (property == "translatey") { computed = parseFloat(match[4] / match[2]); } else if (property == "scale") { computed = parseFloat(match[2]); } else if (property == "rotate") { computed = parseFloat(Math.atan2(match[2], match[1])); } } return computed; } else { return parseFloat(element.css(property)); } } var EffectSet = kendo.Class.extend({ init: function(element, options) { var that = this; that.element = element; that.effects = []; that.options = options; that.restore = []; }, run: function(effects) { var that = this, effect, idx, jdx, length = effects.length, element = that.element, options = that.options, deferred = $.Deferred(), start = {}, end = {}, target, children, childrenLength; that.effects = effects; deferred.then($.proxy(that, "complete")); element.data("animating", true); for (idx = 0; idx < length; idx ++) { effect = effects[idx]; effect.setReverse(options.reverse); effect.setOptions(options); that.addRestoreProperties(effect.restore); effect.prepare(start, end); children = effect.children(); for (jdx = 0, childrenLength = children.length; jdx < childrenLength; jdx ++) { children[jdx].duration(options.duration).run(); } } // legacy support for options.properties for (var effectName in options.effects) { extend(end, options.effects[effectName].properties); } // Show the element initially if (!element.is(":visible")) { extend(start, { display: element.data("olddisplay") || "block" }); } if (transforms && !options.reset) { target = element.data("targetTransform"); if (target) { start = extend(target, start); } } start = normalizeCSS(element, start); if (transforms && !transitions) { start = strip3DTransforms(start); } element.css(start) .css(TRANSFORM); // Nudge for (idx = 0; idx < length; idx ++) { effects[idx].setup(); } if (options.init) { options.init(); } element.data("targetTransform", end); fx.animate(element, end, extend({}, options, { complete: deferred.resolve })); return deferred.promise(); }, stop: function() { $(this.element).kendoStop(true, true); }, addRestoreProperties: function(restore) { var element = this.element, value, i = 0, length = restore.length; for (; i < length; i ++) { value = restore[i]; this.restore.push(value); if (!element.data(value)) { element.data(value, element.css(value)); } } }, restoreCallback: function() { var element = this.element; for (var i = 0, length = this.restore.length; i < length; i ++) { var value = this.restore[i]; element.css(value, element.data(value)); } }, complete: function() { var that = this, idx = 0, element = that.element, options = that.options, effects = that.effects, length = effects.length; element .removeData("animating") .dequeue(); // call next animation from the queue if (options.hide) { element.data("olddisplay", element.css("display")).hide(); } this.restoreCallback(); if (hasZoom && !transforms) { setTimeout($.proxy(this, "restoreCallback"), 0); // Again jQuery callback in IE8- } for (; idx < length; idx ++) { effects[idx].teardown(); } if (options.completeCallback) { options.completeCallback(element); } } }); fx.promise = function(element, options) { var effects = [], effectClass, effectSet = new EffectSet(element, options), parsedEffects = kendo.parseEffects(options.effects), effect; options.effects = parsedEffects; for (var effectName in parsedEffects) { effectClass = fx[capitalize(effectName)]; if (effectClass) { effect = new effectClass(element, parsedEffects[effectName].direction); effects.push(effect); } } if (effects[0]) { effectSet.run(effects); } else { // Not sure how would an fx promise reach this state - means that you call kendoAnimate with no valid effects? Why? if (!element.is(":visible")) { element.css({ display: element.data("olddisplay") || "block" }).css("display"); } if (options.init) { options.init(); } element.dequeue(); effectSet.complete(); } }; extend(fx, { animate: function(elements, properties, options) { var useTransition = options.transition !== false; delete options.transition; if (transitions && "transition" in fx && useTransition) { fx.transition(elements, properties, options); } else { if (transforms) { elements.animate(strip3DTransforms(properties), { queue: false, show: false, hide: false, duration: options.duration, complete: options.complete }); // Stop animate from showing/hiding the element to be able to hide it later on. } else { elements.each(function() { var element = $(this), multiple = {}; each(transformProps, function(idx, value) { // remove transforms to avoid IE and older browsers confusion var params, currentValue = properties ? properties[value]+ " " : null; // We need to match if (currentValue) { var single = properties; if (value in scaleProperties && properties[value] !== undefined) { params = currentValue.match(cssParamsRegExp); if (transforms) { extend(single, { scale: +params[0] }); } } else { if (value in translateProperties && properties[value] !== undefined) { var position = element.css(POSITION), isFixed = (position == "absolute" || position == "fixed"); if (!element.data(TRANSLATE)) { if (isFixed) { element.data(TRANSLATE, { top: parseCSS(element, "top") || 0, left: parseCSS(element, "left") || 0, bottom: parseCSS(element, "bottom"), right: parseCSS(element, "right") }); } else { element.data(TRANSLATE, { top: parseCSS(element, "marginTop") || 0, left: parseCSS(element, "marginLeft") || 0 }); } } var originalPosition = element.data(TRANSLATE); params = currentValue.match(cssParamsRegExp); if (params) { var dX = value == TRANSLATE + "y" ? +null : +params[1], dY = value == TRANSLATE + "y" ? +params[1] : +params[2]; if (isFixed) { if (!isNaN(originalPosition.right)) { if (!isNaN(dX)) { extend(single, { right: originalPosition.right - dX }); } } else { if (!isNaN(dX)) { extend(single, { left: originalPosition.left + dX }); } } if (!isNaN(originalPosition.bottom)) { if (!isNaN(dY)) { extend(single, { bottom: originalPosition.bottom - dY }); } } else { if (!isNaN(dY)) { extend(single, { top: originalPosition.top + dY }); } } } else { if (!isNaN(dX)) { extend(single, { marginLeft: originalPosition.left + dX }); } if (!isNaN(dY)) { extend(single, { marginTop: originalPosition.top + dY }); } } } } } if (!transforms && value != "scale" && value in single) { delete single[value]; } if (single) { extend(multiple, single); } } }); if (browser.msie) { delete multiple.scale; } element.animate(multiple, { queue: false, show: false, hide: false, duration: options.duration, complete: options.complete }); // Stop animate from showing/hiding the element to be able to hide it later on. }); } } } }); fx.animatedPromise = fx.promise; var Effect = kendo.Class.extend({ init: function(element, direction) { var that = this; that.element = element; that._direction = direction; that.options = {}; that._additionalEffects = []; if (!that.restore) { that.restore = []; } }, // Public API reverse: function() { this._reverse = true; return this.run(); }, play: function() { this._reverse = false; return this.run(); }, add: function(additional) { this._additionalEffects.push(additional); return this; }, direction: function(value) { this._direction = value; return this; }, duration: function(duration) { this._duration = duration; return this; }, compositeRun: function() { var that = this, effectSet = new EffectSet(that.element, { reverse: that._reverse, duration: that._duration }), effects = that._additionalEffects.concat([ that ]); return effectSet.run(effects); }, run: function() { if (this._additionalEffects && this._additionalEffects[0]) { return this.compositeRun(); } var that = this, element = that.element, idx = 0, restore = that.restore, length = restore.length, value, deferred = $.Deferred(), start = {}, end = {}, target, children = that.children(), childrenLength = children.length; deferred.then($.proxy(that, "_complete")); element.data("animating", true); for (idx = 0; idx < length; idx ++) { value = restore[idx]; if (!element.data(value)) { element.data(value, element.css(value)); } } for (idx = 0; idx < childrenLength; idx ++) { children[idx].duration(that._duration).run(); } that.prepare(start, end); if (!element.is(":visible")) { extend(start, { display: element.data("olddisplay") || "block" }); } if (transforms) { target = element.data("targetTransform"); if (target) { start = extend(target, start); } } start = normalizeCSS(element, start); if (transforms && !transitions) { start = strip3DTransforms(start); } element.css(start).css(TRANSFORM); // Trick webkit into re-rendering that.setup(); element.data("targetTransform", end); fx.animate(element, end, { duration: that._duration, complete: deferred.resolve }); return deferred.promise(); }, stop: function() { var idx = 0, children = this.children(), childrenLength = children.length; for (idx = 0; idx < childrenLength; idx ++) { children[idx].stop(); } $(this.element).kendoStop(true, true); return this; }, restoreCallback: function() { var element = this.element; for (var i = 0, length = this.restore.length; i < length; i ++) { var value = this.restore[i]; element.css(value, element.data(value)); } }, _complete: function() { var that = this, element = that.element; element .removeData("animating") .dequeue(); // call next animation from the queue that.restoreCallback(); if (that.shouldHide()) { element.data("olddisplay", element.css("display")).hide(); } if (hasZoom && !transforms) { setTimeout($.proxy(that, "restoreCallback"), 0); // Again jQuery callback in IE8- } that.teardown(); }, /////////////////////////// Support for kendo.animate; setOptions: function(options) { extend(true, this.options, options); }, children: function() { return []; }, shouldHide: $.noop, setup: $.noop, prepare: $.noop, teardown: $.noop, directions: [], setReverse: function(reverse) { this._reverse = reverse; return this; } }); function capitalize(word) { return word.charAt(0).toUpperCase() + word.substring(1); } function createEffect(name, definition) { var effectClass = Effect.extend(definition), directions = effectClass.prototype.directions; fx[capitalize(name)] = effectClass; fx.Element.prototype[name] = function(direction, opt1, opt2, opt3) { return new effectClass(this.element, direction, opt1, opt2, opt3); }; each(directions, function(idx, theDirection) { fx.Element.prototype[name + capitalize(theDirection)] = function(opt1, opt2, opt3) { return new effectClass(this.element, theDirection, opt1, opt2, opt3); }; }); } var FOUR_DIRECTIONS = ["left", "right", "up", "down"], IN_OUT = ["in", "out"]; createEffect("slideIn", { directions: FOUR_DIRECTIONS, divisor: function(value) { this.options.divisor = value; return this; }, prepare: function(start, end) { var that = this, tmp, element = that.element, direction = directions[that._direction], offset = -direction.modifier * (direction.vertical ? element.outerHeight() : element.outerWidth()), startValue = offset / (that.options && that.options.divisor || 1) + PX, endValue = "0px"; if (that._reverse) { tmp = start; start = end; end = tmp; } if (transforms) { start[direction.transition] = startValue; end[direction.transition] = endValue; } else { start[direction.property] = startValue; end[direction.property] = endValue; } } }); createEffect("tile", { directions: FOUR_DIRECTIONS, init: function(element, direction, previous) { Effect.prototype.init.call(this, element, direction); this.options = { previous: previous }; }, previousDivisor: function(value) { this.options.previousDivisor = value; return this; }, children: function() { var that = this, reverse = that._reverse, previous = that.options.previous, divisor = that.options.previousDivisor || 1, dir = that._direction; var children = [ kendo.fx(that.element).slideIn(dir).setReverse(reverse) ]; if (previous) { children.push( kendo.fx(previous).slideIn(directions[dir].reverse).divisor(divisor).setReverse(!reverse) ); } return children; } }); function createToggleEffect(name, property, defaultStart, defaultEnd) { createEffect(name, { directions: IN_OUT, startValue: function(value) { this._startValue = value; return this; }, endValue: function(value) { this._endValue = value; return this; }, shouldHide: function() { return this._shouldHide; }, prepare: function(start, end) { var that = this, startValue, endValue, out = this._direction === "out", startDataValue = that.element.data(property), startDataValueIsSet = !(isNaN(startDataValue) || startDataValue == defaultStart); if (startDataValueIsSet) { startValue = startDataValue; } else if (typeof this._startValue !== "undefined") { startValue = this._startValue; } else { startValue = out ? defaultStart : defaultEnd; } if (typeof this._endValue !== "undefined") { endValue = this._endValue; } else { endValue = out ? defaultEnd : defaultStart; } if (this._reverse) { start[property] = endValue; end[property] = startValue; } else { start[property] = startValue; end[property] = endValue; } that._shouldHide = end[property] === defaultEnd; } }); } createToggleEffect("fade", "opacity", 1, 0); createToggleEffect("zoom", "scale", 1, 0.01); createEffect("slideMargin", { prepare: function(start, end) { var that = this, element = that.element, options = that.options, origin = element.data(ORIGIN), offset = options.offset, margin, reverse = that._reverse; if (!reverse && origin === null) { element.data(ORIGIN, parseFloat(element.css("margin-" + options.axis))); } margin = (element.data(ORIGIN) || 0); end["margin-" + options.axis] = !reverse ? margin + offset : margin; } }); createEffect("slideTo", { prepare: function(start, end) { var that = this, element = that.element, options = that.options, offset = options.offset.split(","), reverse = that._reverse; if (transforms) { end.translatex = !reverse ? offset[0] : 0; end.translatey = !reverse ? offset[1] : 0; } else { end.left = !reverse ? offset[0] : 0; end.top = !reverse ? offset[1] : 0; } element.css("left"); } }); createEffect("expand", { directions: ["horizontal", "vertical"], restore: [ OVERFLOW ], prepare: function(start, end) { var that = this, element = that.element, options = that.options, reverse = that._reverse, property = that._direction === "vertical" ? HEIGHT : WIDTH, setLength = element[0].style[property], oldLength = element.data(property), length = parseFloat(oldLength || setLength), realLength = round(element.css(property, AUTO)[property]()); start.overflow = HIDDEN; length = (options && options.reset) ? realLength || length : length || realLength; end[property] = (reverse ? 0 : length) + PX; start[property] = (reverse ? length : 0) + PX; if (oldLength === undefined) { element.data(property, setLength); } }, shouldHide: function() { return this._reverse; }, teardown: function() { var that = this, element = that.element, property = that._direction === "vertical" ? HEIGHT : WIDTH, length = element.data(property); if (length == AUTO || length === BLANK) { setTimeout(function() { element.css(property, AUTO).css(property); }, 0); // jQuery animate complete callback in IE is called before the last animation step! } } }); var TRANSFER_START_STATE = { position: "absolute", marginLeft: 0, marginTop: 0, scale: 1 }; /** * Intersection point formulas are taken from here - http://zonalandeducation.com/mmts/intersections/intersectionOfTwoLines1/intersectionOfTwoLines1.html * Formula for a linear function from two points from here - http://demo.activemath.org/ActiveMath2/search/show.cmd?id=mbase://AC_UK_calculus/functions/ex_linear_equation_two_points * The transform origin point is the intersection point of the two lines from the top left corners/top right corners of the element and target. * The math and variables below MAY BE SIMPLIFIED (zeroes removed), but this would make the formula too cryptic. */ createEffect("transfer", { init: function(element, target) { this.element = element; this.options = { target: target }; this.restore = []; }, setup: function() { this.element.appendTo(document.body); }, prepare: function(start, end) { var that = this, element = that.element, outerBox = fx.box(element), innerBox = fx.box(that.options.target), currentScale = animationProperty(element, "scale"), scale = fx.fillScale(innerBox, outerBox), transformOrigin = fx.transformOrigin(innerBox, outerBox); extend(start, TRANSFER_START_STATE); end.scale = 1; element.css(TRANSFORM, "scale(1)").css(TRANSFORM); element.css(TRANSFORM, "scale(" + currentScale + ")"); start.top = outerBox.top; start.left = outerBox.left; start.transformOrigin = transformOrigin.x + PX + " " + transformOrigin.y + PX; if (that._reverse) { start.scale = scale; } else { end.scale = scale; } } }); var CLIPS = { top: "rect(auto auto $size auto)", bottom: "rect($size auto auto auto)", left: "rect(auto $size auto auto)", right: "rect(auto auto auto $size)" }; var ROTATIONS = { top: { start: "rotatex(0deg)", end: "rotatex(180deg)" }, bottom: { start: "rotatex(-180deg)", end: "rotatex(0deg)" }, left: { start: "rotatey(0deg)", end: "rotatey(-180deg)" }, right: { start: "rotatey(180deg)", end: "rotatey(0deg)" } }; function clipInHalf(container, direction) { var vertical = kendo.directions[direction].vertical, size = (container[vertical ? HEIGHT : WIDTH]() / 2) + "px"; return CLIPS[direction].replace("$size", size); } createEffect("turningPage", { directions: FOUR_DIRECTIONS, init: function(element, direction, container) { Effect.prototype.init.call(this, element, direction); this._container = container; }, prepare: function(start, end) { var that = this, reverse = that._reverse, direction = reverse ? directions[that._direction].reverse : that._direction, rotation = ROTATIONS[direction]; start.zIndex = 1; if (that._clipInHalf) { start.clip = clipInHalf(that._container, kendo.directions[direction].reverse); } start[BACKFACE] = HIDDEN; end[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.start : rotation.end); start[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.end : rotation.start); }, setup: function() { this._container.append(this.element); }, face: function(value) { this._face = value; return this; }, shouldHide: function() { var that = this, reverse = that._reverse, face = that._face; return (reverse && !face) || (!reverse && face); }, clipInHalf: function(value) { this._clipInHalf = value; return this; }, temporary: function() { this.element.addClass('temp-page'); return this; } }); createEffect("staticPage", { directions: FOUR_DIRECTIONS, init: function(element, direction, container) { Effect.prototype.init.call(this, element, direction); this._container = container; }, restore: ["clip"], prepare: function(start, end) { var that = this, direction = that._reverse ? directions[that._direction].reverse : that._direction; start.clip = clipInHalf(that._container, direction); start.opacity = 0.999; end.opacity = 1; }, shouldHide: function() { var that = this, reverse = that._reverse, face = that._face; return (reverse && !face) || (!reverse && face); }, face: function(value) { this._face = value; return this; } }); createEffect("pageturn", { directions: ["horizontal", "vertical"], init: function(element, direction, face, back) { Effect.prototype.init.call(this, element, direction); this.options = {}; this.options.face = face; this.options.back = back; }, children: function() { var that = this, options = that.options, direction = that._direction === "horizontal" ? "left" : "top", reverseDirection = kendo.directions[direction].reverse, reverse = that._reverse, temp, faceClone = options.face.clone(true).removeAttr("id"), backClone = options.back.clone(true).removeAttr("id"), element = that.element; if (reverse) { temp = direction; direction = reverseDirection; reverseDirection = temp; } return [ kendo.fx(options.face).staticPage(direction, element).face(true).setReverse(reverse), kendo.fx(options.back).staticPage(reverseDirection, element).setReverse(reverse), kendo.fx(faceClone).turningPage(direction, element).face(true).clipInHalf(true).temporary().setReverse(reverse), kendo.fx(backClone).turningPage(reverseDirection, element).clipInHalf(true).temporary().setReverse(reverse) ]; }, prepare: function(start, end) { start[PERSPECTIVE] = DEFAULT_PERSPECTIVE; start.transformStyle = "preserve-3d"; // hack to trigger transition end. start.opacity = 0.999; end.opacity = 1; }, teardown: function() { this.element.find(".temp-page").remove(); } }); createEffect("flip", { directions: ["horizontal", "vertical"], init: function(element, direction, face, back) { Effect.prototype.init.call(this, element, direction); this.options = {}; this.options.face = face; this.options.back = back; }, children: function() { var that = this, options = that.options, direction = that._direction === "horizontal" ? "left" : "top", reverseDirection = kendo.directions[direction].reverse, reverse = that._reverse, temp, element = that.element; if (reverse) { temp = direction; direction = reverseDirection; reverseDirection = temp; } return [ kendo.fx(options.face).turningPage(direction, element).face(true).setReverse(reverse), kendo.fx(options.back).turningPage(reverseDirection, element).setReverse(reverse) ]; }, prepare: function(start) { start[PERSPECTIVE] = DEFAULT_PERSPECTIVE; start.transformStyle = "preserve-3d"; } }); var RESTORE_OVERFLOW = !support.mobileOS.android; var IGNORE_TRANSITION_EVENT_SELECTOR = ".km-touch-scrollbar, .km-actionsheet-wrapper"; createEffect("replace", { _before: $.noop, _after: $.noop, init: function(element, previous, transitionClass) { Effect.prototype.init.call(this, element); this._previous = $(previous); this._transitionClass = transitionClass; }, duration: function() { throw new Error("The replace effect does not support duration setting; the effect duration may be customized through the transition class rule"); }, beforeTransition: function(callback) { this._before = callback; return this; }, afterTransition: function(callback) { this._after = callback; return this; }, _both: function() { return $().add(this._element).add(this._previous); }, _containerClass: function() { var direction = this._direction, containerClass = "k-fx k-fx-start k-fx-" + this._transitionClass; if (direction) { containerClass += " k-fx-" + direction; } if (this._reverse) { containerClass += " k-fx-reverse"; } return containerClass; }, complete: function(e) { if (!this.deferred || (e && $(e.target).is(IGNORE_TRANSITION_EVENT_SELECTOR))) { return; } var container = this.container; container .removeClass("k-fx-end") .removeClass(this._containerClass()) .off(transitions.event, this.completeProxy); this._previous.hide().removeClass("k-fx-current"); this.element.removeClass("k-fx-next"); if (RESTORE_OVERFLOW) { container.css(OVERFLOW, ""); } if (!this.isAbsolute) { this._both().css(POSITION, ""); } this.deferred.resolve(); delete this.deferred; }, run: function() { if (this._additionalEffects && this._additionalEffects[0]) { return this.compositeRun(); } var that = this, element = that.element, previous = that._previous, container = element.parents().filter(previous.parents()).first(), both = that._both(), deferred = $.Deferred(), originalPosition = element.css(POSITION), originalOverflow; // edge case for grid/scheduler, where the previous is already destroyed. if (!container.length) { container = element.parent(); } this.container = container; this.deferred = deferred; this.isAbsolute = originalPosition == "absolute"; if (!this.isAbsolute) { both.css(POSITION, "absolute"); } if (RESTORE_OVERFLOW) { originalOverflow = container.css(OVERFLOW); container.css(OVERFLOW, "hidden"); } if (!transitions) { this.complete(); } else { element.addClass("k-fx-hidden"); container.addClass(this._containerClass()); this.completeProxy = $.proxy(this, "complete"); container.on(transitions.event, this.completeProxy); kendo.animationFrame(function() { element.removeClass("k-fx-hidden").addClass("k-fx-next"); previous.css("display", "").addClass("k-fx-current"); that._before(previous, element); kendo.animationFrame(function() { container.removeClass("k-fx-start").addClass("k-fx-end"); that._after(previous, element); }); }); } return deferred.promise(); }, stop: function() { this.complete(); } }); var Animation = kendo.Class.extend({ init: function() { var that = this; that._tickProxy = proxy(that._tick, that); that._started = false; }, tick: $.noop, done: $.noop, onEnd: $.noop, onCancel: $.noop, start: function() { if (!this.enabled()) { return; } if (!this.done()) { this._started = true; kendo.animationFrame(this._tickProxy); } else { this.onEnd(); } }, enabled: function() { return true; }, cancel: function() { this._started = false; this.onCancel(); }, _tick: function() { var that = this; if (!that._started) { return; } that.tick(); if (!that.done()) { kendo.animationFrame(that._tickProxy); } else { that._started = false; that.onEnd(); } } }); var Transition = Animation.extend({ init: function(options) { var that = this; extend(that, options); Animation.fn.init.call(that); }, done: function() { return this.timePassed() >= this.duration; }, timePassed: function() { return Math.min(this.duration, (new Date()) - this.startDate); }, moveTo: function(options) { var that = this, movable = that.movable; that.initial = movable[that.axis]; that.delta = options.location - that.initial; that.duration = typeof options.duration == "number" ? options.duration : 300; that.tick = that._easeProxy(options.ease); that.startDate = new Date(); that.start(); }, _easeProxy: function(ease) { var that = this; return function() { that.movable.moveAxis(that.axis, ease(that.timePassed(), that.initial, that.delta, that.duration)); }; } }); extend(Transition, { easeOutExpo: function (t, b, c, d) { return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; }, easeOutBack: function (t, b, c, d, s) { s = 1.70158; return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; } }); fx.Animation = Animation; fx.Transition = Transition; fx.createEffect = createEffect; fx.box = function(element) { element = $(element); var result = element.offset(); result.width = element.outerWidth(); result.height = element.outerHeight(); return result; }; fx.transformOrigin = function(inner, outer) { var x = (inner.left - outer.left) * outer.width / (outer.width - inner.width), y = (inner.top - outer.top) * outer.height / (outer.height - inner.height); return { x: isNaN(x) ? 0 : x, y: isNaN(y) ? 0 : y }; }; fx.fillScale = function(inner, outer) { return Math.min(inner.width / outer.width, inner.height / outer.height); }; fx.fitScale = function(inner, outer) { return Math.max(inner.width / outer.width, inner.height / outer.height); }; })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, Observable = kendo.Observable, SCRIPT = "SCRIPT", INIT = "init", SHOW = "show", HIDE = "hide", TRANSITION_START = "transitionStart", TRANSITION_END = "transitionEnd", ATTACH = "attach", DETACH = "detach", sizzleErrorRegExp = /unrecognized expression/; var View = Observable.extend({ init: function(content, options) { var that = this; options = options || {}; Observable.fn.init.call(that); that.content = content; that.id = kendo.guid(); that.tagName = options.tagName || "div"; that.model = options.model; that._wrap = options.wrap !== false; this._evalTemplate = options.evalTemplate || false; that._fragments = {}; that.bind([ INIT, SHOW, HIDE, TRANSITION_START, TRANSITION_END ], options); }, render: function(container) { var that = this, notInitialized = !that.element; // The order below matters - kendo.bind should happen when the element is in the DOM, and show should be triggered after init. if (notInitialized) { that.element = that._createElement(); } if (container) { $(container).append(that.element); } if (notInitialized) { kendo.bind(that.element, that.model); that.trigger(INIT); } if (container) { that._eachFragment(ATTACH); that.trigger(SHOW); } return that.element; }, clone: function(back) { return new ViewClone(this); }, triggerBeforeShow: function() { return true; }, showStart: function() { this.element.css("display", ""); }, showEnd: function() { }, hideStart: function() { }, hideEnd: function() { this.hide(); }, beforeTransition: function(type){ this.trigger(TRANSITION_START, { type: type }); }, afterTransition: function(type){ this.trigger(TRANSITION_END, { type: type }); }, hide: function() { this._eachFragment(DETACH); this.element.detach(); this.trigger(HIDE); }, destroy: function() { var element = this.element; if (element) { kendo.unbind(element); kendo.destroy(element); element.remove(); } }, fragments: function(fragments) { $.extend(this._fragments, fragments); }, _eachFragment: function(methodName) { for (var placeholder in this._fragments) { this._fragments[placeholder][methodName](this, placeholder); } }, _createElement: function() { var that = this, wrapper = "<" + that.tagName + " />", element, content; try { content = $(document.getElementById(that.content) || that.content); // support passing id without # if (content[0].tagName === SCRIPT) { content = content.html(); } } catch(e) { if (sizzleErrorRegExp.test(e.message)) { content = that.content; } } if (typeof content === "string") { content = content.replace(/^\s+|\s+$/g, ''); if (that._evalTemplate) { content = kendo.template(content)(that.model || {}); } element = $(wrapper).append(content); // drop the wrapper if asked - this seems like the easiest (although not very intuitive) way to avoid messing up templates with questionable content, like this one for instance: // if (!that._wrap) { element = element.contents(); } } else { element = content; if (that._evalTemplate) { element.html(kendo.template(element.html())(that.model || {})); } if (that._wrap) { element = element.wrapAll(wrapper).parent(); } } return element; } }); var ViewClone = kendo.Class.extend({ init: function(view) { $.extend(this, { element: view.element.clone(true), transition: view.transition, id: view.id }); view.element.parent().append(this.element); }, hideStart: $.noop, hideEnd: function() { this.element.remove(); }, beforeTransition: $.noop, afterTransition: $.noop }); var Layout = View.extend({ init: function(content, options) { View.fn.init.call(this, content, options); this.containers = {}; }, container: function(selector) { var container = this.containers[selector]; if (!container) { container = this._createContainer(selector); this.containers[selector] = container; } return container; }, showIn: function(selector, view, transition) { this.container(selector).show(view, transition); }, _createContainer: function(selector) { var root = this.render(), element = root.find(selector), container; if (!element.length && root.is(selector)) { if (root.is(selector)) { element = root; } else { throw new Error("can't find a container with the specified " + selector + " selector"); } } container = new ViewContainer(element); container.bind("accepted", function(e) { e.view.render(element); }); return container; } }); var Fragment = View.extend({ attach: function(view, placeholder) { view.element.find(placeholder).replaceWith(this.render()); }, detach: function() { } }); var transitionRegExp = /^(\w+)(:(\w+))?( (\w+))?$/; function parseTransition(transition) { if (!transition){ return {}; } var matches = transition.match(transitionRegExp) || []; return { type: matches[1], direction: matches[3], reverse: matches[5] === "reverse" }; } var ViewContainer = Observable.extend({ init: function(container) { Observable.fn.init.call(this); this.container = container; this.history = []; this.view = null; this.running = false; }, after: function() { this.running = false; this.trigger("complete", {view: this.view}); this.trigger("after"); }, end: function() { this.view.showEnd(); this.previous.hideEnd(); this.after(); }, show: function(view, transition, locationID) { if (!view.triggerBeforeShow()) { this.trigger("after"); return false; } locationID = locationID || view.id; var that = this, current = (view === that.view) ? view.clone() : that.view, history = that.history, previousEntry = history[history.length - 2] || {}, back = previousEntry.id === locationID, // If explicit transition is set, it will be with highest priority // Next we will try using the history record transition or the view transition configuration theTransition = transition || ( back ? history[history.length - 1].transition : view.transition ), transitionData = parseTransition(theTransition); if (that.running) { that.effect.stop(); } if (theTransition === "none") { theTransition = null; } that.trigger("accepted", { view: view }); that.view = view; that.previous = current; that.running = true; if (!back) { history.push({ id: locationID, transition: theTransition }); } else { history.pop(); } if (!current) { view.showStart(); view.showEnd(); that.after(); return true; } current.hideStart(); if (!theTransition || !kendo.effects.enabled) { view.showStart(); that.end(); } else { // hide the view element before init/show - prevents blinks on iPad // the replace effect will remove this class view.element.addClass("k-fx-hidden"); view.showStart(); // do not reverse the explicit transition if (back && !transition) { transitionData.reverse = !transitionData.reverse; } that.effect = kendo.fx(view.element).replace(current.element, transitionData.type) .beforeTransition(function() { view.beforeTransition("show"); current.beforeTransition("hide"); }) .afterTransition(function() { view.afterTransition("show"); current.afterTransition("hide"); }) .direction(transitionData.direction) .setReverse(transitionData.reverse); that.effect.run().then(function() { that.end(); }); } return true; } }); kendo.ViewContainer = ViewContainer; kendo.Fragment = Fragment; kendo.Layout = Layout; kendo.View = View; kendo.ViewClone = ViewClone; })(window.kendo.jQuery); (function(kendo) { function Node() { this.node = null; } Node.prototype = { remove: function() { this.node.parentNode.removeChild(this.node); } }; function Element(nodeName, attr, children) { this.nodeName = nodeName; this.attr = attr || {}; this.cssText = null; this.children = children || []; } Element.prototype = new Node(); Element.prototype.render = function(parent, cached) { var node; var index; var children = this.children; var length = children.length; if (!cached || cached.nodeName !== this.nodeName) { if (cached) { cached.remove(); cached = null; } node = document.createElement(this.nodeName); for (index = 0; index < length; index++) { children[index].render(node, null); } parent.appendChild(node); } else { node = cached.node; var cachedChildren = cached.children; if (Math.abs(cachedChildren.length - length) > 2) { this.render({ appendChild: function(node) { parent.replaceChild(node, cached.node); } }, null); return; } for (index = 0; index < length; index++) { children[index].render(node, cachedChildren[index]); } for (index = length, length = cachedChildren.length; index < length; index++) { cachedChildren[index].remove(); } } var attr = this.attr; var attrName; for (attrName in attr) { if (!cached || attr[attrName] !== cached.attr[attrName]) { if (node[attrName] !== undefined) { if (attrName !== "style") { node[attrName] = attr[attrName]; } else { var cssText = ""; var style = attr[attrName]; for (var key in style) { cssText += key; cssText += ":"; cssText += style[key]; cssText += ";"; } if (!cached || cached.cssText !== cssText) { node.style.cssText = cssText; } this.cssText = cssText; } } else { node.setAttribute(attrName, attr[attrName]); } } } if (cached) { for (attrName in cached.attr) { if (attr[attrName] === undefined) { if (node[attrName] !== undefined) { if (attrName === "style") { node.style.cssText = ""; } else if (attrName === "className") { node[attrName] = ""; } else { node.removeAttribute(attrName); } } else { node.removeAttribute(attrName); } } } } this.node = node; }; function TextNode(nodeValue) { this.nodeValue = nodeValue; } TextNode.prototype = new Node(); TextNode.prototype.nodeName = "#text"; TextNode.prototype.render = function(parent, cached) { var node; if (!cached || cached.nodeName !== this.nodeName) { if (cached) { cached.remove(); } node = document.createTextNode(this.nodeValue); parent.appendChild(node); } else { node = cached.node; if (this.nodeValue !== cached.nodeValue) { node.nodeValue = this.nodeValue; } } this.node = node; }; function HtmlNode(html) { this.html = html; } HtmlNode.prototype = { nodeName: "#html", remove: function() { for (var index = 0; index < this.nodes.length; index++) { this.nodes[index].parentNode.removeChild(this.nodes[index]); } }, render: function(parent, cached) { if (!cached || cached.nodeName !== this.nodeName || cached.html !== this.html) { if (cached) { cached.remove(); } var lastChild = parent.lastChild; parent.insertAdjacentHTML("beforeend", this.html); this.nodes = []; for (var child = lastChild ? lastChild.nextSibling : parent.firstChild; child; child = child.nextSibling) { this.nodes.push(child); } } else { this.nodes = cached.nodes.slice(0); } } }; function html(value) { return new HtmlNode(value); } function element(nodeName, attrs, children) { return new Element(nodeName, attrs, children); } function text(value) { return new TextNode(value); } function Tree(root) { this.root = root; this.children = []; } Tree.prototype = { html: html, element: element, text: text, render: function(children) { var cachedChildren = this.children; var index; var length; for (index = 0, length = children.length; index < length; index++) { children[index].render(this.root, cachedChildren[index]); } for (index = length; index < cachedChildren.length; index++) { cachedChildren[index].remove(); } this.children = children; } }; kendo.dom = { html: html, text: text, element: element, Tree: Tree }; })(window.kendo); (function(kendo){ var RELS = '\r\n' + '' + '' + '' + '' + ''; var CORE = kendo.template( '\r\n' + '' + '${creator}' + '${lastModifiedBy}' + '${created}' + '${modified}' + ''); var APP = kendo.template( '\r\n' + '' + 'Microsoft Excel' + '0' + 'false' + '' + '' + '' + 'Worksheets' + '' + '' + '${sheets.length}' + '' + '' + '' + '' + '' + '# for (var idx = 0; idx < sheets.length; idx++) { #' + '# if (sheets[idx].options.title) { #' + '${sheets[idx].options.title}' + '# } else { #' + 'Sheet${idx+1}' + '# } #' + '# } #' + '' + '' + 'false' + 'false' + 'false' + '14.0300' + ''); var CONTENT_TYPES = kendo.template( '\r\n' + '' + '' + '' + '' + '' + '' + '# for (var idx = 1; idx <= count; idx++) { #' + '' + '# } #' + '' + '' + ''); var WORKBOOK = kendo.template( '\r\n' + '' + '' + '' + '' + '' + '' + '' + '# for (var idx = 0; idx < sheets.length; idx++) { #' + '# if (sheets[idx].options.title) { #' + '' + '# } else { #' + '' + '# } #' + '# } #' + '' + '' + ''); var WORKSHEET = kendo.template( '\r\n' + '' + '' + '' + '' + '# if (freezePane) { #' + '' + '# } #' + '' + '' + '' + '# if (columns) { #' + '' + '# for (var ci = 0; ci < columns.length; ci++) { #' + '# var column = columns[ci]; #' + '# if (column.width) { #' + '' + '# } #' + '# } #' + '' + '# } #' + '' + '# for (var ri = 0; ri < data.length; ri++) { #' + '# var row = data[ri]; #' + '' + '# for (var ci = 0; ci < row.data.length; ci++) { #' + '# var cell = row.data[ci];#' + '' + '# if (cell.value != null) { #' + '${cell.value}' + '# } #' + '' + '# } #' + '' + '# } #' + '' + '# if (filter) { #' + '' + '# } #' + '# if (mergeCells.length) { #' + '' + '# for (var ci = 0; ci < mergeCells.length; ci++) { #' + '' + '# } #' + '' + '# } #' + '' + ''); var WORKBOOK_RELS = kendo.template( '\r\n' + '' + '# for (var idx = 1; idx <= count; idx++) { #' + '' + '# } #' + '' + '' + ''); var SHARED_STRINGS = kendo.template( '\r\n' + '' + '# for (var index in indexes) { #' + '${index.substring(1)}' + '# } #' + ''); var STYLES = kendo.template( '' + '' + '' + '# for (var fi = 0; fi < formats.length; fi++) { #' + '# var format = formats[fi]; #' + '' + '# } #' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '# for (var fi = 0; fi < fonts.length; fi++) { #' + '# var font = fonts[fi]; #' + '' + '# if (font.bold) { #' + '' + '# } #' + '# if (font.italic) { #' + '' + '# } #' + '# if (font.underline) { #' + '' + '# } #' + '# if (font.color) { #' + '' + '# } else { #' + '' + '# } #' + '# if (font.fontSize) { #' + '' + '# } else { #' + '' + '# } #' + '# if (font.fontName) { #' + '' + '# } else { #' + '' + '' + '# } #' + '' + '' + '# } #' + '' + '' + '' + '' + '# for (var fi = 0; fi < fills.length; fi++) { #' + '# var fill = fills[fi]; #' + '# if (fill.background) { #' + '' + '' + '' + '' + '' + '# } #' + '# } #' + '' + '' + '' + '' + '' + '' + '# for (var si = 0; si < styles.length; si++) { #' + '# var style = styles[si]; #' + '' + '# if (style.hAlign || style.vAlign || style.wrap) { #' + '' + '# } #' + '' + '# } #' + '' + '' + '' + ''); function numChar(colIndex) { var letter = Math.floor(colIndex / 26) - 1; return (letter >= 0 ? numChar(letter) : "") + String.fromCharCode(65 + (colIndex % 26)); } function ref(rowIndex, colIndex) { return numChar(colIndex) + (rowIndex + 1); } var DATE_EPOCH = kendo.timezone.remove(new Date(1900, 0, 0), "Etc/UTC"); var Worksheet = kendo.Class.extend({ init: function(options, sharedStrings, styles) { this.options = options; this._strings = sharedStrings; this._styles = styles; this._mergeCells = []; }, toXML: function() { var rows = this.options.rows || []; var filter = this.options.filter; var spans = {}; this._maxCellIndex = 0; return WORKSHEET({ freezePane: this.options.freezePane, columns: this.options.columns, data: $.map(rows, $.proxy(this._row, this, rows, spans)), mergeCells: this._mergeCells, filter: filter ? { from: ref(0, filter.from), to: ref(0, filter.to) } : null }); }, _row: function(rows, spans, row, rowIndex) { if (this._cellIndex && this._cellIndex > this._maxCellIndex) { this._maxCellIndex = this._cellIndex; } this._cellIndex = 0; var cell; var data = []; var cells = row.cells; for (var idx = 0, length = cells.length; idx < length; idx ++) { cell = this._cell(cells[idx], spans, rowIndex); if (cell) { data = data.concat(cell); } } var columnInfo; while (this._cellIndex < this._maxCellIndex) { columnInfo = spans[this._cellIndex]; if (columnInfo) { columnInfo.rowSpan -= 1; } data.push({ ref: ref(rowIndex, this._cellIndex) }); this._cellIndex++; } return { data: data }; }, _lookupString: function(value) { var key = "$" + value; var index = this._strings.indexes[key]; if (index !== undefined) { value = index; } else { value = this._strings.indexes[key] = this._strings.uniqueCount; this._strings.uniqueCount ++; } this._strings.count ++; return value; }, _lookupStyle: function(style) { var json = kendo.stringify(style); if (json == "{}") { return 0; } var index = $.inArray(json, this._styles); if (index < 0) { index = this._styles.push(json) - 1; } // There is one default style return index + 1; }, _cell: function(data, spans, rowIndex) { if (!data) { this._cellIndex++; return; } var value = data.value; var style = { bold: data.bold, color: data.color, background: data.background, italic: data.italic, underline: data.underline, fontName: data.fontName, fontSize: data.fontSize, format: data.format, hAlign: data.hAlign, vAlign: data.vAlign, wrap: data.wrap }; var columns = this.options.columns || []; var column = columns[this._cellIndex]; if (column && column.autoWidth) { column.width = Math.max(column.width || 0, ("" + value).length); } var type = typeof value; if (type === "string") { value = this._lookupString(value); type = "s"; } else if (type === "number") { type = "n"; } else if (type === "boolean") { type = "b"; value = +value; } else if (value && value.getTime) { type = null; value = (kendo.timezone.remove(value, "Etc/UTC") - DATE_EPOCH) / kendo.date.MS_PER_DAY + 1; if (!style.format) { style.format = "mm-dd-yy"; } } else { type = null; value = ""; } style = this._lookupStyle(style); var cells = []; var colSpanLength, cellRef; var columnInfo = spans[this._cellIndex] || {}; while (columnInfo.rowSpan > 1) { columnInfo.rowSpan -= 1; colSpanLength = columnInfo.colSpan; while(colSpanLength > 0) { cells.push({ ref: ref(rowIndex, this._cellIndex) }); colSpanLength--; this._cellIndex++; } columnInfo = spans[this._cellIndex] || {}; } cellRef = ref(rowIndex, this._cellIndex); cells.push({ value: value, type: type, style: style, ref: cellRef }); var colSpan = data.colSpan || 1; var rowSpan = data.rowSpan || 1; if (colSpan > 1 || rowSpan > 1) { if (rowSpan > 1) { spans[this._cellIndex] = { colSpan: colSpan, rowSpan: rowSpan }; } for (var ci = 1; ci < colSpan; ci++) { this._cellIndex++; cells.push({ ref: ref(rowIndex, this._cellIndex) }); } this._mergeCells.push(cellRef + ":" + ref(rowIndex + rowSpan - 1, this._cellIndex)); } this._cellIndex ++; return cells; } }); var defaultFormats = { "General": 0, "0": 1, "0.00": 2, "#,##0": 3, "#,##0.00": 4, "0%": 9, "0.00%": 10, "0.00E+00": 11, "# ?/?": 12, "# ??/??": 13, "mm-dd-yy": 14, "d-mmm-yy": 15, "d-mmm": 16, "mmm-yy": 17, "h:mm AM/PM": 18, "h:mm:ss AM/PM": 19, "h:mm": 20, "h:mm:ss": 21, "m/d/yy h:mm": 22, "#,##0 ;(#,##0)": 37, "#,##0 ;[Red](#,##0)": 38, "#,##0.00;(#,##0.00)": 39, "#,##0.00;[Red](#,##0.00)": 40, "mm:ss": 45, "[h]:mm:ss": 46, "mmss.0": 47, "##0.0E+0": 48, "@": 49, "[$-404]e/m/d": 27, "m/d/yy": 30, "t0": 59, "t0.00": 60, "t#,##0": 61, "t#,##0.00": 62, "t0%": 67, "t0.00%": 68, "t# ?/?": 69, "t# ??/??": 70 }; function convertColor(color) { if (color.length < 6) { color = color.replace(/(\w)/g, function($0, $1) { return $1 + $1; }); } color = color.substring(1).toUpperCase(); if (color.length < 8) { color = "FF" + color; } return color; } var Workbook = kendo.Class.extend({ init: function(options) { this.options = options || {}; this._strings = { indexes: {}, count: 0, uniqueCount: 0 }; this._styles = []; this._sheets = $.map(this.options.sheets || [], $.proxy(function(options) { return new Worksheet(options, this._strings, this._styles); }, this)); }, toDataURL: function() { if (typeof JSZip === "undefined") { throw new Error("JSZip not found. Check http://docs.telerik.com/kendo-ui/framework/excel/introduction#requirements for more details."); } var zip = new JSZip(); var docProps = zip.folder("docProps"); docProps.file("core.xml", CORE({ creator: this.options.creator || "Kendo UI", lastModifiedBy: this.options.creator || "Kendo UI", created: this.options.date || new Date().toJSON(), modified: this.options.date || new Date().toJSON() })); var sheetCount = this._sheets.length; docProps.file("app.xml", APP({ sheets: this._sheets })); var rels = zip.folder("_rels"); rels.file(".rels", RELS); var xl = zip.folder("xl"); var xlRels = xl.folder("_rels"); xlRels.file("workbook.xml.rels", WORKBOOK_RELS({ count: sheetCount })); xl.file("workbook.xml", WORKBOOK({ sheets: this._sheets })); var worksheets = xl.folder("worksheets"); for (var idx = 0; idx < sheetCount; idx++) { worksheets.file(kendo.format("sheet{0}.xml", idx+1), this._sheets[idx].toXML()); } var styles = $.map(this._styles, $.parseJSON); var hasFont = function(style) { return style.underline || style.bold || style.italic || style.color || style.fontName || style.fontSize; }; var fonts = $.map(styles, function(style) { if (style.color) { style.color = convertColor(style.color); } if (hasFont(style)) { return style; } }); var formats = $.map(styles, function(style) { if (style.format && defaultFormats[style.format] === undefined) { return style; } }); var fills = $.map(styles, function(style) { if (style.background) { style.background = convertColor(style.background); return style; } }); xl.file("styles.xml", STYLES({ fonts: fonts, fills: fills, formats: formats, styles: $.map(styles, function(style) { var result = {}; if (hasFont(style)) { result.fontId = $.inArray(style, fonts) + 1; } if (style.background) { result.fillId = $.inArray(style, fills) + 2; } result.hAlign = style.hAlign; result.vAlign = style.vAlign; result.wrap = style.wrap; if (style.format) { if (defaultFormats[style.format] !== undefined) { result.numFmtId = defaultFormats[style.format]; } else { result.numFmtId = 165 + $.inArray(style, formats); } } return result; }) })); xl.file("sharedStrings.xml", SHARED_STRINGS(this._strings)); zip.file("[Content_Types].xml", CONTENT_TYPES( { count: sheetCount })); return "data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64," + zip.generate({ compression: "DEFLATE" }); } }); kendo.ooxml = { Workbook: Workbook, Worksheet: Worksheet }; })(kendo); (function($, kendo){ kendo.ExcelExporter = kendo.Class.extend({ init: function(options) { options.columns = this._trimColumns(options.columns || []); this.allColumns = $.map(this._leafColumns(options.columns || []), this._prepareColumn); this.columns = $.grep(this.allColumns, function(column) { return !column.hidden; }); this.options = options; var dataSource = options.dataSource; if (dataSource instanceof kendo.data.DataSource) { this.dataSource = new dataSource.constructor($.extend( {}, dataSource.options, { page: options.allPages ? 0 : dataSource.page(), filter: dataSource.filter(), pageSize: options.allPages ? dataSource.total() : dataSource.pageSize(), sort: dataSource.sort(), group: dataSource.group(), aggregate: dataSource.aggregate() })); var data = dataSource.data(); if (data.length > 0) { this.dataSource.data(data.toJSON()); } } else { this.dataSource = kendo.data.DataSource.create(dataSource); } }, _trimColumns: function(columns) { var that = this; return $.grep(columns, function(column) { var result = !(!column.field); if (!result && column.columns) { result = that._trimColumns(column.columns).length > 0; } return result; }); }, _leafColumns: function(columns) { var result = []; for (var idx = 0; idx < columns.length; idx++) { if (!columns[idx].columns) { result.push(columns[idx]); continue; } result = result.concat(this._leafColumns(columns[idx].columns)); } return result; }, workbook: function() { return $.Deferred($.proxy(function(d) { this.dataSource.fetch() .then($.proxy(function() { var workbook = { sheets: [ { columns: this._columns(), rows: this._rows(), freezePane: this._freezePane(), filter: this._filter() } ] }; d.resolve(workbook, this.dataSource.view()); }, this)); }, this)).promise(); }, _prepareColumn: function(column) { if (!column.field) { return; } var value = function(dataItem) { return dataItem.get(column.field); }; var values = null; if (column.values) { values = {}; $.each(column.values, function(item) { values[this.value] = this.text; }); value = function(dataItem) { return values[dataItem.get(column.field)]; }; } return $.extend({}, column, { value: value, values: values, groupHeaderTemplate: kendo.template(column.groupHeaderTemplate || "${title}: ${value}"), groupFooterTemplate: column.groupFooterTemplate ? kendo.template(column.groupFooterTemplate) : null, footerTemplate: column.footerTemplate ? kendo.template(column.footerTemplate) : null }); }, _filter: function() { if (!this.options.filterable) { return null; } var depth = this._depth(); return { from: depth, to: depth + this.columns.length - 1 }; }, _dataRows: function(dataItems, level) { var depth = this._depth(); var rows = $.map(dataItems, $.proxy(function(dataItem) { if (this._hierarchical()) { level = this.dataSource.level(dataItem) + 1; } var cells = $.map(new Array(level), function() { return { background: "#dfdfdf", color: "#333" }; }); // grouped if (depth && dataItem.items) { var column = $.grep(this.allColumns, function(column) { return column.field == dataItem.field; })[0]; var title = column && column.title ? column.title : dataItem.field; var template = column ? column.groupHeaderTemplate : null; var value = title + ": " + dataItem.value; var group = $.extend({ title: title, field: dataItem.field, value: column && column.values? column.values[dataItem.value] : dataItem.value, aggregates: dataItem.aggregates }, dataItem.aggregates[dataItem.field]); if (template) { value = template(group); } cells.push( { value: value, background: "#dfdfdf", color: "#333", colSpan: this.columns.length + depth - level } ); var rows = this._dataRows(dataItem.items, level + 1); rows.unshift({ type: "group-header", cells: cells }); return rows.concat(this._footer(dataItem, level+1)); } else { var dataCells = $.map(this.columns, $.proxy(this._cell, this, dataItem)); if (this._hierarchical()) { dataCells[0].colSpan = depth - level + 1; } return { type: "data", cells: cells.concat(dataCells) }; } }, this)); return rows; }, _footer: function(dataItem, level) { var rows = []; var footer = false; var cells = $.map(this.columns, function(column) { if (column.groupFooterTemplate) { footer = true; return { background: "#dfdfdf", color: "#333", value: column.groupFooterTemplate(dataItem.aggregates[column.field]) }; } else { return { background: "#dfdfdf", color: "#333" }; } }); if (footer) { rows.push({ type: "group-footer", cells: $.map(new Array(level), function() { return { background: "#dfdfdf", color: "#333" }; }).concat(cells) }); } return rows; }, _isColumnVisible: function(column) { return this._visibleColumns([column]).length > 0 && (column.field || column.columns); }, _visibleColumns: function(columns) { var that = this; return $.grep(columns, function(column) { var result = !column.hidden; if (result && column.columns) { result = that._visibleColumns(column.columns).length > 0; } return result; }); }, _headerRow: function(row, groups) { var headers = $.map(row.cells, function(cell) { return { background: "#7a7a7a", color: "#fff", value: cell.title, colSpan: cell.colSpan > 1 ? cell.colSpan : 1, rowSpan: row.rowSpan > 1 && !cell.colSpan ? row.rowSpan : 1 }; }); if (this._hierarchical()) { headers[0].colSpan = this._depth() + 1; } return { type: "header", cells: $.map(new Array(groups.length), function() { return { background: "#7a7a7a", color: "#fff" }; }).concat(headers) }; }, _prependHeaderRows: function(rows) { var groups = this.dataSource.group(); var headerRows = [{ rowSpan: 1, cells: [], index: 0 }]; this._prepareHeaderRows(headerRows, this.options.columns); for (var idx = headerRows.length - 1; idx >= 0; idx--) { rows.unshift(this._headerRow(headerRows[idx], groups)); } }, _prepareHeaderRows: function(rows, columns, parentCell, parentRow) { var row = parentRow || rows[rows.length - 1]; var childRow = rows[row.index + 1]; var totalColSpan = 0; var column; var cell; for (var idx = 0; idx < columns.length; idx++) { column = columns[idx]; if (this._isColumnVisible(column)) { cell = { title: column.title || column.field, colSpan: 0 }; row.cells.push(cell); if (column.columns && column.columns.length) { if (!childRow) { childRow = { rowSpan: 0, cells: [], index: rows.length }; rows.push(childRow); } cell.colSpan = this._trimColumns(this._visibleColumns(column.columns)).length; this._prepareHeaderRows(rows, column.columns, cell, childRow); totalColSpan += cell.colSpan - 1; row.rowSpan = rows.length - row.index; } } } if (parentCell) { parentCell.colSpan += totalColSpan; } }, _rows: function() { var groups = this.dataSource.group(); var rows = this._dataRows(this.dataSource.view(), 0); if (this.columns.length) { this._prependHeaderRows(rows); var footer = false; var cells = $.map(this.columns, $.proxy(function(column) { if (column.footerTemplate) { footer = true; var aggregates = this.dataSource.aggregates(); var ctx = aggregates[column.field] || {}; ctx.data = aggregates; return { background: "#dfdfdf", color: "#333", value: column.footerTemplate(ctx) }; } else { return { background: "#dfdfdf", color: "#333" }; } }, this)); if (footer) { rows.push({ type: "footer", cells: $.map(new Array(groups.length), function() { return { background: "#dfdfdf", color: "#333" }; }).concat(cells) }); } } return rows; }, _headerDepth: function(columns) { var result = 1; var max = 0; for (var idx = 0; idx < columns.length; idx++) { if (columns[idx].columns) { var temp = this._headerDepth(columns[idx].columns); if (temp > max) { max = temp; } } } return result + max; }, _freezePane: function() { var columns = this._visibleColumns(this.options.columns || []); var colSplit = this._trimColumns(this._leafColumns($.grep(columns, function(column) { return column.locked; }))).length; return { rowSplit: this._headerDepth(columns), colSplit: colSplit? colSplit + this.dataSource.group().length : 0 }; }, _cell: function(dataItem, column) { return { value: column.value(dataItem) }; }, _hierarchical: function() { return this.options.hierarchy && this.dataSource.level; }, _depth: function() { var dataSource = this.dataSource; var depth = 0; var view, i, level; if (this._hierarchical()) { view = dataSource.view(); for (i = 0; i < view.length; i++) { level = dataSource.level(view[i]); if (level > depth) { depth = level; } } depth++; } else { depth = dataSource.group().length; } return depth; }, _columns: function() { var depth = this._depth(); var columns = $.map(new Array(depth), function() { return { width: 20 }; }); return columns.concat($.map(this.columns, function(column) { return { width: parseInt(column.width, 10), autoWidth: column.width ? false : true }; })); } }); kendo.ExcelMixin = { extend: function(proto) { proto.events.push("excelExport"); proto.options.excel = $.extend(proto.options.excel, this.options); proto.saveAsExcel = this.saveAsExcel; }, options: { proxyURL: "", allPages: false, filterable: false, fileName: "Export.xlsx" }, saveAsExcel: function() { var excel = this.options.excel || {}; var exporter = new kendo.ExcelExporter({ columns: this.columns, dataSource: this.dataSource, allPages: excel.allPages, filterable: excel.filterable, hierarchy: excel.hierarchy }); exporter.workbook().then($.proxy(function(book, data) { if (!this.trigger("excelExport", { workbook: book, data: data })) { var workbook = new kendo.ooxml.Workbook(book); kendo.saveAs({ dataURI: workbook.toDataURL(), fileName: book.fileName || excel.fileName, proxyURL: excel.proxyURL, forceProxy: excel.forceProxy }); } }, this)); } }; })(kendo.jQuery, kendo); (function($) { var transport = kendo.data.RemoteTransport.extend({ init: function (options) { var signalr = options && options.signalr ? options.signalr : {}; var promise = signalr.promise; if (!promise) { throw new Error('The "promise" option must be set.'); } if (typeof promise.done != "function" || typeof promise.fail != "function") { throw new Error('The "promise" option must be a Promise.'); } this.promise = promise; var hub = signalr.hub; if (!hub) { throw new Error('The "hub" option must be set.'); } if (typeof hub.on != "function" || typeof hub.invoke != "function") { throw new Error('The "hub" option is not a valid SignalR hub proxy.'); } this.hub = hub; kendo.data.RemoteTransport.fn.init.call(this, options); }, push: function(callbacks) { var client = this.options.signalr.client || {}; if (client.create) { this.hub.on(client.create, callbacks.pushCreate); } if (client.update) { this.hub.on(client.update, callbacks.pushUpdate); } if (client.destroy) { this.hub.on(client.destroy, callbacks.pushDestroy); } }, _crud: function(options, type) { var hub = this.hub; var server = this.options.signalr.server; if (!server || !server[type]) { throw new Error(kendo.format('The "server.{0}" option must be set.', type)); } var args = [server[type]]; var data = this.parameterMap(options.data, type); if (!$.isEmptyObject(data)) { args.push(data); } this.promise.done(function() { hub.invoke.apply(hub, args) .done(options.success) .fail(options.error); }); }, read: function(options) { this._crud(options, "read"); }, create: function(options) { this._crud(options, "create"); }, update: function(options) { this._crud(options, "update"); }, destroy: function(options) { this._crud(options, "destroy"); } }); $.extend(true, kendo.data, { transports: { signalr: transport } }); })(window.kendo.jQuery); (function ($, parseFloat, parseInt) { var Color = function(value) { var color = this, formats = Color.formats, re, processor, parts, i, channels; if (arguments.length === 1) { value = color.resolveColor(value); for (i = 0; i < formats.length; i++) { re = formats[i].re; processor = formats[i].process; parts = re.exec(value); if (parts) { channels = processor(parts); color.r = channels[0]; color.g = channels[1]; color.b = channels[2]; } } } else { color.r = arguments[0]; color.g = arguments[1]; color.b = arguments[2]; } color.r = color.normalizeByte(color.r); color.g = color.normalizeByte(color.g); color.b = color.normalizeByte(color.b); }; Color.prototype = { toHex: function() { var color = this, pad = color.padDigit, r = color.r.toString(16), g = color.g.toString(16), b = color.b.toString(16); return "#" + pad(r) + pad(g) + pad(b); }, resolveColor: function(value) { value = value || "black"; if (value.charAt(0) == "#") { value = value.substr(1, 6); } value = value.replace(/ /g, ""); value = value.toLowerCase(); value = Color.namedColors[value] || value; return value; }, normalizeByte: function(value) { return (value < 0 || isNaN(value)) ? 0 : ((value > 255) ? 255 : value); }, padDigit: function(value) { return (value.length === 1) ? "0" + value : value; }, brightness: function(value) { var color = this, round = Math.round; color.r = round(color.normalizeByte(color.r * value)); color.g = round(color.normalizeByte(color.g * value)); color.b = round(color.normalizeByte(color.b * value)); return color; }, percBrightness: function() { var color = this; return Math.sqrt(0.241 * color.r * color.r + 0.691 * color.g * color.g + 0.068 * color.b * color.b); } }; Color.formats = [{ re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, process: function(parts) { return [ parseInt(parts[1], 10), parseInt(parts[2], 10), parseInt(parts[3], 10) ]; } }, { re: /^(\w{2})(\w{2})(\w{2})$/, process: function(parts) { return [ parseInt(parts[1], 16), parseInt(parts[2], 16), parseInt(parts[3], 16) ]; } }, { re: /^(\w{1})(\w{1})(\w{1})$/, process: function(parts) { return [ parseInt(parts[1] + parts[1], 16), parseInt(parts[2] + parts[2], 16), parseInt(parts[3] + parts[3], 16) ]; } } ]; Color.namedColors = { aqua: "00ffff", azure: "f0ffff", beige: "f5f5dc", black: "000000", blue: "0000ff", brown: "a52a2a", coral: "ff7f50", cyan: "00ffff", darkblue: "00008b", darkcyan: "008b8b", darkgray: "a9a9a9", darkgreen: "006400", darkorange: "ff8c00", darkred: "8b0000", dimgray: "696969", fuchsia: "ff00ff", gold: "ffd700", goldenrod: "daa520", gray: "808080", green: "008000", greenyellow: "adff2f", indigo: "4b0082", ivory: "fffff0", khaki: "f0e68c", lightblue: "add8e6", lightgrey: "d3d3d3", lightgreen: "90ee90", lightpink: "ffb6c1", lightyellow: "ffffe0", lime: "00ff00", limegreen: "32cd32", linen: "faf0e6", magenta: "ff00ff", maroon: "800000", mediumblue: "0000cd", navy: "000080", olive: "808000", orange: "ffa500", orangered: "ff4500", orchid: "da70d6", pink: "ffc0cb", plum: "dda0dd", purple: "800080", red: "ff0000", royalblue: "4169e1", salmon: "fa8072", silver: "c0c0c0", skyblue: "87ceeb", slateblue: "6a5acd", slategray: "708090", snow: "fffafa", steelblue: "4682b4", tan: "d2b48c", teal: "008080", tomato: "ff6347", turquoise: "40e0d0", violet: "ee82ee", wheat: "f5deb3", white: "ffffff", whitesmoke: "f5f5f5", yellow: "ffff00", yellowgreen: "9acd32" }; // Tools from ColorPicker ================================================= var namedColorRegexp = [ "transparent" ]; for (var i in Color.namedColors) { if (Color.namedColors.hasOwnProperty(i)) { namedColorRegexp.push(i); } } namedColorRegexp = new RegExp("^(" + namedColorRegexp.join("|") + ")(\\W|$)", "i"); /*jshint eqnull:true */ function parseColor(color, nothrow) { var m, ret; if (color == null || color == "none") { return null; } if (color instanceof _Color) { return color; } color = color.toLowerCase(); if ((m = namedColorRegexp.exec(color))) { if (m[1] == "transparent") { color = new _RGB(1, 1, 1, 0); } else { color = parseColor(Color.namedColors[m[1]], nothrow); } color.match = [ m[1] ]; return color; } if ((m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i.exec(color))) { ret = new _Bytes(parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16), 1); } else if ((m = /^#?([0-9a-f])([0-9a-f])([0-9a-f])/i.exec(color))) { ret = new _Bytes(parseInt(m[1] + m[1], 16), parseInt(m[2] + m[2], 16), parseInt(m[3] + m[3], 16), 1); } else if ((m = /^rgb\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/.exec(color))) { ret = new _Bytes(parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10), 1); } else if ((m = /^rgba\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9.]+)\s*\)/.exec(color))) { ret = new _Bytes(parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10), parseFloat(m[4])); } else if ((m = /^rgb\(\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*\)/.exec(color))) { ret = new _RGB(parseFloat(m[1]) / 100, parseFloat(m[2]) / 100, parseFloat(m[3]) / 100, 1); } else if ((m = /^rgba\(\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9.]+)\s*\)/.exec(color))) { ret = new _RGB(parseFloat(m[1]) / 100, parseFloat(m[2]) / 100, parseFloat(m[3]) / 100, parseFloat(m[4])); } if (ret) { ret.match = m; } else if (!nothrow) { throw new Error("Cannot parse color: " + color); } return ret; } function hex(n, width, pad) { if (!pad) { pad = "0"; } n = n.toString(16); while (width > n.length) { n = "0" + n; } return n; } var _Color = kendo.Class.extend({ toHSV: function() { return this; }, toRGB: function() { return this; }, toHex: function() { return this.toBytes().toHex(); }, toBytes: function() { return this; }, toCss: function() { return "#" + this.toHex(); }, toCssRgba: function() { var rgb = this.toBytes(); return "rgba(" + rgb.r + ", " + rgb.g + ", " + rgb.b + ", " + parseFloat((+this.a).toFixed(3)) + ")"; }, toDisplay: function() { if (kendo.support.browser.msie && kendo.support.browser.version < 9) { return this.toCss(); // no RGBA support; does it support any opacity in colors? } return this.toCssRgba(); }, equals: function(c) { return c === this || c !== null && this.toCssRgba() == parseColor(c).toCssRgba(); }, diff: function(c2) { if (c2 == null) { return NaN; } var c1 = this.toBytes(); c2 = c2.toBytes(); return Math.sqrt(Math.pow((c1.r - c2.r) * 0.30, 2) + Math.pow((c1.g - c2.g) * 0.59, 2) + Math.pow((c1.b - c2.b) * 0.11, 2)); }, clone: function() { var c = this.toBytes(); if (c === this) { c = new _Bytes(c.r, c.g, c.b, c.a); } return c; } }); var _RGB = _Color.extend({ init: function(r, g, b, a) { this.r = r; this.g = g; this.b = b; this.a = a; }, toHSV: function() { var min, max, delta, h, s, v; var r = this.r, g = this.g, b = this.b; min = Math.min(r, g, b); max = Math.max(r, g, b); v = max; delta = max - min; if (delta === 0) { return new _HSV(0, 0, v, this.a); } if (max !== 0) { s = delta / max; if (r == max) { h = (g - b) / delta; } else if (g == max) { h = 2 + (b - r) / delta; } else { h = 4 + (r - g) / delta; } h *= 60; if (h < 0) { h += 360; } } else { s = 0; h = -1; } return new _HSV(h, s, v, this.a); }, toBytes: function() { return new _Bytes(this.r * 255, this.g * 255, this.b * 255, this.a); } }); var _Bytes = _RGB.extend({ init: function(r, g, b, a) { this.r = Math.round(r); this.g = Math.round(g); this.b = Math.round(b); this.a = a; }, toRGB: function() { return new _RGB(this.r / 255, this.g / 255, this.b / 255, this.a); }, toHSV: function() { return this.toRGB().toHSV(); }, toHex: function() { return hex(this.r, 2) + hex(this.g, 2) + hex(this.b, 2); }, toBytes: function() { return this; } }); var _HSV = _Color.extend({ init: function(h, s, v, a) { this.h = h; this.s = s; this.v = v; this.a = a; }, toRGB: function() { var h = this.h, s = this.s, v = this.v; var i, r, g, b, f, p, q, t; if (s === 0) { r = g = b = v; } else { h /= 60; i = Math.floor(h); f = h - i; p = v * (1 - s); q = v * (1 - s * f); t = v * (1 - s * (1 - f)); switch (i) { case 0 : r = v; g = t; b = p; break; case 1 : r = q; g = v; b = p; break; case 2 : r = p; g = v; b = t; break; case 3 : r = p; g = q; b = v; break; case 4 : r = t; g = p; b = v; break; default : r = v; g = p; b = q; break; } } return new _RGB(r, g, b, this.a); }, toBytes: function() { return this.toRGB().toBytes(); } }); Color.fromBytes = function(r, g, b, a) { return new _Bytes(r, g, b, a != null ? a : 1); }; Color.fromRGB = function(r, g, b, a) { return new _RGB(r, g, b, a != null ? a : 1); }; Color.fromHSV = function(h, s, v, a) { return new _HSV(h, s, v, a != null ? a : 1); }; // Exports ================================================================ kendo.Color = Color; kendo.parseColor = parseColor; })(window.kendo.jQuery, parseFloat, parseInt); (function ($) { // Imports ================================================================ var math = Math, kendo = window.kendo, deepExtend = kendo.deepExtend, dataviz = kendo.dataviz; // Constants var DEG_TO_RAD = math.PI / 180, MAX_NUM = Number.MAX_VALUE, MIN_NUM = -Number.MAX_VALUE, UNDEFINED = "undefined", inArray = $.inArray, push = [].push, pop = [].pop, splice = [].splice, shift = [].shift, slice = [].slice, unshift = [].unshift; // Generic utility functions ============================================== function defined(value) { return typeof value !== UNDEFINED; } function round(value, precision) { var power = pow(precision); return math.round(value * power) / power; } // Extracted from round to get on the V8 "fast path" function pow(p) { if (p) { return math.pow(10, p); } else { return 1; } } function limitValue(value, min, max) { return math.max(math.min(value, max), min); } function rad(degrees) { return degrees * DEG_TO_RAD; } function deg(radians) { return radians / DEG_TO_RAD; } function isNumber(val) { return typeof val === "number" && !isNaN(val); } function valueOrDefault(value, defaultValue) { return defined(value) ? value : defaultValue; } function sqr(value) { return value * value; } function objectKey(object) { var parts = []; for (var key in object) { parts.push(key + object[key]); } return parts.sort().join(""); } // Computes FNV-1 hash // See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function function hashKey(str) { // 32-bit FNV-1 offset basis // See http://isthe.com/chongo/tech/comp/fnv/#FNV-param var hash = 0x811C9DC5; for (var i = 0; i < str.length; ++i) { hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24); hash ^= str.charCodeAt(i); } return hash >>> 0; } function hashObject(object) { return hashKey(objectKey(object)); } var now = Date.now; if (!now) { now = function() { return new Date().getTime(); } } // Array helpers ========================================================== function arrayLimits(arr) { var length = arr.length, i, min = MAX_NUM, max = MIN_NUM; for (i = 0; i < length; i ++) { max = math.max(max, arr[i]); min = math.min(min, arr[i]); } return { min: min, max: max }; } function arrayMin(arr) { return arrayLimits(arr).min; } function arrayMax(arr) { return arrayLimits(arr).max; } function sparseArrayMin(arr) { return sparseArrayLimits(arr).min; } function sparseArrayMax(arr) { return sparseArrayLimits(arr).max; } function sparseArrayLimits(arr) { var min = MAX_NUM, max = MIN_NUM; for (var i = 0, length = arr.length; i < length; i++) { var n = arr[i]; if (n !== null && isFinite(n)) { min = math.min(min, n); max = math.max(max, n); } } return { min: min === MAX_NUM ? undefined : min, max: max === MIN_NUM ? undefined : max }; } function last(array) { if (array) { return array[array.length - 1]; } } function append(first, second) { first.push.apply(first, second); return first; } // Template helpers ======================================================= function renderTemplate(text) { return kendo.template(text, { useWithBlock: false, paramName: "d" }); } function renderAttr(name, value) { return (defined(value) && value !== null) ? " " + name + "='" + value + "' " : ""; } function renderAllAttr(attrs) { var output = ""; for (var i = 0; i < attrs.length; i++) { output += renderAttr(attrs[i][0], attrs[i][1]); } return output; } function renderStyle(attrs) { var output = ""; for (var i = 0; i < attrs.length; i++) { var value = attrs[i][1]; if (defined(value)) { output += attrs[i][0] + ":" + value + ";"; } } if (output !== "") { return output; } } function renderSize(size) { if (typeof size !== "string") { size += "px"; } return size; } function renderPos(pos) { var result = []; if (pos) { var parts = kendo.toHyphens(pos).split("-"); for (var i = 0; i < parts.length; i++) { result.push("k-pos-" + parts[i]); } } return result.join(" "); } function isTransparent(color) { return color === "" || color === null || color === "none" || color === "transparent" || !defined(color); } // Exports ================================================================ deepExtend(kendo, { util: { MAX_NUM: MAX_NUM, MIN_NUM: MIN_NUM, append: append, arrayLimits: arrayLimits, arrayMin: arrayMin, arrayMax: arrayMax, defined: defined, deg: deg, hashKey: hashKey, hashObject: hashObject, isNumber: isNumber, isTransparent: isTransparent, last: last, limitValue: limitValue, now: now, objectKey: objectKey, round: round, rad: rad, renderAttr: renderAttr, renderAllAttr: renderAllAttr, renderPos: renderPos, renderSize: renderSize, renderStyle: renderStyle, renderTemplate: renderTemplate, sparseArrayLimits: sparseArrayLimits, sparseArrayMin: sparseArrayMin, sparseArrayMax: sparseArrayMax, sqr: sqr, valueOrDefault: valueOrDefault } }); kendo.dataviz.util = kendo.util; })(window.kendo.jQuery); (function ($) { // Imports ================================================================ var kendo = window.kendo, deepExtend = kendo.deepExtend, fromCharCode = String.fromCharCode; // Constants var KEY_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; // Generic utility functions ============================================== function encodeBase64(input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = encodeUTF8(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + KEY_STR.charAt(enc1) + KEY_STR.charAt(enc2) + KEY_STR.charAt(enc3) + KEY_STR.charAt(enc4); } return output; } function encodeUTF8(input) { input = input.replace(/\r\n/g,"\n"); var output = ""; for (var i = 0; i < input.length; i++) { var c = input.charCodeAt(i); if (c < 0x80) { // One byte output += fromCharCode(c); } else if(c < 0x800) { // Two bytes output += fromCharCode(0xC0 | (c >>> 6)); output += fromCharCode(0x80 | (c & 0x3f)); } else if (c < 0x10000) { // Three bytes output += fromCharCode(0xE0 | (c >>> 12)); output += fromCharCode(0x80 | (c >>> 6 & 0x3f)); output += fromCharCode(0x80 | (c & 0x3f)); } } return output; } // Exports ================================================================ deepExtend(kendo.util, { encodeBase64: encodeBase64, encodeUTF8: encodeUTF8 }); })(window.kendo.jQuery); (function ($) { // Imports ================================================================ var math = Math, kendo = window.kendo, deepExtend = kendo.deepExtend, inArray = $.inArray; // Mixins ================================================================= var ObserversMixin = { observers: function() { this._observers = this._observers || []; return this._observers; }, addObserver: function(element) { if (!this._observers) { this._observers = [element]; } else { this._observers.push(element); } return this; }, removeObserver: function(element) { var observers = this.observers(); var index = inArray(element, observers); if (index != -1) { observers.splice(index, 1); } return this; }, trigger: function(methodName, event) { var observers = this._observers; var observer; var idx; if (observers && !this._suspended) { for (idx = 0; idx < observers.length; idx++) { observer = observers[idx]; if (observer[methodName]) { observer[methodName](event); } } } return this; }, optionsChange: function(e) { this.trigger("optionsChange", e); }, geometryChange: function(e) { this.trigger("geometryChange", e); }, suspend: function() { this._suspended = (this._suspended || 0) + 1; return this; }, resume: function() { this._suspended = math.max((this._suspended || 0) - 1, 0); return this; }, _observerField: function(field, value) { if (this[field]) { this[field].removeObserver(this); } this[field] = value; value.addObserver(this); } }; // Exports ================================================================ deepExtend(kendo, { mixins: { ObserversMixin: ObserversMixin } }); })(window.kendo.jQuery); (function ($) { // Imports ================================================================ var math = Math, pow = math.pow, inArray = $.inArray, kendo = window.kendo, Class = kendo.Class, deepExtend = kendo.deepExtend, ObserversMixin = kendo.mixins.ObserversMixin, util = kendo.util, defined = util.defined, rad = util.rad, deg = util.deg, round = util.round; var PI_DIV_2 = math.PI / 2, MIN_NUM = util.MIN_NUM, MAX_NUM = util.MAX_NUM; // Geometrical primitives ================================================= var Point = Class.extend({ init: function(x, y) { this.x = x || 0; this.y = y || 0; }, equals: function(other) { return other && other.x === this.x && other.y === this.y; }, clone: function() { return new Point(this.x, this.y); }, rotate: function(angle, origin) { return this.transform( transform().rotate(angle, origin) ); }, translate: function(x, y) { this.x += x; this.y += y; this.geometryChange(); return this; }, translateWith: function(point) { return this.translate(point.x, point.y); }, move: function(x, y) { this.x = this.y = 0; return this.translate(x, y); }, scale: function(scaleX, scaleY) { if (!defined(scaleY)) { scaleY = scaleX; } this.x *= scaleX; this.y *= scaleY; this.geometryChange(); return this; }, scaleCopy: function(scaleX, scaleY) { return this.clone().scale(scaleX, scaleY); }, transform: function(transformation) { var mx = toMatrix(transformation), x = this.x, y = this.y; this.x = mx.a * x + mx.c * y + mx.e; this.y = mx.b * x + mx.d * y + mx.f; this.geometryChange(); return this; }, transformCopy: function(transformation) { var point = this.clone(); if (transformation) { point.transform(transformation); } return point; }, distanceTo: function(point) { var dx = this.x - point.x; var dy = this.y - point.y; return math.sqrt(dx * dx + dy * dy); }, round: function(digits) { this.x = round(this.x, digits); this.y = round(this.y, digits); this.geometryChange(); return this; }, toArray: function(digits) { var doRound = defined(digits); var x = doRound ? round(this.x, digits) : this.x; var y = doRound ? round(this.y, digits) : this.y; return [x, y]; } }); defineAccessors(Point.fn, ["x", "y"]); deepExtend(Point.fn, ObserversMixin); // IE < 9 doesn't allow to override toString on definition Point.fn.toString = function(digits, separator) { var x = this.x, y = this.y; if (defined(digits)) { x = round(x, digits); y = round(y, digits); } separator = separator || " "; return x + separator + y; }; Point.create = function(arg0, arg1) { if (defined(arg0)) { if (arg0 instanceof Point) { return arg0; } else if (arguments.length === 1 && arg0.length === 2) { return new Point(arg0[0], arg0[1]); } else { return new Point(arg0, arg1); } } }; Point.min = function() { var minX = util.MAX_NUM; var minY = util.MAX_NUM; for (var i = 0; i < arguments.length; i++) { var pt = arguments[i]; minX = math.min(pt.x, minX); minY = math.min(pt.y, minY); } return new Point(minX, minY); }; Point.max = function(p0, p1) { var maxX = util.MIN_NUM; var maxY = util.MIN_NUM; for (var i = 0; i < arguments.length; i++) { var pt = arguments[i]; maxX = math.max(pt.x, maxX); maxY = math.max(pt.y, maxY); } return new Point(maxX, maxY); }; Point.minPoint = function() { return new Point(MIN_NUM, MIN_NUM); }; Point.maxPoint = function() { return new Point(MAX_NUM, MAX_NUM); }; Point.ZERO = new Point(0, 0); var Size = Class.extend({ init: function(width, height) { this.width = width || 0; this.height = height || 0; }, equals: function(other) { return other && other.width === this.width && other.height === this.height; }, clone: function() { return new Size(this.width, this.height); }, toArray: function(digits) { var doRound = defined(digits); var width = doRound ? round(this.width, digits) : this.width; var height = doRound ? round(this.height, digits) : this.height; return [width, height]; } }); defineAccessors(Size.fn, ["width", "height"]); deepExtend(Size.fn, ObserversMixin); Size.create = function(arg0, arg1) { if (defined(arg0)) { if (arg0 instanceof Size) { return arg0; } else if (arguments.length === 1 && arg0.length === 2) { return new Size(arg0[0], arg0[1]); } else { return new Size(arg0, arg1); } } }; Size.ZERO = new Size(0, 0); var Rect = Class.extend({ init: function(origin, size) { this.setOrigin(origin || new Point()); this.setSize(size || new Size()); }, clone: function() { return new Rect( this.origin.clone(), this.size.clone() ); }, equals: function(other) { return other && other.origin.equals(this.origin) && other.size.equals(this.size); }, setOrigin: function(value) { this._observerField("origin", Point.create(value)); this.geometryChange(); return this; }, getOrigin: function() { return this.origin; }, setSize: function(value) { this._observerField("size", Size.create(value)); this.geometryChange(); return this; }, getSize: function() { return this.size; }, width: function() { return this.size.width; }, height: function() { return this.size.height; }, topLeft: function() { return this.origin.clone(); }, bottomRight: function() { return this.origin.clone().translate(this.width(), this.height()); }, topRight: function() { return this.origin.clone().translate(this.width(), 0); }, bottomLeft: function() { return this.origin.clone().translate(0, this.height()); }, center: function() { return this.origin.clone().translate(this.width() / 2, this.height() / 2); }, bbox: function(matrix) { var tl = this.topLeft().transformCopy(matrix); var tr = this.topRight().transformCopy(matrix); var br = this.bottomRight().transformCopy(matrix); var bl = this.bottomLeft().transformCopy(matrix); return Rect.fromPoints(tl, tr, br, bl); } }); deepExtend(Rect.fn, ObserversMixin); Rect.fromPoints = function() { var topLeft = Point.min.apply(this, arguments); var bottomRight = Point.max.apply(this, arguments); var size = new Size( bottomRight.x - topLeft.x, bottomRight.y - topLeft.y ); return new Rect(topLeft, size); }; Rect.union = function(a, b) { return Rect.fromPoints( Point.min(a.topLeft(), b.topLeft()), Point.max(a.bottomRight(), b.bottomRight()) ); }; Rect.intersect = function(a, b) { a = { left : a.topLeft().x, top : a.topLeft().y, right : a.bottomRight().x, bottom : a.bottomRight().y }; b = { left : b.topLeft().x, top : b.topLeft().y, right : b.bottomRight().x, bottom : b.bottomRight().y }; if (a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom) { return Rect.fromPoints( new Point(math.max(a.left, b.left), math.max(a.top, b.top)), new Point(math.min(a.right, b.right), math.min(a.bottom, b.bottom)) ); } }; var Circle = Class.extend({ init: function(center, radius) { this.setCenter(center || new Point()); this.setRadius(radius || 0); }, setCenter: function(value) { this._observerField("center", Point.create(value)); this.geometryChange(); return this; }, getCenter: function() { return this.center; }, equals: function(other) { return other && other.center.equals(this.center) && other.radius === this.radius; }, clone: function() { return new Circle(this.center.clone(), this.radius); }, pointAt: function(angle) { return this._pointAt(rad(angle)); }, bbox: function(matrix) { var minPoint = Point.maxPoint(); var maxPoint = Point.minPoint(); var extremeAngles = ellipseExtremeAngles(this.center, this.radius, this.radius, matrix); for (var i = 0; i < 4; i++) { var currentPointX = this._pointAt(extremeAngles.x + i * PI_DIV_2).transformCopy(matrix); var currentPointY = this._pointAt(extremeAngles.y + i * PI_DIV_2).transformCopy(matrix); var currentPoint = new Point(currentPointX.x, currentPointY.y); minPoint = Point.min(minPoint, currentPoint); maxPoint = Point.max(maxPoint, currentPoint); } // TODO: Let fromPoints figure out the min/max return Rect.fromPoints(minPoint, maxPoint); }, _pointAt: function(angle) { var c = this.center; var r = this.radius; return new Point( c.x - r * math.cos(angle), c.y - r * math.sin(angle) ); } }); defineAccessors(Circle.fn, ["radius"]); deepExtend(Circle.fn, ObserversMixin); var Arc = Class.extend({ init: function(center, options) { this.setCenter(center || new Point()); options = options || {}; this.radiusX = options.radiusX; this.radiusY = options.radiusY || options.radiusX; this.startAngle = options.startAngle; this.endAngle = options.endAngle; this.anticlockwise = options.anticlockwise || false; }, // TODO: clone, equals clone: function() { return new Arc(this.center, { radiusX: this.radiusX, radiusY: this.radiusY, startAngle: this.startAngle, endAngle: this.endAngle, anticlockwise: this.anticlockwise }); }, setCenter: function(value) { this._observerField("center", Point.create(value)); this.geometryChange(); return this; }, getCenter: function() { return this.center; }, MAX_INTERVAL: 45, pointAt: function(angle) { var center = this.center; var radian = rad(angle); return new Point( center.x + this.radiusX * math.cos(radian), center.y + this.radiusY * math.sin(radian) ); }, // TODO: Review, document curvePoints: function() { var startAngle = this.startAngle; var endAngle = this.endAngle; var dir = this.anticlockwise ? -1 : 1; var curvePoints = [this.pointAt(startAngle)]; var currentAngle = startAngle; var interval = this._arcInterval(); var intervalAngle = interval.endAngle - interval.startAngle; var subIntervalsCount = math.ceil(intervalAngle / this.MAX_INTERVAL); var subIntervalAngle = intervalAngle / subIntervalsCount; for (var i = 1; i <= subIntervalsCount; i++) { var nextAngle = currentAngle + dir * subIntervalAngle; var points = this._intervalCurvePoints(currentAngle, nextAngle); curvePoints.push(points.cp1, points.cp2, points.p2); currentAngle = nextAngle; } return curvePoints; }, bbox: function(matrix) { var arc = this; var interval = arc._arcInterval(); var startAngle = interval.startAngle; var endAngle = interval.endAngle; var extremeAngles = ellipseExtremeAngles(this.center, this.radiusX, this.radiusY, matrix); var extremeX = deg(extremeAngles.x); var extremeY = deg(extremeAngles.y); var currentPoint = arc.pointAt(startAngle).transformCopy(matrix); var endPoint = arc.pointAt(endAngle).transformCopy(matrix); var minPoint = Point.min(currentPoint, endPoint); var maxPoint = Point.max(currentPoint, endPoint); var currentAngleX = bboxStartAngle(extremeX, startAngle); var currentAngleY = bboxStartAngle(extremeY, startAngle); while (currentAngleX < endAngle || currentAngleY < endAngle) { var currentPointX; if (currentAngleX < endAngle) { currentPointX = arc.pointAt(currentAngleX).transformCopy(matrix); currentAngleX += 90; } var currentPointY; if (currentAngleY < endAngle) { currentPointY = arc.pointAt(currentAngleY).transformCopy(matrix); currentAngleY += 90; } currentPoint = new Point(currentPointX.x, currentPointY.y); minPoint = Point.min(minPoint, currentPoint); maxPoint = Point.max(maxPoint, currentPoint); } // TODO: Let fromPoints figure out the min/max return Rect.fromPoints(minPoint, maxPoint); }, _arcInterval: function() { var startAngle = this.startAngle; var endAngle = this.endAngle; var anticlockwise = this.anticlockwise; if (anticlockwise) { var oldStart = startAngle; startAngle = endAngle; endAngle = oldStart; } if (startAngle > endAngle || (anticlockwise && startAngle === endAngle)) { endAngle += 360; } return { startAngle: startAngle, endAngle: endAngle }; }, _intervalCurvePoints: function(startAngle, endAngle) { var arc = this; var p1 = arc.pointAt(startAngle); var p2 = arc.pointAt(endAngle); var p1Derivative = arc._derivativeAt(startAngle); var p2Derivative = arc._derivativeAt(endAngle); var t = (rad(endAngle) - rad(startAngle)) / 3; var cp1 = new Point(p1.x + t * p1Derivative.x, p1.y + t * p1Derivative.y); var cp2 = new Point(p2.x - t * p2Derivative.x, p2.y - t * p2Derivative.y); return { p1: p1, cp1: cp1, cp2: cp2, p2: p2 }; }, _derivativeAt: function(angle) { var arc = this; var radian = rad(angle); return new Point(-arc.radiusX * math.sin(radian), arc.radiusY * math.cos(radian)); } }); defineAccessors(Arc.fn, ["radiusX", "radiusY", "startAngle", "endAngle", "anticlockwise"]); deepExtend(Arc.fn, ObserversMixin); Arc.fromPoints = function(start, end, rx, ry, largeArc, swipe) { var arcParameters = normalizeArcParameters(start.x, start.y, end.x, end.y, rx, ry, largeArc, swipe); return new Arc(arcParameters.center, { startAngle: arcParameters.startAngle, endAngle: arcParameters.endAngle, radiusX: rx, radiusY: ry, anticlockwise: swipe === 0 }); }; var Matrix = Class.extend({ init: function (a, b, c, d, e, f) { this.a = a || 0; this.b = b || 0; this.c = c || 0; this.d = d || 0; this.e = e || 0; this.f = f || 0; }, multiplyCopy: function (m) { return new Matrix( this.a * m.a + this.c * m.b, this.b * m.a + this.d * m.b, this.a * m.c + this.c * m.d, this.b * m.c + this.d * m.d, this.a * m.e + this.c * m.f + this.e, this.b * m.e + this.d * m.f + this.f ); }, clone: function() { return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f); }, equals: function(other) { if (!other) { return false; } return this.a === other.a && this.b === other.b && this.c === other.c && this.d === other.d && this.e === other.e && this.f === other.f; }, round: function(precision) { this.a = round(this.a, precision); this.b = round(this.b, precision); this.c = round(this.c, precision); this.d = round(this.d, precision); this.e = round(this.e, precision); this.f = round(this.f, precision); return this; }, toArray: function(precision) { var arr = [this.a, this.b, this.c, this.d, this.e, this.f]; if (defined(precision)) { for (var i = 0; i < arr.length; i++) { arr[i] = round(arr[i], precision); } } return arr; } }); Matrix.fn.toString = function(precision, separator) { return this.toArray(precision).join(separator || ","); }; Matrix.translate = function (x, y) { return new Matrix(1, 0, 0, 1, x, y); }; Matrix.unit = function () { return new Matrix(1, 0, 0, 1, 0, 0); }; Matrix.rotate = function (angle, x, y) { var m = new Matrix(); m.a = math.cos(rad(angle)); m.b = math.sin(rad(angle)); m.c = -m.b; m.d = m.a; m.e = (x - x * m.a + y * m.b) || 0; m.f = (y - y * m.a - x * m.b) || 0; return m; }; Matrix.scale = function (scaleX, scaleY) { return new Matrix(scaleX, 0, 0, scaleY, 0, 0); }; Matrix.IDENTITY = Matrix.unit(); var Transformation = Class.extend({ init: function(matrix) { this._matrix = matrix || Matrix.unit(); }, clone: function() { return new Transformation( this._matrix.clone() ); }, equals: function(other) { return other && other._matrix.equals(this._matrix); }, _optionsChange: function() { this.optionsChange({ field: "transform", value: this }); }, translate: function(x, y) { this._matrix = this._matrix.multiplyCopy(Matrix.translate(x, y)); this._optionsChange(); return this; }, scale: function(scaleX, scaleY, origin) { if (!defined(scaleY)) { scaleY = scaleX; } if (origin) { origin = Point.create(origin); this._matrix = this._matrix.multiplyCopy(Matrix.translate(origin.x, origin.y)); } this._matrix = this._matrix.multiplyCopy(Matrix.scale(scaleX, scaleY)); if (origin) { this._matrix = this._matrix.multiplyCopy(Matrix.translate(-origin.x, -origin.y)); } this._optionsChange(); return this; }, rotate: function(angle, origin) { origin = Point.create(origin) || Point.ZERO; this._matrix = this._matrix.multiplyCopy(Matrix.rotate(angle, origin.x, origin.y)); this._optionsChange(); return this; }, multiply: function(transformation) { var matrix = toMatrix(transformation); this._matrix = this._matrix.multiplyCopy(matrix); this._optionsChange(); return this; }, matrix: function() { return this._matrix; } }); deepExtend(Transformation.fn, ObserversMixin); function transform(matrix) { if (matrix === null) { return null; } if (matrix instanceof Transformation) { return matrix; } return new Transformation(matrix); } function toMatrix(value) { if (value && kendo.isFunction(value.matrix)) { return value.matrix(); } return value; } // Helper functions ======================================================= function ellipseExtremeAngles(center, rx, ry, matrix) { var extremeX = 0, extremeY = 0; if (matrix) { extremeX = math.atan2(matrix.c * ry, matrix.a * rx); if (matrix.b !== 0) { extremeY = math.atan2(matrix.d * ry, matrix.b * rx); } } return { x: extremeX, y: extremeY }; } function bboxStartAngle(angle, start) { while(angle < start) { angle += 90; } return angle; } function defineAccessors(fn, fields) { for (var i = 0; i < fields.length; i++) { var name = fields[i]; var capitalized = name.charAt(0).toUpperCase() + name.substring(1, name.length); fn["set" + capitalized] = setAccessor(name); fn["get" + capitalized] = getAccessor(name); } } function setAccessor(field) { return function(value) { if (this[field] !== value) { this[field] = value; this.geometryChange(); } return this; }; } function getAccessor(field) { return function() { return this[field]; }; } function elipseAngle(start, end, swipe) { if (start > end) { end += 360; } var alpha = math.abs(end - start); if (!swipe) { alpha = 360 - alpha; } return alpha; } function calculateAngle(cx, cy, rx, ry, x, y) { var cos = round((x - cx) / rx, 3); var sin = round((y - cy) / ry, 3); return round(deg(math.atan2(sin, cos))); } function normalizeArcParameters(x1, y1, x2, y2, rx, ry, largeArc, swipe) { var cx, cy; var cx1, cy1; var a, b, c, sqrt; if (y1 !== y2) { var x21 = x2 - x1; var y21 = y2 - y1; var rx2 = pow(rx, 2), ry2 = pow(ry, 2); var k = (ry2 * x21 * (x1 + x2) + rx2 * y21 * (y1 + y2)) / (2 * rx2 * y21); var yk2 = k - y2; var l = -(x21 * ry2) / (rx2 * y21); a = 1 / rx2 + pow(l, 2) / ry2; b = 2 * ((l * yk2) / ry2 - x2 / rx2); c = pow(x2, 2) / rx2 + pow(yk2, 2) / ry2 - 1; sqrt = math.sqrt(pow(b, 2) - 4 * a * c); cx = (-b - sqrt) / (2 * a); cy = k + l * cx; cx1 = (-b + sqrt) / (2 * a); cy1 = k + l * cx1; } else if (x1 !== x2) { b = - 2 * y2; c = pow(((x2 - x1) * ry) / (2 * rx), 2) + pow(y2, 2) - pow(ry, 2); sqrt = math.sqrt(pow(b, 2) - 4 * c); cx = cx1 = (x1 + x2) / 2; cy = (-b - sqrt) / 2; cy1 = (-b + sqrt) / 2; } else { return false; } var start = calculateAngle(cx, cy, rx, ry, x1, y1); var end = calculateAngle(cx, cy, rx, ry, x2, y2); var alpha = elipseAngle(start, end, swipe); if ((largeArc && alpha <= 180) || (!largeArc && alpha > 180)) { cx = cx1; cy = cy1; start = calculateAngle(cx, cy, rx, ry, x1, y1); end = calculateAngle(cx, cy, rx, ry, x2, y2); } return { center: new Point(cx, cy), startAngle: start, endAngle: end }; } // Exports ================================================================ deepExtend(kendo, { geometry: { Arc: Arc, Circle: Circle, Matrix: Matrix, Point: Point, Rect: Rect, Size: Size, Transformation: Transformation, transform: transform, toMatrix: toMatrix } }); kendo.dataviz.geometry = kendo.geometry; })(window.kendo.jQuery); (function ($) { // Imports ================================================================ var doc = document, noop = $.noop, toString = Object.prototype.toString, kendo = window.kendo, Class = kendo.Class, Widget = kendo.ui.Widget, deepExtend = kendo.deepExtend, util = kendo.util, defined = util.defined; // Base drawing surface ================================================== var Surface = kendo.Observable.extend({ init: function(element, options) { kendo.Observable.fn.init.call(this); this.options = deepExtend({}, this.options, options); this.bind(this.events, this.options); this._click = this._handler("click"); this._mouseenter = this._handler("mouseenter"); this._mouseleave = this._handler("mouseleave"); this.element = $(element); if (this.options.width) { this.element.css("width", this.options.width); } if (this.options.height) { this.element.css("height", this.options.height); } }, options: { }, events: [ "click", "mouseenter", "mouseleave", "resize" ], draw: noop, clear: noop, destroy: noop, resize: Widget.fn.resize, size: Widget.fn.size, getSize: function() { return { width: this.element.width(), height: this.element.height() }; }, setSize: function(size) { this.element.css({ width: size.width, height: size.height }); this._size = size; this._resize(); }, eventTarget: function(e) { var domNode = $(e.touch ? e.touch.initialTouch : e.target); var node; while (!node && domNode.length > 0) { node = domNode[0]._kendoNode; if (domNode.is(this.element) || domNode.length === 0) { break; } domNode = domNode.parent(); } if (node) { return node.srcElement; } }, _resize: noop, _handler: function(event) { var surface = this; return function(e) { var node = surface.eventTarget(e); if (node) { surface.trigger(event, { element: node, originalEvent: e }); } }; } }); Surface.create = function(element, options) { return SurfaceFactory.current.create(element, options); }; // Base surface node ===================================================== var BaseNode = Class.extend({ init: function(srcElement) { this.childNodes = []; this.parent = null; if (srcElement) { this.srcElement = srcElement; this.observe(); } }, destroy: function() { if (this.srcElement) { this.srcElement.removeObserver(this); } var children = this.childNodes; for (var i = 0; i < children.length; i++) { this.childNodes[i].destroy(); } this.parent = null; }, load: noop, observe: function() { if (this.srcElement) { this.srcElement.addObserver(this); } }, append: function(node) { this.childNodes.push(node); node.parent = this; }, insertAt: function(node, pos) { this.childNodes.splice(pos, 0, node); node.parent = this; }, remove: function(index, count) { var end = index + count; for (var i = index; i < end; i++) { this.childNodes[i].removeSelf(); } this.childNodes.splice(index, count); }, removeSelf: function() { this.clear(); this.destroy(); }, clear: function() { this.remove(0, this.childNodes.length); }, invalidate: function() { if (this.parent) { this.parent.invalidate(); } }, geometryChange: function() { this.invalidate(); }, optionsChange: function() { this.invalidate(); }, childrenChange: function(e) { if (e.action === "add") { this.load(e.items, e.index); } else if (e.action === "remove") { this.remove(e.index, e.items.length); } this.invalidate(); } }); // Options storage with optional observer ============================= var OptionsStore = Class.extend({ init: function(options, prefix) { var field, member; this.prefix = prefix || ""; for (field in options) { member = options[field]; member = this._wrap(member, field); this[field] = member; } }, get: function(field) { return kendo.getter(field, true)(this); }, set: function(field, value) { var current = kendo.getter(field, true)(this); if (current !== value) { var composite = this._set(field, this._wrap(value, field)); if (!composite) { this.optionsChange({ field: this.prefix + field, value: value }); } } }, _set: function(field, value) { var composite = field.indexOf(".") >= 0; if (composite) { var parts = field.split("."), path = "", obj; while (parts.length > 1) { path += parts.shift(); obj = kendo.getter(path, true)(this); if (!obj) { obj = new OptionsStore({}, path + "."); obj.addObserver(this); this[path] = obj; } if (obj instanceof OptionsStore) { obj.set(parts.join("."), value); return composite; } path += "."; } } this._clear(field); kendo.setter(field)(this, value); return composite; }, _clear: function(field) { var current = kendo.getter(field, true)(this); if (current && current.removeObserver) { current.removeObserver(this); } }, _wrap: function(object, field) { var type = toString.call(object); if (object !== null && defined(object) && type === "[object Object]") { if (!(object instanceof OptionsStore) && !(object instanceof Class)) { object = new OptionsStore(object, this.prefix + field + "."); } object.addObserver(this); } return object; } }); deepExtend(OptionsStore.fn, kendo.mixins.ObserversMixin); var SurfaceFactory = function() { this._items = []; }; SurfaceFactory.prototype = { register: function(name, type, order) { var items = this._items, first = items[0], entry = { name: name, type: type, order: order }; if (!first || order < first.order) { items.unshift(entry); } else { items.push(entry); } }, create: function(element, options) { var items = this._items, match = items[0]; if (options && options.type) { var preferred = options.type.toLowerCase(); for (var i = 0; i < items.length; i++) { if (items[i].name === preferred) { match = items[i]; break; } } } if (match) { return new match.type(element, options); } kendo.logToConsole( "Warning: Unable to create Kendo UI Drawing Surface. Possible causes:\n" + "- The browser does not support SVG, VML and Canvas. User agent: " + navigator.userAgent + "\n" + "- The Kendo UI scripts are not fully loaded"); } }; SurfaceFactory.current = new SurfaceFactory(); // Exports ================================================================ deepExtend(kendo, { drawing: { DASH_ARRAYS: { dot: [1.5, 3.5], dash: [4, 3.5], longdash: [8, 3.5], dashdot: [3.5, 3.5, 1.5, 3.5], longdashdot: [8, 3.5, 1.5, 3.5], longdashdotdot: [8, 3.5, 1.5, 3.5, 1.5, 3.5] }, Color: kendo.Color, BaseNode: BaseNode, OptionsStore: OptionsStore, Surface: Surface, SurfaceFactory: SurfaceFactory } }); kendo.dataviz.drawing = kendo.drawing; })(window.kendo.jQuery); (function ($) { // Imports ================================================================ var kendo = window.kendo, deepExtend = kendo.deepExtend, defined = kendo.util.defined; // Constants ============================================================== var GRADIENT = "gradient"; // Mixins ================================================================= var Paintable = { extend: function(proto) { proto.fill = this.fill; proto.stroke = this.stroke; }, fill: function(color, opacity) { var options = this.options; if (defined(color)) { if (color && color.nodeType != GRADIENT) { var newFill = { color: color }; if (defined(opacity)) { newFill.opacity = opacity; } options.set("fill", newFill); } else { options.set("fill", color); } return this; } else { return options.get("fill"); } }, stroke: function(color, width, opacity) { if (defined(color)) { this.options.set("stroke.color", color); if (defined(width)) { this.options.set("stroke.width", width); } if (defined(opacity)) { this.options.set("stroke.opacity", opacity); } return this; } else { return this.options.get("stroke"); } } }; var Traversable = { extend: function(proto, childrenField) { proto.traverse = function(callback) { var children = this[childrenField]; for (var i = 0; i < children.length; i++) { var child = children[i]; if (child.traverse) { child.traverse(callback); } else { callback(child); } } return this; }; } }; // Exports ================================================================ deepExtend(kendo.drawing, { mixins: { Paintable: Paintable, Traversable: Traversable } }); })(window.kendo.jQuery); (function ($) { // Imports ================================================================= var doc = document, kendo = window.kendo, Class = kendo.Class, deepExtend = kendo.deepExtend, util = kendo.util, defined = util.defined; // Constants =============================================================== var BASELINE_MARKER_SIZE = 1; // Text metrics calculations =============================================== var LRUCache = Class.extend({ init: function(size) { this._size = size; this._length = 0; this._map = {}; }, put: function(key, value) { var lru = this, map = lru._map, entry = { key: key, value: value }; map[key] = entry; if (!lru._head) { lru._head = lru._tail = entry; } else { lru._tail.newer = entry; entry.older = lru._tail; lru._tail = entry; } if (lru._length >= lru._size) { map[lru._head.key] = null; lru._head = lru._head.newer; lru._head.older = null; } else { lru._length++; } }, get: function(key) { var lru = this, entry = lru._map[key]; if (entry) { if (entry === lru._head && entry !== lru._tail) { lru._head = entry.newer; lru._head.older = null; } if (entry !== lru._tail) { if (entry.older) { entry.older.newer = entry.newer; entry.newer.older = entry.older; } entry.older = lru._tail; entry.newer = null; lru._tail.newer = entry; lru._tail = entry; } return entry.value; } } }); var TextMetrics = Class.extend({ init: function() { this._cache = new LRUCache(1000); }, measure: function(text, style) { var styleKey = util.objectKey(style), cacheKey = util.hashKey(text + styleKey), cachedResult = this._cache.get(cacheKey); if (cachedResult) { return cachedResult; } var size = { width: 0, height: 0, baseline: 0 }; var measureBox = this._measureBox, baselineMarker = this._baselineMarker.cloneNode(false); for (var key in style) { var value = style[key]; if (defined(value)) { measureBox.style[key] = value; } } measureBox.innerHTML = text; measureBox.appendChild(baselineMarker); doc.body.appendChild(measureBox); if ((text + "").length) { size.width = measureBox.offsetWidth - BASELINE_MARKER_SIZE; size.height = measureBox.offsetHeight; size.baseline = baselineMarker.offsetTop + BASELINE_MARKER_SIZE; } this._cache.put(cacheKey, size); measureBox.parentNode.removeChild(measureBox); return size; } }); TextMetrics.fn._baselineMarker = $("
    ")[0]; TextMetrics.fn._measureBox = $("
    ")[0]; TextMetrics.current = new TextMetrics(); function measureText(text, style) { return TextMetrics.current.measure(text, style); } // Exports ================================================================ deepExtend(kendo.drawing, { util: { TextMetrics: TextMetrics, LRUCache: LRUCache, measureText: measureText } }); })(window.kendo.jQuery); (function ($) { // Imports ================================================================ var kendo = window.kendo, Class = kendo.Class, deepExtend = kendo.deepExtend, g = kendo.geometry, Point = g.Point, Rect = g.Rect, Size = g.Size, Matrix = g.Matrix, toMatrix = g.toMatrix, drawing = kendo.drawing, OptionsStore = drawing.OptionsStore, math = Math, pow = math.pow, util = kendo.util, append = util.append, arrayLimits = util.arrayLimits, defined = util.defined, last = util.last, valueOrDefault = util.valueOrDefault, ObserversMixin = kendo.mixins.ObserversMixin, inArray = $.inArray, push = [].push, pop = [].pop, splice = [].splice, shift = [].shift, slice = [].slice, unshift = [].unshift, defId = 1; // Drawing primitives ===================================================== var Element = Class.extend({ nodeType: "Element", init: function(options) { this._initOptions(options); }, _initOptions: function(options) { options = options || {}; var transform = options.transform; var clip = options.clip; if (transform) { options.transform = g.transform(transform); } if (clip && !clip.id) { clip.id = generateDefinitionId(); } this.options = new OptionsStore(options); this.options.addObserver(this); }, transform: function(transform) { if (defined(transform)) { this.options.set("transform", g.transform(transform)); } else { return this.options.get("transform"); } }, parentTransform: function() { var element = this, transformation, matrix, parentMatrix; while (element.parent) { element = element.parent; transformation = element.transform(); if (transformation) { parentMatrix = transformation.matrix().multiplyCopy(parentMatrix || Matrix.unit()); } } if (parentMatrix) { return g.transform(parentMatrix); } }, currentTransform: function(parentTransform) { var elementTransform = this.transform(), elementMatrix = toMatrix(elementTransform), parentMatrix, combinedMatrix; if (!defined(parentTransform)) { parentTransform = this.parentTransform(); } parentMatrix = toMatrix(parentTransform); if (elementMatrix && parentMatrix) { combinedMatrix = parentMatrix.multiplyCopy(elementMatrix); } else { combinedMatrix = elementMatrix || parentMatrix; } if (combinedMatrix) { return g.transform(combinedMatrix); } }, visible: function(visible) { if (defined(visible)) { this.options.set("visible", visible); return this; } else { return this.options.get("visible") !== false; } }, clip: function(clip) { var options = this.options; if (defined(clip)) { if (clip && !clip.id) { clip.id = generateDefinitionId(); } options.set("clip", clip); return this; } else { return options.get("clip"); } }, opacity: function(value) { if (defined(value)) { this.options.set("opacity", value); return this; } else { return valueOrDefault(this.options.get("opacity"), 1); } }, clippedBBox: function(transformation) { var box = this._clippedBBox(transformation); if (box) { var clip = this.clip(); return clip ? Rect.intersect(box, clip.bbox(transformation)) : box; } }, _clippedBBox: function(transformation) { return this.bbox(transformation); } }); deepExtend(Element.fn, ObserversMixin); var ElementsArray = Class.extend({ init: function(array) { array = array || []; this.length = 0; this._splice(0, array.length, array); }, elements: function(elements) { if (elements) { this._splice(0, this.length, elements); this._change(); return this; } else { return this.slice(0); } }, push: function() { var elements = arguments; var result = push.apply(this, elements); this._add(elements); return result; }, slice: slice, pop: function() { var length = this.length; var result = pop.apply(this); if (length) { this._remove([result]); } return result; }, splice: function(index, howMany) { var elements = slice.call(arguments, 2); var result = this._splice(index, howMany, elements); this._change(); return result; }, shift: function() { var length = this.length; var result = shift.apply(this); if (length) { this._remove([result]); } return result; }, unshift: function() { var elements = arguments; var result = unshift.apply(this, elements); this._add(elements); return result; }, indexOf: function(element) { var that = this; var idx; var length; for (idx = 0, length = that.length; idx < length; idx++) { if (that[idx] === element) { return idx; } } return -1; }, _splice: function(index, howMany, elements) { var result = splice.apply(this, [index, howMany].concat(elements)); this._clearObserver(result); this._setObserver(elements); return result; }, _add: function(elements) { this._setObserver(elements); this._change(); }, _remove: function(elements) { this._clearObserver(elements); this._change(); }, _setObserver: function(elements) { for (var idx = 0; idx < elements.length; idx++) { elements[idx].addObserver(this); } }, _clearObserver: function(elements) { for (var idx = 0; idx < elements.length; idx++) { elements[idx].removeObserver(this); } }, _change: function() {} }); deepExtend(ElementsArray.fn, ObserversMixin); var Group = Element.extend({ nodeType: "Group", init: function(options) { Element.fn.init.call(this, options); this.children = []; }, childrenChange: function(action, items, index) { this.trigger("childrenChange",{ action: action, items: items, index: index }); }, append: function() { append(this.children, arguments); this._reparent(arguments, this); this.childrenChange("add", arguments); return this; }, insertAt: function(element, index) { this.children.splice(index, 0, element); element.parent = this; this.childrenChange("add", [element], index); return this; }, remove: function(element) { var index = inArray(element, this.children); if (index >= 0) { this.children.splice(index, 1); element.parent = null; this.childrenChange("remove", [element], index); } return this; }, removeAt: function(index) { if (0 <= index && index < this.children.length) { var element = this.children[index]; this.children.splice(index, 1); element.parent = null; this.childrenChange("remove", [element], index); } return this; }, clear: function() { var items = this.children; this.children = []; this._reparent(items, null); this.childrenChange("remove", items, 0); return this; }, bbox: function(transformation) { return elementsBoundingBox(this.children, true, this.currentTransform(transformation)); }, rawBBox: function() { return elementsBoundingBox(this.children, false); }, _clippedBBox: function(transformation) { return elementsClippedBoundingBox(this.children, this.currentTransform(transformation)); }, currentTransform: function(transformation) { return Element.fn.currentTransform.call(this, transformation) || null; }, _reparent: function(elements, newParent) { for (var i = 0; i < elements.length; i++) { var child = elements[i]; var parent = child.parent; if (parent && parent != this && parent.remove) { parent.remove(child); } child.parent = newParent; } } }); drawing.mixins.Traversable.extend(Group.fn, "children"); var Text = Element.extend({ nodeType: "Text", init: function(content, position, options) { Element.fn.init.call(this, options); this.content(content); this.position(position || new g.Point()); if (!this.options.font) { this.options.font = "12px sans-serif"; } if (!defined(this.options.fill)) { this.fill("#000"); } }, content: function(value) { if (defined(value)) { this.options.set("content", value); return this; } else { return this.options.get("content"); } }, measure: function() { var metrics = drawing.util.measureText(this.content(), { font: this.options.get("font") }); return metrics; }, rect: function() { var size = this.measure(); var pos = this.position().clone(); return new g.Rect(pos, [size.width, size.height]); }, bbox: function(transformation) { var combinedMatrix = toMatrix(this.currentTransform(transformation)); return this.rect().bbox(combinedMatrix); }, rawBBox: function() { return this.rect().bbox(); } }); drawing.mixins.Paintable.extend(Text.fn); definePointAccessors(Text.fn, ["position"]); var Circle = Element.extend({ nodeType: "Circle", init: function(geometry, options) { Element.fn.init.call(this, options); this.geometry(geometry || new g.Circle()); if (!defined(this.options.stroke)) { this.stroke("#000"); } }, bbox: function(transformation) { var combinedMatrix = toMatrix(this.currentTransform(transformation)); var rect = this._geometry.bbox(combinedMatrix); var strokeWidth = this.options.get("stroke.width"); if (strokeWidth) { expandRect(rect, strokeWidth / 2); } return rect; }, rawBBox: function() { return this._geometry.bbox(); } }); drawing.mixins.Paintable.extend(Circle.fn); defineGeometryAccessors(Circle.fn, ["geometry"]); var Arc = Element.extend({ nodeType: "Arc", init: function(geometry, options) { Element.fn.init.call(this, options); this.geometry(geometry || new g.Arc()); if (!defined(this.options.stroke)) { this.stroke("#000"); } }, bbox: function(transformation) { var combinedMatrix = toMatrix(this.currentTransform(transformation)); var rect = this.geometry().bbox(combinedMatrix); var strokeWidth = this.options.get("stroke.width"); if (strokeWidth) { expandRect(rect, strokeWidth / 2); } return rect; }, rawBBox: function() { return this.geometry().bbox(); }, toPath: function() { var path = new Path(); var curvePoints = this.geometry().curvePoints(); if (curvePoints.length > 0) { path.moveTo(curvePoints[0].x, curvePoints[0].y); for (var i = 1; i < curvePoints.length; i+=3) { path.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]); } } return path; } }); drawing.mixins.Paintable.extend(Arc.fn); defineGeometryAccessors(Arc.fn, ["geometry"]); var GeometryElementsArray = ElementsArray.extend({ _change: function() { this.geometryChange(); } }); var Segment = Class.extend({ init: function(anchor, controlIn, controlOut) { this.anchor(anchor || new Point()); this.controlIn(controlIn); this.controlOut(controlOut); }, bboxTo: function(toSegment, matrix) { var rect; var segmentAnchor = this.anchor().transformCopy(matrix); var toSegmentAnchor = toSegment.anchor().transformCopy(matrix); if (this.controlOut() && toSegment.controlIn()) { rect = this._curveBoundingBox( segmentAnchor, this.controlOut().transformCopy(matrix), toSegment.controlIn().transformCopy(matrix), toSegmentAnchor ); } else { rect = this._lineBoundingBox(segmentAnchor, toSegmentAnchor); } return rect; }, _lineBoundingBox: function(p1, p2) { return Rect.fromPoints(p1, p2); }, _curveBoundingBox: function(p1, cp1, cp2, p2) { var points = [p1, cp1, cp2, p2], extremesX = this._curveExtremesFor(points, "x"), extremesY = this._curveExtremesFor(points, "y"), xLimits = arrayLimits([extremesX.min, extremesX.max, p1.x, p2.x]), yLimits = arrayLimits([extremesY.min, extremesY.max, p1.y, p2.y]); return Rect.fromPoints(new Point(xLimits.min, yLimits.min), new Point(xLimits.max, yLimits.max)); }, _curveExtremesFor: function(points, field) { var extremes = this._curveExtremes( points[0][field], points[1][field], points[2][field], points[3][field] ); return { min: this._calculateCurveAt(extremes.min, field, points), max: this._calculateCurveAt(extremes.max, field, points) }; }, _calculateCurveAt: function (t, field, points) { var t1 = 1- t; return pow(t1, 3) * points[0][field] + 3 * pow(t1, 2) * t * points[1][field] + 3 * pow(t, 2) * t1 * points[2][field] + pow(t, 3) * points[3][field]; }, _curveExtremes: function (x1, x2, x3, x4) { var a = x1 - 3 * x2 + 3 * x3 - x4; var b = - 2 * (x1 - 2 * x2 + x3); var c = x1 - x2; var sqrt = math.sqrt(b * b - 4 * a * c); var t1 = 0; var t2 = 1; if (a === 0) { if (b !== 0) { t1 = t2 = -c / b; } } else if (!isNaN(sqrt)) { t1 = (- b + sqrt) / (2 * a); t2 = (- b - sqrt) / (2 * a); } var min = math.max(math.min(t1, t2), 0); if (min < 0 || min > 1) { min = 0; } var max = math.min(math.max(t1, t2), 1); if (max > 1 || max < 0) { max = 1; } return { min: min, max: max }; } }); definePointAccessors(Segment.fn, ["anchor", "controlIn", "controlOut"]); deepExtend(Segment.fn, ObserversMixin); var Path = Element.extend({ nodeType: "Path", init: function(options) { Element.fn.init.call(this, options); this.segments = new GeometryElementsArray(); this.segments.addObserver(this); if (!defined(this.options.stroke)) { this.stroke("#000"); if (!defined(this.options.stroke.lineJoin)) { this.options.set("stroke.lineJoin", "miter"); } } }, moveTo: function(x, y) { this.suspend(); this.segments.elements([]); this.resume(); this.lineTo(x, y); return this; }, lineTo: function(x, y) { var point = defined(y) ? new Point(x, y) : x, segment = new Segment(point); this.segments.push(segment); return this; }, curveTo: function(controlOut, controlIn, point) { if (this.segments.length > 0) { var lastSegment = last(this.segments); var segment = new Segment(point, controlIn); this.suspend(); lastSegment.controlOut(controlOut); this.resume(); this.segments.push(segment); } return this; }, arc: function(startAngle, endAngle, radiusX, radiusY, anticlockwise) { if (this.segments.length > 0) { var lastSegment = last(this.segments); var anchor = lastSegment.anchor(); var start = util.rad(startAngle); var center = new Point(anchor.x - radiusX * math.cos(start), anchor.y - radiusY * math.sin(start)); var arc = new g.Arc(center, { startAngle: startAngle, endAngle: endAngle, radiusX: radiusX, radiusY: radiusY, anticlockwise: anticlockwise }); this._addArcSegments(arc); } return this; }, arcTo: function(end, rx, ry, largeArc, swipe) { if (this.segments.length > 0) { var lastSegment = last(this.segments); var anchor = lastSegment.anchor(); var arc = g.Arc.fromPoints(anchor, end, rx, ry, largeArc, swipe); this._addArcSegments(arc); } return this; }, _addArcSegments: function(arc) { this.suspend(); var curvePoints = arc.curvePoints(); for (var i = 1; i < curvePoints.length; i+=3) { this.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]); } this.resume(); this.geometryChange(); }, close: function() { this.options.closed = true; this.geometryChange(); return this; }, bbox: function(transformation) { var combinedMatrix = toMatrix(this.currentTransform(transformation)); var boundingBox = this._bbox(combinedMatrix); var strokeWidth = this.options.get("stroke.width"); if (strokeWidth) { expandRect(boundingBox, strokeWidth / 2); } return boundingBox; }, rawBBox: function() { return this._bbox(); }, _bbox: function(matrix) { var segments = this.segments; var length = segments.length; var boundingBox; if (length === 1) { var anchor = segments[0].anchor().transformCopy(matrix); boundingBox = new Rect(anchor, Size.ZERO); } else if (length > 0) { for (var i = 1; i < length; i++) { var segmentBox = segments[i - 1].bboxTo(segments[i], matrix); if (boundingBox) { boundingBox = Rect.union(boundingBox, segmentBox); } else { boundingBox = segmentBox; } } } return boundingBox; } }); drawing.mixins.Paintable.extend(Path.fn); Path.fromRect = function(rect, options) { return new Path(options) .moveTo(rect.topLeft()) .lineTo(rect.topRight()) .lineTo(rect.bottomRight()) .lineTo(rect.bottomLeft()) .close(); }; Path.fromPoints = function(points, options) { if (points) { var path = new Path(options); for (var i = 0; i < points.length; i++) { var pt = Point.create(points[i]); if (pt) { if (i === 0) { path.moveTo(pt); } else { path.lineTo(pt); } } } return path; } }; Path.fromArc = function(arc, options) { var path = new Path(options); var startAngle = arc.startAngle; var start = arc.pointAt(startAngle); path.moveTo(start.x, start.y); path.arc(startAngle, arc.endAngle, arc.radiusX, arc.radiusY, arc.anticlockwise); return path; }; var MultiPath = Element.extend({ nodeType: "MultiPath", init: function(options) { Element.fn.init.call(this, options); this.paths = new GeometryElementsArray(); this.paths.addObserver(this); if (!defined(this.options.stroke)) { this.stroke("#000"); } }, moveTo: function(x, y) { var path = new Path(); path.moveTo(x, y); this.paths.push(path); return this; }, lineTo: function(x, y) { if (this.paths.length > 0) { last(this.paths).lineTo(x, y); } return this; }, curveTo: function(controlOut, controlIn, point) { if (this.paths.length > 0) { last(this.paths).curveTo(controlOut, controlIn, point); } return this; }, arc: function(startAngle, endAngle, radiusX, radiusY, anticlockwise) { if (this.paths.length > 0) { last(this.paths).arc(startAngle, endAngle, radiusX, radiusY, anticlockwise); } return this; }, arcTo: function(end, rx, ry, largeArc, swipe) { if (this.paths.length > 0) { last(this.paths).arcTo(end, rx, ry, largeArc, swipe); } return this; }, close: function() { if (this.paths.length > 0) { last(this.paths).close(); } return this; }, bbox: function(transformation) { return elementsBoundingBox(this.paths, true, this.currentTransform(transformation)); }, rawBBox: function() { return elementsBoundingBox(this.paths, false); }, _clippedBBox: function(transformation) { return elementsClippedBoundingBox(this.paths, this.currentTransform(transformation)); } }); drawing.mixins.Paintable.extend(MultiPath.fn); var Image = Element.extend({ nodeType: "Image", init: function(src, rect, options) { Element.fn.init.call(this, options); this.src(src); this.rect(rect || new g.Rect()); }, src: function(value) { if (defined(value)) { this.options.set("src", value); return this; } else { return this.options.get("src"); } }, bbox: function(transformation) { var combinedMatrix = toMatrix(this.currentTransform(transformation)); return this._rect.bbox(combinedMatrix); }, rawBBox: function() { return this._rect.bbox(); } }); defineGeometryAccessors(Image.fn, ["rect"]); var GradientStop = Class.extend({ init: function(offset, color, opacity) { this.options = new OptionsStore({ offset: offset, color: color, opacity: defined(opacity) ? opacity : 1 }); this.options.addObserver(this); } }); defineOptionsAccessors(GradientStop.fn, ["offset", "color", "opacity"]); deepExtend(GradientStop.fn, ObserversMixin); GradientStop.create = function(arg) { if (defined(arg)) { var stop; if (arg instanceof GradientStop) { stop = arg; } else if (arg.length > 1) { stop = new GradientStop(arg[0], arg[1], arg[2]); } else { stop = new GradientStop(arg.offset, arg.color, arg.opacity); } return stop; } }; var StopsArray = ElementsArray.extend({ _change: function() { this.optionsChange({ field: "stops" }); } }); var Gradient = Class.extend({ nodeType: "gradient", init: function(options) { this.stops = new StopsArray(this._createStops(options.stops)); this.stops.addObserver(this); this._userSpace = options.userSpace; this.id = generateDefinitionId(); }, userSpace: function(value) { if (defined(value)) { this._userSpace = value; this.optionsChange(); return this; } else { return this._userSpace; } }, _createStops: function(stops) { var result = []; var idx; stops = stops || []; for (idx = 0; idx < stops.length; idx++) { result.push(GradientStop.create(stops[idx])); } return result; }, addStop: function(offset, color, opacity) { this.stops.push(new GradientStop(offset, color, opacity)); }, removeStop: function(stop) { var index = this.stops.indexOf(stop); if (index >= 0) { this.stops.splice(index, 1); } } }); deepExtend(Gradient.fn, ObserversMixin, { optionsChange: function(e) { this.trigger("optionsChange", { field: "gradient" + (e ? "." + e.field : ""), value: this }); }, geometryChange: function() { this.optionsChange(); } }); var LinearGradient = Gradient.extend({ init: function(options) { options = options || {}; Gradient.fn.init.call(this, options); this.start(options.start || new Point()); this.end(options.end || new Point(1, 0)); } }); definePointAccessors(LinearGradient.fn, ["start", "end"]); var RadialGradient = Gradient.extend({ init: function(options) { options = options || {}; Gradient.fn.init.call(this, options); this.center(options.center || new Point()); this._radius = defined(options.radius) ? options.radius : 1; this._fallbackFill = options.fallbackFill; }, radius: function(value) { if (defined(value)) { this._radius = value; this.geometryChange(); return this; } else { return this._radius; } }, fallbackFill: function(value) { if (defined(value)) { this._fallbackFill = value; this.optionsChange(); return this; } else { return this._fallbackFill; } } }); definePointAccessors(RadialGradient.fn, ["center"]); // Helper functions =========================================== function elementsBoundingBox(elements, applyTransform, transformation) { var boundingBox; for (var i = 0; i < elements.length; i++) { var element = elements[i]; if (element.visible()) { var elementBoundingBox = applyTransform ? element.bbox(transformation) : element.rawBBox(); if (elementBoundingBox) { if (boundingBox) { boundingBox = Rect.union(boundingBox, elementBoundingBox); } else { boundingBox = elementBoundingBox; } } } } return boundingBox; } function elementsClippedBoundingBox(elements, transformation) { var boundingBox; for (var i = 0; i < elements.length; i++) { var element = elements[i]; if (element.visible()) { var elementBoundingBox = element.clippedBBox(transformation); if (elementBoundingBox) { if (boundingBox) { boundingBox = Rect.union(boundingBox, elementBoundingBox); } else { boundingBox = elementBoundingBox; } } } } return boundingBox; } function expandRect(rect, value) { rect.origin.x -= value; rect.origin.y -= value; rect.size.width += value * 2; rect.size.height += value * 2; } function defineGeometryAccessors(fn, names) { for (var i = 0; i < names.length; i++) { fn[names[i]] = geometryAccessor(names[i]); } } function geometryAccessor(name) { var fieldName = "_" + name; return function(value) { if (defined(value)) { this._observerField(fieldName, value); this.geometryChange(); return this; } else { return this[fieldName]; } }; } function definePointAccessors(fn, names) { for (var i = 0; i < names.length; i++) { fn[names[i]] = pointAccessor(names[i]); } } function pointAccessor(name) { var fieldName = "_" + name; return function(value) { if (defined(value)) { this._observerField(fieldName, Point.create(value)); this.geometryChange(); return this; } else { return this[fieldName]; } }; } function defineOptionsAccessors(fn, names) { for (var i = 0; i < names.length; i++) { fn[names[i]] = optionsAccessor(names[i]); } } function optionsAccessor(name) { return function(value) { if (defined(value)) { this.options.set(name, value); return this; } else { return this.options.get(name); } }; } function generateDefinitionId() { return "kdef" + defId++; } // Exports ================================================================ deepExtend(drawing, { Arc: Arc, Circle: Circle, Element: Element, ElementsArray: ElementsArray, Gradient: Gradient, GradientStop: GradientStop, Group: Group, Image: Image, LinearGradient: LinearGradient, MultiPath: MultiPath, Path: Path, RadialGradient: RadialGradient, Segment: Segment, Text: Text }); })(window.kendo.jQuery); (function ($) { var kendo = window.kendo, drawing = kendo.drawing, geometry = kendo.geometry, Class = kendo.Class, Point = geometry.Point, deepExtend = kendo.deepExtend, trim = $.trim, util = kendo.util, deg = util.deg, last = util.last, round = util.round; var SEGMENT_REGEX = /([a-z]{1})([^a-z]*)(z)?/gi, SPLIT_REGEX = /[,\s]?(-?(?:\d+\.)?\d+)/g, MOVE = "m", CLOSE = "z"; var PathParser = Class.extend({ parse: function(str, options) { var parser = this; var multiPath = new drawing.MultiPath(options); var position = new Point(); var previousCommand; str.replace(SEGMENT_REGEX, function(match, element, params, closePath) { var command = element.toLowerCase(); var isRelative = command === element; var parameters = parseParameters(trim(params)); if (command === MOVE) { if (isRelative) { position.x += parameters[0]; position.y += parameters[1]; } else { position.x = parameters[0]; position.y = parameters[1]; } multiPath.moveTo(position.x, position.y); if (parameters.length > 2) { command = "l"; parameters.splice(0, 2); } } if (ShapeMap[command]) { ShapeMap[command]( multiPath, { parameters: parameters, position: position, isRelative: isRelative, previousCommand: previousCommand } ); if (closePath && closePath.toLowerCase() === CLOSE) { multiPath.close(); } } else if (command !== MOVE) { throw new Error("Error while parsing SVG path. Unsupported command: " + command); } previousCommand = command; }); return multiPath; } }); var ShapeMap = { l: function(path, options) { var parameters = options.parameters; var position = options.position; for (var i = 0; i < parameters.length; i+=2){ var point = new Point(parameters[i], parameters[i + 1]); if (options.isRelative) { point.translateWith(position); } path.lineTo(point.x, point.y); position.x = point.x; position.y = point.y; } }, c: function(path, options) { var parameters = options.parameters; var position = options.position; var controlOut, controlIn, point; for (var i = 0; i < parameters.length; i += 6) { controlOut = new Point(parameters[i], parameters[i + 1]); controlIn = new Point(parameters[i + 2], parameters[i + 3]); point = new Point(parameters[i + 4], parameters[i + 5]); if (options.isRelative) { controlIn.translateWith(position); controlOut.translateWith(position); point.translateWith(position); } path.curveTo(controlOut, controlIn, point); position.x = point.x; position.y = point.y; } }, v: function(path, options) { var value = options.isRelative ? 0 : options.position.x; toLineParamaters(options.parameters, true, value); this.l(path, options); }, h: function(path, options) { var value = options.isRelative ? 0 : options.position.y; toLineParamaters(options.parameters, false, value); this.l(path, options); }, a: function(path, options) { var parameters = options.parameters; var position = options.position; for (var i = 0; i < parameters.length; i += 7) { var radiusX = parameters[i]; var radiusY = parameters[i + 1]; var largeArc = parameters[i + 3]; var swipe = parameters[i + 4]; var endPoint = new Point(parameters[i + 5], parameters[i + 6]); if (options.isRelative) { endPoint.translateWith(position); } path.arcTo(endPoint, radiusX, radiusY, largeArc, swipe); position.x = endPoint.x; position.y = endPoint.y; } }, s: function(path, options) { var parameters = options.parameters; var position = options.position; var previousCommand = options.previousCommand; var controlOut, endPoint, controlIn, lastControlIn; if (previousCommand == "s" || previousCommand == "c") { lastControlIn = last(last(path.paths).segments).controlIn(); } for (var i = 0; i < parameters.length; i += 4) { controlIn = new Point(parameters[i], parameters[i + 1]); endPoint = new Point(parameters[i + 2], parameters[i + 3]); if (options.isRelative) { controlIn.translateWith(position); endPoint.translateWith(position); } if (lastControlIn) { controlOut = reflectionPoint(lastControlIn, position); } else { controlOut = position.clone(); } lastControlIn = controlIn; path.curveTo(controlOut, controlIn, endPoint); position.x = endPoint.x; position.y = endPoint.y; } }, q: function(path, options) { var parameters = options.parameters; var position = options.position; var cubicControlPoints, endPoint, controlPoint; for (var i = 0; i < parameters.length; i += 4) { controlPoint = new Point(parameters[i], parameters[i + 1]); endPoint = new Point(parameters[i + 2], parameters[i + 3]); if (options.isRelative) { controlPoint.translateWith(position); endPoint.translateWith(position); } cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint); path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint); position.x = endPoint.x; position.y = endPoint.y; } }, t: function(path, options) { var parameters = options.parameters; var position = options.position; var previousCommand = options.previousCommand; var cubicControlPoints, controlPoint, endPoint; if (previousCommand == "q" || previousCommand == "t") { var lastSegment = last(last(path.paths).segments); controlPoint = lastSegment.controlIn().clone() .translateWith(position.scaleCopy(-1 / 3)) .scale(3 / 2); } for (var i = 0; i < parameters.length; i += 2) { endPoint = new Point(parameters[i], parameters[i + 1]); if (options.isRelative) { endPoint.translateWith(position); } if (controlPoint) { controlPoint = reflectionPoint(controlPoint, position); } else { controlPoint = position.clone(); } cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint); path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint); position.x = endPoint.x; position.y = endPoint.y; } } }; // Helper functions ======================================================= function parseParameters(str) { var parameters = []; str.replace(SPLIT_REGEX, function(match, number) { parameters.push(parseFloat(number)); }); return parameters; } function toLineParamaters(parameters, isVertical, value) { var insertPosition = isVertical ? 0 : 1; for (var i = 0; i < parameters.length; i+=2) { parameters.splice(i + insertPosition, 0, value); } } function reflectionPoint(point, center) { if (point && center) { return center.scaleCopy(2).translate(-point.x, -point.y); } } function quadraticToCubicControlPoints(position, controlPoint, endPoint) { var third = 1 / 3; controlPoint = controlPoint.clone().scale(2 / 3); return { controlOut: controlPoint.clone().translateWith(position.scaleCopy(third)), controlIn: controlPoint.translateWith(endPoint.scaleCopy(third)) }; } // Exports ================================================================ PathParser.current = new PathParser(); drawing.Path.parse = function(str, options) { return PathParser.current.parse(str, options); }; deepExtend(drawing, { PathParser: PathParser }); })(window.kendo.jQuery); (function ($) { // Imports ================================================================ var doc = document, kendo = window.kendo, deepExtend = kendo.deepExtend, g = kendo.geometry, d = kendo.drawing, BaseNode = d.BaseNode, util = kendo.util, defined = util.defined, isTransparent = util.isTransparent, renderAttr = util.renderAttr, renderAllAttr = util.renderAllAttr, renderSize = util.renderSize, renderTemplate = util.renderTemplate, inArray = $.inArray; // Constants ============================================================== var BUTT = "butt", DASH_ARRAYS = d.DASH_ARRAYS, GRADIENT = "gradient", NONE = "none", NS = ".kendo", SOLID = "solid", SPACE = " ", SQUARE = "square", SVG_NS = "http://www.w3.org/2000/svg", TRANSFORM = "transform", UNDEFINED = "undefined"; // SVG rendering surface ================================================== var Surface = d.Surface.extend({ init: function(element, options) { d.Surface.fn.init.call(this, element, options); this._root = new RootNode(this.options); renderSVG(this.element[0], this._template(this)); this._rootElement = this.element[0].firstElementChild; alignToScreen(this._rootElement); this._root.attachTo(this._rootElement); this.element.on("click" + NS, this._click); this.element.on("mouseover" + NS, this._mouseenter); this.element.on("mouseout" + NS, this._mouseleave); this.resize(); }, type: "svg", destroy: function() { if (this._root) { this._root.destroy(); this._root = null; this._rootElement = null; this.element.off(NS); } d.Surface.fn.destroy.call(this); }, translate: function(offset) { var viewBox = kendo.format( "{0} {1} {2} {3}", Math.round(offset.x), Math.round(offset.y), this._size.width, this._size.height); this._offset = offset; this._rootElement.setAttribute("viewBox", viewBox); }, draw: function(element) { this._root.load([element]); }, clear: function() { this._root.clear(); }, svg: function() { return "" + this._template(this); }, _resize: function() { if (this._offset) { this.translate(this._offset); } }, _template: renderTemplate( "#= d._root.render() #" ) }); // SVG Node ================================================================ var Node = BaseNode.extend({ init: function(srcElement) { BaseNode.fn.init.call(this, srcElement); this.definitions = {}; }, destroy: function() { if (this.element) { this.element._kendoNode = null; this.element = null; } this.clearDefinitions(); BaseNode.fn.destroy.call(this); }, load: function(elements, pos) { var node = this, element = node.element, childNode, srcElement, children, i; for (i = 0; i < elements.length; i++) { srcElement = elements[i]; children = srcElement.children; childNode = new nodeMap[srcElement.nodeType](srcElement); if (defined(pos)) { node.insertAt(childNode, pos); } else { node.append(childNode); } childNode.createDefinitions(); if (children && children.length > 0) { childNode.load(children); } if (element) { childNode.attachTo(element, pos); } } }, root: function() { var root = this; while (root.parent) { root = root.parent; } return root; }, attachTo: function(domElement, pos) { var container = doc.createElement("div"); renderSVG(container, "" + this.render() + "" ); var element = container.firstChild.firstChild; if (element) { if (defined(pos)) { domElement.insertBefore(element, domElement.childNodes[pos]); } else { domElement.appendChild(element); } this.setElement(element); } }, setElement: function(element) { var nodes = this.childNodes, childElement, i; if (this.element) { this.element._kendoNode = null; } this.element = element; this.element._kendoNode = this; for (i = 0; i < nodes.length; i++) { childElement = element.childNodes[i]; nodes[i].setElement(childElement); } }, clear: function() { this.clearDefinitions(); if (this.element) { this.element.innerHTML = ""; } var children = this.childNodes; for (var i = 0; i < children.length; i++) { children[i].destroy(); } this.childNodes = []; }, removeSelf: function() { if (this.element) { this.element.parentNode.removeChild(this.element); this.element = null; } BaseNode.fn.removeSelf.call(this); }, template: renderTemplate( "#= d.renderChildren() #" ), render: function() { return this.template(this); }, renderChildren: function() { var nodes = this.childNodes, output = "", i; for (i = 0; i < nodes.length; i++) { output += nodes[i].render(); } return output; }, optionsChange: function(e) { var field = e.field; var value = e.value; if (field === "visible") { this.css("display", value ? "" : NONE); } else if (DefinitionMap[field] && isDefinition(field, value)) { this.updateDefinition(field, value); } else if (field === "opacity") { this.attr("opacity", value); } BaseNode.fn.optionsChange.call(this, e); }, attr: function(name, value) { if (this.element) { this.element.setAttribute(name, value); } }, allAttr: function(attrs) { for (var i = 0; i < attrs.length; i++) { this.attr(attrs[i][0], attrs[i][1]); } }, css: function(name, value) { if (this.element) { this.element.style[name] = value; } }, allCss: function(styles) { for (var i = 0; i < styles.length; i++) { this.css(styles[i][0], styles[i][1]); } }, removeAttr: function(name) { if (this.element) { this.element.removeAttribute(name); } }, mapTransform: function(transform) { var attrs = []; if (transform) { attrs.push([ TRANSFORM, "matrix(" + transform.matrix().toString(6) + ")" ]); } return attrs; }, renderTransform: function() { return renderAllAttr( this.mapTransform(this.srcElement.transform()) ); }, transformChange: function(value) { if (value) { this.allAttr(this.mapTransform(value)); } else { this.removeAttr(TRANSFORM); } }, mapStyle: function() { var options = this.srcElement.options; var style = [["cursor", options.cursor]]; if (options.visible === false) { style.push(["display", NONE]); } return style; }, renderStyle: function() { return renderAttr("style", util.renderStyle(this.mapStyle())); }, renderOpacity: function() { return renderAttr("opacity", this.srcElement.options.opacity); }, createDefinitions: function() { var srcElement = this.srcElement; var definitions = this.definitions; var definition, field, options, hasDefinitions; if (srcElement) { options = srcElement.options; for (field in DefinitionMap) { definition = options.get(field); if (definition && isDefinition(field, definition)) { definitions[field] = definition; hasDefinitions = true; } } if (hasDefinitions) { this.definitionChange({ action: "add", definitions: definitions }); } } }, definitionChange: function(e) { if (this.parent) { this.parent.definitionChange(e); } }, updateDefinition: function(type, value) { var definitions = this.definitions; var current = definitions[type]; var attr = DefinitionMap[type]; var definition = {}; if (current) { definition[type] = current; this.definitionChange({ action: "remove", definitions: definition }); delete definitions[type]; } if (!value) { if (current) { this.removeAttr(attr); } } else { definition[type] = value; this.definitionChange({ action: "add", definitions: definition }); definitions[type] = value; this.attr(attr, refUrl(value.id)); } }, clearDefinitions: function() { var definitions = this.definitions; var field; for (field in definitions) { this.definitionChange({ action: "remove", definitions: definitions }); this.definitions = {}; break; } }, renderDefinitions: function() { return renderAllAttr(this.mapDefinitions()); }, mapDefinitions: function() { var definitions = this.definitions; var attrs = []; var field; for (field in definitions) { attrs.push([DefinitionMap[field], refUrl(definitions[field].id)]); } return attrs; } }); var RootNode = Node.extend({ init: function(options) { Node.fn.init.call(this); this.options = options; this.defs = new DefinitionNode(); }, attachTo: function(domElement) { this.element = domElement; this.defs.attachTo(domElement.firstElementChild); }, clear: function() { BaseNode.fn.clear.call(this); }, template: renderTemplate( "#=d.defs.render()##= d.renderChildren() #" ), definitionChange: function(e) { this.defs.definitionChange(e); } }); var DefinitionNode = Node.extend({ init: function() { Node.fn.init.call(this); this.definitionMap = {}; }, attachTo: function(domElement) { this.element = domElement; }, template: renderTemplate( "#= d.renderChildren()#" ), definitionChange: function(e) { var definitions = e.definitions; var action = e.action; if (action == "add") { this.addDefinitions(definitions); } else if (action == "remove") { this.removeDefinitions(definitions); } }, createDefinition: function(type, item) { var nodeType; if (type == "clip") { nodeType = ClipNode; } else if (type == "fill") { if (item instanceof d.LinearGradient) { nodeType = LinearGradientNode; } else if (item instanceof d.RadialGradient) { nodeType = RadialGradientNode; } } return new nodeType(item); }, addDefinitions: function(definitions) { for (var field in definitions) { this.addDefinition(field, definitions[field]); } }, addDefinition: function(type, srcElement) { var definitionMap = this.definitionMap; var id = srcElement.id; var element = this.element; var node, mapItem; mapItem = definitionMap[id]; if (!mapItem) { node = this.createDefinition(type, srcElement); definitionMap[id] = { element: node, count: 1 }; this.append(node); if (element) { node.attachTo(this.element); } } else { mapItem.count++; } }, removeDefinitions: function(definitions) { for (var field in definitions) { this.removeDefinition(definitions[field]); } }, removeDefinition: function(srcElement) { var definitionMap = this.definitionMap; var id = srcElement.id; var mapItem; mapItem = definitionMap[id]; if (mapItem) { mapItem.count--; if (mapItem.count === 0) { this.remove(inArray(mapItem.element, this.childNodes), 1); delete definitionMap[id]; } } } }); var ClipNode = Node.extend({ init: function(srcElement) { Node.fn.init.call(this); this.srcElement = srcElement; this.id = srcElement.id; this.load([srcElement]); }, template: renderTemplate( "#= d.renderChildren()#" ) }); var GroupNode = Node.extend({ template: renderTemplate( "#= d.renderChildren() #" ), optionsChange: function(e) { if (e.field == TRANSFORM) { this.transformChange(e.value); } Node.fn.optionsChange.call(this, e); } }); var PathNode = Node.extend({ geometryChange: function() { this.attr("d", this.renderData()); this.invalidate(); }, optionsChange: function(e) { switch(e.field) { case "fill": if (e.value) { this.allAttr(this.mapFill(e.value)); } else { this.removeAttr("fill"); } break; case "fill.color": this.allAttr(this.mapFill({ color: e.value })); break; case "stroke": if (e.value) { this.allAttr(this.mapStroke(e.value)); } else { this.removeAttr("stroke"); } break; case TRANSFORM: this.transformChange(e.value); break; default: var name = this.attributeMap[e.field]; if (name) { this.attr(name, e.value); } break; } Node.fn.optionsChange.call(this, e); }, attributeMap: { "fill.opacity": "fill-opacity", "stroke.color": "stroke", "stroke.width": "stroke-width", "stroke.opacity": "stroke-opacity" }, content: function(value) { if (this.element) { this.element.textContent = this.srcElement.content(); } }, renderData: function() { return this.printPath(this.srcElement); }, printPath: function(path) { var segments = path.segments, length = segments.length; if (length > 0) { var parts = [], output, segmentType, currentType, i; for (i = 1; i < length; i++) { segmentType = this.segmentType(segments[i - 1], segments[i]); if (segmentType !== currentType) { currentType = segmentType; parts.push(segmentType); } if (segmentType === "L") { parts.push(this.printPoints(segments[i].anchor())); } else { parts.push(this.printPoints(segments[i - 1].controlOut(), segments[i].controlIn(), segments[i].anchor())); } } output = "M" + this.printPoints(segments[0].anchor()) + SPACE + parts.join(SPACE); if (path.options.closed) { output += "Z"; } return output; } }, printPoints: function() { var points = arguments, length = points.length, i, result = []; for (i = 0; i < length; i++) { result.push(points[i].toString(3)); } return result.join(SPACE); }, segmentType: function(segmentStart, segmentEnd) { return segmentStart.controlOut() && segmentEnd.controlIn() ? "C" : "L"; }, mapStroke: function(stroke) { var attrs = []; if (stroke && !isTransparent(stroke.color)) { attrs.push(["stroke", stroke.color]); attrs.push(["stroke-width", stroke.width]); attrs.push(["stroke-linecap", this.renderLinecap(stroke)]); attrs.push(["stroke-linejoin", stroke.lineJoin]); if (defined(stroke.opacity)) { attrs.push(["stroke-opacity", stroke.opacity]); } if (defined(stroke.dashType)) { attrs.push(["stroke-dasharray", this.renderDashType(stroke)]); } } else { attrs.push(["stroke", NONE]); } return attrs; }, renderStroke: function() { return renderAllAttr( this.mapStroke(this.srcElement.options.stroke) ); }, renderDashType: function (stroke) { var width = stroke.width || 1, dashType = stroke.dashType; if (dashType && dashType != SOLID) { var dashArray = DASH_ARRAYS[dashType.toLowerCase()], result = [], i; for (i = 0; i < dashArray.length; i++) { result.push(dashArray[i] * width); } return result.join(" "); } }, renderLinecap: function(stroke) { var dashType = stroke.dashType, lineCap = stroke.lineCap; return (dashType && dashType != SOLID) ? BUTT : lineCap; }, mapFill: function(fill) { var attrs = []; if (!(fill && fill.nodeType == GRADIENT)) { if (fill && !isTransparent(fill.color)) { attrs.push(["fill", fill.color]); if (defined(fill.opacity)) { attrs.push(["fill-opacity", fill.opacity]); } } else { attrs.push(["fill", NONE]); } } return attrs; }, renderFill: function() { return renderAllAttr( this.mapFill(this.srcElement.options.fill) ); }, template: renderTemplate( "" ) }); var ArcNode = PathNode.extend({ renderData: function() { return this.printPath(this.srcElement.toPath()); } }); var MultiPathNode = PathNode .extend({ renderData: function() { var paths = this.srcElement.paths; if (paths.length > 0) { var result = [], i; for (i = 0; i < paths.length; i++) { result.push(this.printPath(paths[i])); } return result.join(" "); } } }); var CircleNode = PathNode.extend({ geometryChange: function() { var center = this.center(); this.attr("cx", center.x); this.attr("cy", center.y); this.attr("r", this.radius()); this.invalidate(); }, center: function() { return this.srcElement.geometry().center; }, radius: function() { return this.srcElement.geometry().radius; }, template: renderTemplate( "" ) }); var TextNode = PathNode.extend({ geometryChange: function() { var pos = this.pos(); this.attr("x", pos.x); this.attr("y", pos.y); this.invalidate(); }, optionsChange: function(e) { if (e.field === "font") { this.attr("style", util.renderStyle(this.mapStyle())); this.geometryChange(); } else if (e.field === "content") { PathNode.fn.content.call(this, this.srcElement.content()); } PathNode.fn.optionsChange.call(this, e); }, mapStyle: function() { var style = PathNode.fn.mapStyle.call(this); var font = this.srcElement.options.font; style.push(["font", kendo.htmlEncode(font)]); return style; }, pos: function() { var pos = this.srcElement.position(); var size = this.srcElement.measure(); return pos.clone().setY(pos.y + size.baseline); }, content: function() { var content = this.srcElement.content(); var options = this.root().options; if (options && options.encodeText) { content = decodeEntities(content); content = kendo.htmlEncode(content); } return content; }, template: renderTemplate( "#= d.content() #" ) }); var ImageNode = PathNode.extend({ geometryChange: function() { this.allAttr(this.mapPosition()); this.invalidate(); }, optionsChange: function(e) { if (e.field === "src") { this.allAttr(this.mapSource()); } PathNode.fn.optionsChange.call(this, e); }, mapPosition: function() { var rect = this.srcElement.rect(); var tl = rect.topLeft(); return [ ["x", tl.x], ["y", tl.y], ["width", rect.width() + "px"], ["height", rect.height() + "px"] ]; }, renderPosition: function() { return renderAllAttr(this.mapPosition()); }, mapSource: function() { return [["xlink:href", this.srcElement.src()]]; }, renderSource: function() { return renderAllAttr(this.mapSource()); }, template: renderTemplate( "" + "" ) }); var GradientStopNode = Node.extend({ template: renderTemplate( "" ), renderOffset: function() { return renderAttr("offset", this.srcElement.offset()); }, mapStyle: function() { var srcElement = this.srcElement; return [ ["stop-color", srcElement.color()], ["stop-opacity", srcElement.opacity()] ]; }, optionsChange: function(e) { if (e.field == "offset") { this.attr(e.field, e.value); } else if (e.field == "color" || e.field == "opacity") { this.css("stop-" + e.field, e.value); } } }); var GradientNode = Node.extend({ init: function(srcElement) { Node.fn.init.call(this, srcElement); this.id = srcElement.id; this.loadStops(); }, loadStops: function() { var srcElement = this.srcElement; var stops = srcElement.stops; var element = this.element; var stopNode; var idx; for (idx = 0; idx < stops.length; idx++) { stopNode = new GradientStopNode(stops[idx]); this.append(stopNode); if (element) { stopNode.attachTo(element); } } }, optionsChange: function(e) { if (e.field == "gradient.stops") { BaseNode.fn.clear.call(this); this.loadStops(); } else if (e.field == GRADIENT){ this.allAttr(this.mapCoordinates()); } }, renderCoordinates: function() { return renderAllAttr(this.mapCoordinates()); }, mapSpace: function() { return ["gradientUnits", this.srcElement.userSpace() ? "userSpaceOnUse" : "objectBoundingBox"] } }); var LinearGradientNode = GradientNode.extend({ template: renderTemplate( "" + "#= d.renderChildren()#" + "" ), mapCoordinates: function() { var srcElement = this.srcElement; var start = srcElement.start(); var end = srcElement.end(); var attrs = [ ["x1", start.x], ["y1", start.y], ["x2", end.x], ["y2", end.y], this.mapSpace() ]; return attrs; } }); var RadialGradientNode = GradientNode.extend({ template: renderTemplate( "" + "#= d.renderChildren()#" + "" ), mapCoordinates: function() { var srcElement = this.srcElement; var center = srcElement.center(); var radius = srcElement.radius(); var attrs = [ ["cx", center.x], ["cy", center.y], ["r", radius], this.mapSpace() ]; return attrs; } }); var nodeMap = { Group: GroupNode, Text: TextNode, Path: PathNode, MultiPath: MultiPathNode, Circle: CircleNode, Arc: ArcNode, Image: ImageNode }; // Helpers ================================================================ var renderSVG = function(container, svg) { container.innerHTML = svg; }; (function() { var testFragment = "", testContainer = doc.createElement("div"), hasParser = typeof DOMParser != UNDEFINED; testContainer.innerHTML = testFragment; if (hasParser && testContainer.firstChild.namespaceURI != SVG_NS) { renderSVG = function(container, svg) { var parser = new DOMParser(), chartDoc = parser.parseFromString(svg, "text/xml"), importedDoc = doc.adoptNode(chartDoc.documentElement); container.innerHTML = ""; container.appendChild(importedDoc); }; } })(); function alignToScreen(element) { var ctm; try { ctm = element.getScreenCTM ? element.getScreenCTM() : null; } catch (e) { } if (ctm) { var left = - ctm.e % 1, top = - ctm.f % 1, style = element.style; if (left !== 0 || top !== 0) { style.left = left + "px"; style.top = top + "px"; } } } function baseUrl() { var base = document.getElementsByTagName("base")[0], url = "", href = document.location.href, hashIndex = href.indexOf("#"); if (base && !kendo.support.browser.msie) { if (hashIndex !== -1) { href = href.substring(0, hashIndex); } url = href; } return url; } function refUrl(id) { return "url(" + baseUrl() + "#" + id + ")"; } function exportGroup(group) { var root = new RootNode({ encodeText: true }); var bbox = group.clippedBBox(); if (bbox) { var origin = bbox.getOrigin(); var exportRoot = new d.Group(); exportRoot.transform(g.transform().translate(-origin.x, -origin.y)); exportRoot.children.push(group); group = exportRoot; } root.load([group]); var svg = "" + "" + root.render() + ""; root.destroy(); return svg; } function exportSVG(group, options) { var svg = exportGroup(group); if (!options || !options.raw) { svg = "data:image/svg+xml;base64," + util.encodeBase64(svg); } return $.Deferred().resolve(svg).promise(); } function isDefinition(type, value) { return type == "clip" || (type == "fill" && (!value || value.nodeType == GRADIENT)); } // Mappings =============================================================== function decodeEntities(text) { if (!text || !text.indexOf || text.indexOf("&") < 0) { return text; } else { var element = decodeEntities._element; element.innerHTML = text; return element.textContent || element.innerText; } } decodeEntities._element = document.createElement("span"); // Mappings =============================================================== var DefinitionMap = { clip: "clip-path", fill: "fill" }; // Exports ================================================================ kendo.support.svg = (function() { return doc.implementation.hasFeature( "http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"); })(); if (kendo.support.svg) { d.SurfaceFactory.current.register("svg", Surface, 10); } deepExtend(d, { exportSVG: exportSVG, svg: { ArcNode: ArcNode, CircleNode: CircleNode, ClipNode: ClipNode, DefinitionNode: DefinitionNode, GradientStopNode: GradientStopNode, GroupNode: GroupNode, ImageNode: ImageNode, LinearGradientNode: LinearGradientNode, MultiPathNode: MultiPathNode, Node: Node, PathNode: PathNode, RadialGradientNode: RadialGradientNode, RootNode: RootNode, Surface: Surface, TextNode: TextNode, _exportGroup: exportGroup } }); })(window.kendo.jQuery); (function ($) { // Imports ================================================================ var noop = $.noop, doc = document, kendo = window.kendo, deepExtend = kendo.deepExtend, util = kendo.util, defined = util.defined, isTransparent = util.isTransparent, renderTemplate = util.renderTemplate, valueOrDefault = util.valueOrDefault, g = kendo.geometry, d = kendo.drawing, BaseNode = d.BaseNode; // Constants ============================================================== var BUTT = "butt", DASH_ARRAYS = d.DASH_ARRAYS, FRAME_DELAY = 1000 / 60, NONE = "none", SOLID = "solid"; // Canvas Surface ========================================================== var Surface = d.Surface.extend({ init: function(element, options) { d.Surface.fn.init.call(this, element, options); this.element[0].innerHTML = this._template(this); var canvas = this.element[0].firstElementChild; canvas.width = $(element).width(); canvas.height = $(element).height(); this._rootElement = canvas; this._root = new RootNode(canvas); }, destroy: function() { d.Surface.fn.destroy.call(this); if (this._root) { this._root.destroy(); this._root = null; } }, type: "canvas", draw: function(element) { this._root.load([element], undefined, this.options.cors); }, clear: function() { this._root.clear(); }, image: function() { var root = this._root; var rootElement = this._rootElement; var loadingStates = []; root.traverse(function(childNode) { if (childNode.loading) { loadingStates.push(childNode.loading); } }); var defer = $.Deferred(); $.when.apply($, loadingStates).done(function() { root._invalidate(); try { var data = rootElement.toDataURL(); defer.resolve(data); } catch (e) { defer.reject(e); } }).fail(function(e) { defer.reject(e); }); return defer.promise(); }, _resize: function() { this._rootElement.width = this._size.width; this._rootElement.height = this._size.height; this._root.invalidate(); }, _template: renderTemplate( "" ) }); // Nodes =================================================================== var Node = BaseNode.extend({ init: function(srcElement) { BaseNode.fn.init.call(this, srcElement); if (srcElement) { this.initClip(); } }, initClip: function() { var clip = this.srcElement.clip(); if (clip) { this.clip = clip; clip.addObserver(this); } }, clear: function() { if (this.srcElement) { this.srcElement.removeObserver(this); } this.clearClip(); BaseNode.fn.clear.call(this); }, clearClip: function() { if (this.clip) { this.clip.removeObserver(this); delete this.clip; } }, setClip: function(ctx) { if (this.clip) { ctx.beginPath(); PathNode.fn.renderPoints(ctx, this.clip); ctx.clip(); } }, optionsChange: function(e) { if (e.field == "clip") { this.clearClip(); this.initClip(); } BaseNode.fn.optionsChange.call(this, e); }, setTransform: function(ctx) { if (this.srcElement) { var transform = this.srcElement.transform(); if (transform) { ctx.transform.apply(ctx, transform.matrix().toArray(6)); } } }, load: function(elements, pos, cors) { var node = this, childNode, srcElement, children, i; for (i = 0; i < elements.length; i++) { srcElement = elements[i]; children = srcElement.children; childNode = new nodeMap[srcElement.nodeType](srcElement, cors); if (children && children.length > 0) { childNode.load(children, pos, cors); } if (defined(pos)) { node.insertAt(childNode, pos); } else { node.append(childNode); } } node.invalidate(); }, setOpacity: function(ctx) { if (this.srcElement) { var opacity = this.srcElement.opacity(); if (defined(opacity)) { this.globalAlpha(ctx, opacity); } } }, globalAlpha: function(ctx, value) { if (value && ctx.globalAlpha) { value *= ctx.globalAlpha; } ctx.globalAlpha = value; }, visible: function() { var src = this.srcElement; return !src || (src && src.options.visible !== false); } }); var GroupNode = Node.extend({ renderTo: function(ctx) { if (!this.visible()) { return; } ctx.save(); this.setTransform(ctx); this.setClip(ctx); this.setOpacity(ctx); var childNodes = this.childNodes; for (var i = 0; i < childNodes.length; i++) { var child = childNodes[i]; if (child.visible()) { child.renderTo(ctx); } } ctx.restore(); } }); d.mixins.Traversable.extend(GroupNode.fn, "childNodes"); var RootNode = GroupNode.extend({ init: function(canvas) { GroupNode.fn.init.call(this); this.canvas = canvas; this.ctx = canvas.getContext("2d"); this.invalidate = kendo.throttle( $.proxy(this._invalidate, this), FRAME_DELAY ); }, destroy: function() { GroupNode.fn.destroy.call(this); this.canvas = null; this.ctx = null; }, _invalidate: function() { if (!this.ctx) { return; } this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); this.renderTo(this.ctx); } }); d.mixins.Traversable.extend(RootNode.fn, "childNodes"); var PathNode = Node.extend({ renderTo: function(ctx) { ctx.save(); this.setTransform(ctx); this.setClip(ctx); this.setOpacity(ctx); ctx.beginPath(); this.renderPoints(ctx, this.srcElement); this.setLineDash(ctx); this.setLineCap(ctx); this.setLineJoin(ctx); this.setFill(ctx); this.setStroke(ctx); ctx.restore(); }, setFill: function(ctx) { var fill = this.srcElement.options.fill; var hasFill = false; if (fill) { if (fill.nodeType == "gradient") { this.setGradientFill(ctx, fill); hasFill = true; } else if (!isTransparent(fill.color)) { ctx.fillStyle = fill.color; ctx.save(); this.globalAlpha(ctx, fill.opacity); ctx.fill(); ctx.restore(); hasFill = true; } } return hasFill; }, setGradientFill: function(ctx, fill) { var bbox = this.srcElement.rawBBox(); var gradient; if (fill instanceof d.LinearGradient) { var start = fill.start(); var end = fill.end(); gradient = ctx.createLinearGradient(start.x, start.y, end.x, end.y); } else if (fill instanceof d.RadialGradient) { var center = fill.center(); gradient = ctx.createRadialGradient(center.x, center.y, 0, center.x, center.y, fill.radius()); } addGradientStops(gradient, fill.stops); ctx.save(); if (!fill.userSpace()) { ctx.transform(bbox.width(), 0, 0, bbox.height(), bbox.origin.x, bbox.origin.y); } ctx.fillStyle = gradient; ctx.fill(); ctx.restore(); }, setStroke: function(ctx) { var stroke = this.srcElement.options.stroke; if (stroke && !isTransparent(stroke.color) && stroke.width > 0) { ctx.strokeStyle = stroke.color; ctx.lineWidth = valueOrDefault(stroke.width, 1); ctx.save(); this.globalAlpha(ctx, stroke.opacity); ctx.stroke(); ctx.restore(); return true; } }, dashType: function() { var stroke = this.srcElement.options.stroke; if (stroke && stroke.dashType) { return stroke.dashType.toLowerCase(); } }, setLineDash: function(ctx) { var dashType = this.dashType(); if (dashType && dashType != SOLID) { var dashArray = DASH_ARRAYS[dashType]; if (ctx.setLineDash) { ctx.setLineDash(dashArray); } else { ctx.mozDash = dashArray; ctx.webkitLineDash = dashArray; } } }, setLineCap: function(ctx) { var dashType = this.dashType(); var stroke = this.srcElement.options.stroke; if (dashType && dashType !== SOLID) { ctx.lineCap = BUTT; } else if (stroke && stroke.lineCap) { ctx.lineCap = stroke.lineCap; } }, setLineJoin: function(ctx) { var stroke = this.srcElement.options.stroke; if (stroke && stroke.lineJoin) { ctx.lineJoin = stroke.lineJoin; } }, renderPoints: function(ctx, path) { var segments = path.segments; if (segments.length === 0) { return; } var seg = segments[0]; var anchor = seg.anchor(); ctx.moveTo(anchor.x, anchor.y); for (var i = 1; i < segments.length; i++) { seg = segments[i]; anchor = seg.anchor(); var prevSeg = segments[i - 1]; var prevOut = prevSeg.controlOut(); var controlIn = seg.controlIn(); if (prevOut && controlIn) { ctx.bezierCurveTo(prevOut.x, prevOut.y, controlIn.x, controlIn.y, anchor.x, anchor.y); } else { ctx.lineTo(anchor.x, anchor.y); } } if (path.options.closed) { ctx.closePath(); } } }); var MultiPathNode = PathNode.extend({ renderPoints: function(ctx) { var paths = this.srcElement.paths; for (var i = 0; i < paths.length; i++) { PathNode.fn.renderPoints(ctx, paths[i]); } } }); var CircleNode = PathNode.extend({ renderPoints: function(ctx) { var geometry = this.srcElement.geometry(); var c = geometry.center; var r = geometry.radius; ctx.arc(c.x, c.y, r, 0, Math.PI * 2); } }); var ArcNode = PathNode.extend({ renderPoints: function(ctx) { var path = this.srcElement.toPath(); PathNode.fn.renderPoints.call(this, ctx, path); } }); var TextNode = PathNode.extend({ renderTo: function(ctx) { var text = this.srcElement; var pos = text.position(); var size = text.measure(); ctx.save(); this.setTransform(ctx); this.setClip(ctx); this.setOpacity(ctx); ctx.beginPath(); ctx.font = text.options.font; if (this.setFill(ctx)) { ctx.fillText(text.content(), pos.x, pos.y + size.baseline); } if (this.setStroke(ctx)) { this.setLineDash(ctx); ctx.strokeText(text.content(), pos.x, pos.y + size.baseline); } ctx.restore(); } }); var ImageNode = PathNode.extend({ init: function(srcElement, cors) { PathNode.fn.init.call(this, srcElement); this.onLoad = $.proxy(this.onLoad, this); this.onError = $.proxy(this.onError, this); this.loading = $.Deferred(); var img = this.img = new Image(); if (cors) { img.crossOrigin = cors; } var src = img.src = srcElement.src(); if (img.complete) { this.onLoad(); } else { img.onload = this.onLoad; img.onerror = this.onError; } }, renderTo: function(ctx) { if (this.loading.state() === "resolved") { ctx.save(); this.setTransform(ctx); this.setClip(ctx); this.drawImage(ctx); ctx.restore(); } }, optionsChange: function(e) { if (e.field === "src") { this.loading = $.Deferred(); this.img.src = this.srcElement.src(); } else { PathNode.fn.optionsChange.call(this, e); } }, onLoad: function() { this.loading.resolve(); this.invalidate(); }, onError: function() { this.loading.reject(new Error( "Unable to load image '" + this.img.src + "'. Check for connectivity and verify CORS headers." )); }, drawImage: function(ctx) { var rect = this.srcElement.rect(); var tl = rect.topLeft(); ctx.drawImage( this.img, tl.x, tl.y, rect.width(), rect.height() ); } }); function exportImage(group, options) { var defaults = { width: "800px", height: "600px", cors: "Anonymous" }; var bbox = group.clippedBBox(); if (bbox) { var origin = bbox.getOrigin(); var exportRoot = new d.Group(); exportRoot.transform(g.transform().translate(-origin.x, -origin.y)); exportRoot.children.push(group); group = exportRoot; var size = bbox.getSize(); defaults.width = size.width + "px"; defaults.height = size.height + "px"; } options = deepExtend(defaults, options); var container = $("
    ").css({ display: "none", width: options.width, height: options.height }).appendTo(document.body); var surface = new Surface(container, options); surface.draw(group); var promise = surface.image(); promise.always(function() { surface.destroy(); container.remove(); }); return promise; } var nodeMap = { Group: GroupNode, Text: TextNode, Path: PathNode, MultiPath: MultiPathNode, Circle: CircleNode, Arc: ArcNode, Image: ImageNode }; // Helpers ================================================================ function addGradientStops(gradient, stops) { var color, stop, idx; for (idx = 0; idx < stops.length; idx++) { stop = stops[idx]; color = kendo.parseColor(stop.color()); color.a *= stop.opacity(); gradient.addColorStop(stop.offset(), color.toCssRgba()); } } // Exports ================================================================ kendo.support.canvas = (function() { return !!doc.createElement("canvas").getContext; })(); if (kendo.support.canvas) { d.SurfaceFactory.current.register("canvas", Surface, 20); } deepExtend(kendo.drawing, { exportImage: exportImage, canvas: { ArcNode: ArcNode, CircleNode: CircleNode, GroupNode: GroupNode, ImageNode: ImageNode, MultiPathNode: MultiPathNode, Node: Node, PathNode: PathNode, RootNode: RootNode, Surface: Surface, TextNode: TextNode } }); })(window.kendo.jQuery); (function ($) { // Imports ================================================================ var doc = document, math = Math, atan2 = math.atan2, ceil = math.ceil, sqrt = math.sqrt, kendo = window.kendo, deepExtend = kendo.deepExtend, noop = $.noop, d = kendo.drawing, BaseNode = d.BaseNode, g = kendo.geometry, toMatrix = g.toMatrix, Color = kendo.Color, util = kendo.util, isTransparent = util.isTransparent, defined = util.defined, deg = util.deg, renderTemplate = util.renderTemplate, round = util.round, valueOrDefault = util.valueOrDefault; // Constants ============================================================== var NONE = "none", NS = ".kendo", COORDINATE_MULTIPLE = 100, COORDINATE_SIZE = COORDINATE_MULTIPLE * COORDINATE_MULTIPLE, GRADIENT = "gradient", TRANSFORM_PRECISION = 4; // VML rendering surface ================================================== var Surface = d.Surface.extend({ init: function(element, options) { d.Surface.fn.init.call(this, element, options); enableVML(); this.element.empty(); this._root = new RootNode(); this._root.attachTo(this.element[0]); this.element.on("click" + NS, this._click); this.element.on("mouseover" + NS, this._mouseenter); this.element.on("mouseout" + NS, this._mouseleave); }, type: "vml", destroy: function() { if (this._root) { this._root.destroy(); this._root = null; this.element.off(NS); } d.Surface.fn.destroy.call(this); }, draw: function(element) { this._root.load([element], undefined, null); }, clear: function() { this._root.clear(); } }); // VML Node ================================================================ var Node = BaseNode.extend({ init: function(srcElement) { BaseNode.fn.init.call(this, srcElement); this.createElement(); this.attachReference(); }, observe: noop, destroy: function() { if (this.element) { this.element._kendoNode = null; this.element = null; } BaseNode.fn.destroy.call(this); }, clear: function() { if (this.element) { this.element.innerHTML = ""; } var children = this.childNodes; for (var i = 0; i < children.length; i++) { children[i].destroy(); } this.childNodes = []; }, removeSelf: function() { if (this.element) { this.element.parentNode.removeChild(this.element); this.element = null; } BaseNode.fn.removeSelf.call(this); }, createElement: function() { this.element = doc.createElement("div"); }, attachReference: function() { this.element._kendoNode = this; }, load: function(elements, pos, transform, opacity) { opacity = valueOrDefault(opacity, 1); if (this.srcElement) { opacity *= valueOrDefault(this.srcElement.options.opacity, 1); } for (var i = 0; i < elements.length; i++) { var srcElement = elements[i]; var children = srcElement.children; var combinedTransform = srcElement.currentTransform(transform); var currentOpacity = opacity * valueOrDefault(srcElement.options.opacity, 1); var childNode = new nodeMap[srcElement.nodeType](srcElement, combinedTransform, currentOpacity); if (children && children.length > 0) { childNode.load(children, pos, combinedTransform, opacity); } if (defined(pos)) { this.insertAt(childNode, pos); } else { this.append(childNode); } childNode.attachTo(this.element, pos); } }, attachTo: function(domElement, pos) { if (defined(pos)) { domElement.insertBefore(this.element, domElement.children[pos] || null); } else { domElement.appendChild(this.element); } }, optionsChange: function(e) { if (e.field == "visible") { this.css("display", e.value !== false ? "" : NONE); } }, setStyle: function() { this.allCss(this.mapStyle()); }, mapStyle: function() { var style = []; if (this.srcElement && this.srcElement.options.visible === false) { style.push([ "display", NONE ]); } return style; }, mapOpacityTo: function(attrs, multiplier) { var opacity = valueOrDefault(this.opacity, 1); opacity *= valueOrDefault(multiplier, 1); attrs.push(["opacity", opacity]); }, attr: function(name, value) { if (this.element) { this.element[name] = value; } }, allAttr: function(attrs) { for (var i = 0; i < attrs.length; i++) { this.attr(attrs[i][0], attrs[i][1]); } }, css: function(name, value) { if (this.element) { this.element.style[name] = value; } }, allCss: function(styles) { for (var i = 0; i < styles.length; i++) { this.css(styles[i][0], styles[i][1]); } } }); var RootNode = Node.extend({ createElement: function() { Node.fn.createElement.call(this); this.allCss([ ["width", "100%"], ["height", "100%"], ["position", "relative"], ["visibility", "visible"] ]); }, attachReference: noop }); var ClipObserver = kendo.Class.extend({ init: function(srcElement, observer) { this.srcElement = srcElement; this.observer = observer; srcElement.addObserver(this); }, geometryChange: function() { this.observer.optionsChange({ field: "clip", value: this.srcElement }); }, clear: function() { this.srcElement.removeObserver(this); } }); var ObserverNode = Node.extend({ init: function(srcElement) { Node.fn.init.call(this, srcElement); if (srcElement) { this.initClip(); } }, observe: function() { BaseNode.fn.observe.call(this); }, mapStyle: function() { var style = Node.fn.mapStyle.call(this); if (this.srcElement && this.srcElement.clip()) { style.push(["clip", this.clipRect()]); } return style; }, optionsChange: function(e) { if (e.field == "clip") { this.clearClip(); this.initClip(); this.setClip(); } Node.fn.optionsChange.call(this, e); }, clear: function() { this.clearClip(); Node.fn.clear.call(this); }, initClip: function() { if (this.srcElement.clip()) { this.clip = new ClipObserver(this.srcElement.clip(), this); this.clip.observer = this; } }, clearClip: function() { if (this.clip) { this.clip.clear(); this.clip = null; this.css("clip", this.clipRect()); } }, setClip: function() { if (this.clip) { this.css("clip", this.clipRect()); } }, clipRect: function() { var clipRect = EMPTY_CLIP; var clip = this.srcElement.clip(); if (clip) { var bbox = this.clipBBox(clip); var topLeft = bbox.topLeft(); var bottomRight = bbox.bottomRight(); clipRect = kendo.format("rect({0}px {1}px {2}px {3}px)", topLeft.y, bottomRight.x, bottomRight.y, topLeft.x); } return clipRect; }, clipBBox: function(clip) { var topLeft = this.srcElement.rawBBox().topLeft(); var clipBBox = clip.rawBBox(); clipBBox.origin.translate(-topLeft.x, -topLeft.y); return clipBBox; } }); var GroupNode = ObserverNode.extend({ createElement: function() { Node.fn.createElement.call(this); this.setStyle(); }, attachTo: function(domElement, pos) { this.css("display", NONE); Node.fn.attachTo.call(this, domElement, pos); if (this.srcElement.options.visible !== false) { this.css("display", ""); } }, _attachTo: function(domElement) { var frag = document.createDocumentFragment(); frag.appendChild(this.element); domElement.appendChild(frag); }, mapStyle: function() { var style = ObserverNode.fn.mapStyle.call(this); style.push(["position", "absolute"]); style.push(["white-space", "nowrap"]); return style; }, optionsChange: function(e) { if (e.field === "transform") { this.refreshTransform(); } if (e.field === "opacity") { this.refreshOpacity(); } ObserverNode.fn.optionsChange.call(this, e); }, refreshTransform: function(transform) { var currentTransform = this.srcElement.currentTransform(transform), children = this.childNodes, length = children.length, i; this.setClip(); for (i = 0; i < length; i++) { children[i].refreshTransform(currentTransform); } }, currentOpacity: function() { var opacity = valueOrDefault(this.srcElement.options.opacity, 1); if (this.parent && this.parent.currentOpacity) { opacity *= this.parent.currentOpacity(); } return opacity; }, refreshOpacity: function() { var children = this.childNodes, length = children.length, i; var opacity = this.currentOpacity(); for (i = 0; i < length; i++) { children[i].refreshOpacity(opacity); } }, initClip: function() { ObserverNode.fn.initClip.call(this); if (this.clip) { var bbox = this.clip.srcElement.bbox(this.srcElement.currentTransform()); if (bbox) { this.css("width", bbox.width() + bbox.origin.x); this.css("height", bbox.height() + bbox.origin.y); } } }, clipBBox: function(clip) { return clip.bbox(this.srcElement.currentTransform()); }, clearClip: function() { ObserverNode.fn.clearClip.call(this); } }); var StrokeNode = Node.extend({ init: function(srcElement, opacity) { this.opacity = opacity; Node.fn.init.call(this, srcElement); }, createElement: function() { this.element = createElementVML("stroke"); this.setOpacity(); }, optionsChange: function(e) { if (e.field.indexOf("stroke") === 0) { this.setStroke(); } }, refreshOpacity: function(opacity) { this.opacity = opacity; this.setStroke(); }, setStroke: function() { this.allAttr(this.mapStroke()); }, setOpacity: function() { this.setStroke(); }, mapStroke: function() { var stroke = this.srcElement.options.stroke; var attrs = []; if (stroke && !isTransparent(stroke.color) && stroke.width !== 0) { attrs.push(["on", "true"]); attrs.push(["color", stroke.color]); attrs.push(["weight", (stroke.width || 1) + "px"]); this.mapOpacityTo(attrs, stroke.opacity); if (defined(stroke.dashType)) { attrs.push(["dashstyle", stroke.dashType]); } if (defined(stroke.lineJoin)) { attrs.push(["joinstyle", stroke.lineJoin]); } if (defined(stroke.lineCap)) { var lineCap = stroke.lineCap.toLowerCase(); if (lineCap === "butt") { lineCap = lineCap === "butt" ? "flat" : lineCap; } attrs.push(["endcap", lineCap]); } } else { attrs.push(["on", "false"]); } return attrs; } }); var FillNode = Node.extend({ init: function(srcElement, transform, opacity) { this.opacity = opacity; Node.fn.init.call(this, srcElement); }, createElement: function() { this.element = createElementVML("fill"); this.setFill(); }, optionsChange: function(e) { if (fillField(e.field)) { this.setFill(); } }, refreshOpacity: function(opacity) { this.opacity = opacity; this.setOpacity(); }, setFill: function() { this.allAttr(this.mapFill()); }, setOpacity: function() { this.setFill(); }, attr: function(name, value) { var element = this.element; if (element) { var fields = name.split("."); while (fields.length > 1) { element = element[fields.shift()]; } element[fields[0]] = value; } }, mapFill: function() { var fill = this.srcElement.fill(); var attrs = [ ["on", "false"] ]; if (fill) { if (fill.nodeType == GRADIENT) { attrs = this.mapGradient(fill); } else if (!isTransparent(fill.color)) { attrs = this.mapFillColor(fill); } } return attrs; }, mapFillColor: function(fill) { var attrs = [ ["on", "true"], ["color", fill.color] ]; this.mapOpacityTo(attrs, fill.opacity); return attrs; }, mapGradient: function(fill) { var options = this.srcElement.options; var fallbackFill = options.fallbackFill || (fill.fallbackFill && fill.fallbackFill()); var attrs; if (fill instanceof d.LinearGradient) { attrs = this.mapLinearGradient(fill); } else if (fill instanceof d.RadialGradient && fill.supportVML) { attrs = this.mapRadialGradient(fill); } else if (fallbackFill) { attrs = this.mapFillColor(fallbackFill); } else { attrs = [["on", "false"]]; } return attrs; }, mapLinearGradient: function(fill) { var start = fill.start(); var end = fill.end(); var stops = fill.stops; var angle = util.deg(atan2(end.y - start.y, end.x - start.x)); var attrs = [ ["on", "true"], ["type", GRADIENT], ["focus", 0], ["method", "none"], ["angle", 270 - angle] ]; this.addColors(attrs); return attrs; }, mapRadialGradient: function(fill) { var bbox = this.srcElement.rawBBox(); var center = fill.center(); var stops = fill.stops; var focusx = (center.x - bbox.origin.x) / bbox.width(); var focusy = (center.y - bbox.origin.y) / bbox.height(); var attrs = [ ["on", "true"], ["type", "gradienttitle"], ["focus", "100%"], ["focusposition", focusx + " " + focusy], ["method", "none"] ]; this.addColors(attrs); return attrs; }, addColors: function(attrs) { var options = this.srcElement.options; var stopColors = []; var stops = options.fill.stops; var baseColor = options.baseColor; var colorsField = this.element.colors ? "colors.value" : "colors"; var color = stopColor(baseColor, stops[0]); var color2 = stopColor(baseColor, stops[stops.length - 1]); var stop; for (var idx = 0; idx < stops.length; idx++) { stop = stops[idx]; stopColors.push( math.round(stop.offset() * 100) + "% " + stopColor(baseColor, stop) ); } attrs.push([colorsField, stopColors.join(",")], ["color", color], ["color2", color2] ); } }); var TransformNode = Node.extend({ init: function(srcElement, transform) { this.transform = transform; Node.fn.init.call(this, srcElement); }, createElement: function() { this.element = createElementVML("skew"); this.setTransform(); }, optionsChange: function(e) { if (e.field === "transform") { this.refresh(this.srcElement.currentTransform()); } }, refresh: function(transform) { this.transform = transform; this.setTransform(); }, transformOrigin: function() { return "-0.5,-0.5"; }, setTransform: function() { this.allAttr(this.mapTransform()); }, mapTransform: function() { var transform = this.transform; var attrs = [], a, b, c, d, matrix = toMatrix(transform); if (matrix) { matrix.round(TRANSFORM_PRECISION); attrs.push( ["on", "true"], ["matrix", [matrix.a, matrix.c, matrix.b, matrix.d, 0, 0].join(",")], ["offset", matrix.e + "px," + matrix.f + "px"], ["origin", this.transformOrigin()] ); } else { attrs.push(["on", "false"]); } return attrs; } }); var ShapeNode = ObserverNode.extend({ init: function(srcElement, transform, opacity) { this.fill = this.createFillNode(srcElement, transform, opacity); this.stroke = new StrokeNode(srcElement, opacity); this.transform = this.createTransformNode(srcElement, transform); ObserverNode.fn.init.call(this, srcElement); }, attachTo: function(domElement, pos) { this.fill.attachTo(this.element); this.stroke.attachTo(this.element); this.transform.attachTo(this.element); Node.fn.attachTo.call(this, domElement, pos); }, createFillNode: function(srcElement, transform, opacity) { return new FillNode(srcElement, transform, opacity); }, createTransformNode: function(srcElement, transform) { return new TransformNode(srcElement, transform); }, createElement: function() { this.element = createElementVML("shape"); this.setCoordsize(); this.setStyle(); }, optionsChange: function(e) { if (fillField(e.field)) { this.fill.optionsChange(e); } else if (e.field.indexOf("stroke") === 0) { this.stroke.optionsChange(e); } else if (e.field === "transform") { this.transform.optionsChange(e); } else if (e.field === "opacity") { this.fill.setOpacity(); this.stroke.setOpacity(); } ObserverNode.fn.optionsChange.call(this, e); }, refreshTransform: function(transform) { this.transform.refresh(this.srcElement.currentTransform(transform)); }, refreshOpacity: function(opacity) { opacity *= valueOrDefault(this.srcElement.options.opacity, 1); this.fill.refreshOpacity(opacity); this.stroke.refreshOpacity(opacity); }, mapStyle: function(width, height) { var styles = ObserverNode.fn.mapStyle.call(this); if (!width || !height) { width = height = COORDINATE_MULTIPLE; } styles.push( ["position", "absolute"], ["width", width + "px"], ["height", height + "px"] ); var cursor = this.srcElement.options.cursor; if (cursor) { styles.push(["cursor", cursor]); } return styles; }, setCoordsize: function() { this.allAttr([ ["coordorigin", "0 0"], ["coordsize", COORDINATE_SIZE + " " + COORDINATE_SIZE] ]); } }); var PathDataNode = Node.extend({ createElement: function() { this.element = createElementVML("path"); this.setPathData(); }, geometryChange: function() { this.setPathData(); }, setPathData: function() { this.attr("v", this.renderData()); }, renderData: function() { return printPath(this.srcElement); } }); var PathNode = ShapeNode.extend({ init: function(srcElement, transform, opacity) { this.pathData = this.createDataNode(srcElement); ShapeNode.fn.init.call(this, srcElement, transform, opacity); }, attachTo: function(domElement, pos) { this.pathData.attachTo(this.element); ShapeNode.fn.attachTo.call(this, domElement, pos); }, createDataNode: function(srcElement) { return new PathDataNode(srcElement); }, geometryChange: function() { this.pathData.geometryChange(); ShapeNode.fn.geometryChange.call(this); } }); var MultiPathDataNode = PathDataNode.extend({ renderData: function() { var paths = this.srcElement.paths; if (paths.length > 0) { var result = [], i, open; for (i = 0; i < paths.length; i++) { open = i < paths.length - 1; result.push(printPath(paths[i], open)); } return result.join(" "); } } }); var MultiPathNode = PathNode.extend({ createDataNode: function(srcElement) { return new MultiPathDataNode(srcElement); } }); var CircleTransformNode = TransformNode.extend({ transformOrigin: function() { var boundingBox = this.srcElement.geometry().bbox(), center = boundingBox.center(), originX = -ceil(center.x) / ceil(boundingBox.width()), originY = -ceil(center.y) / ceil(boundingBox.height()); return originX + "," + originY; } }); var CircleNode = ShapeNode.extend({ createElement: function() { this.element = createElementVML("oval"); this.setStyle(); }, createTransformNode: function(srcElement, transform) { return new CircleTransformNode(srcElement, transform); }, geometryChange: function() { ShapeNode.fn.geometryChange.call(this); this.setStyle(); this.refreshTransform(); }, mapStyle: function() { var geometry = this.srcElement.geometry(); var radius = geometry.radius; var center = geometry.center; var diameter = ceil(radius * 2); var styles = ShapeNode.fn.mapStyle.call(this, diameter, diameter); styles.push( ["left", ceil(center.x - radius) + "px"], ["top", ceil(center.y - radius) + "px"] ); return styles; } }); var ArcDataNode = PathDataNode.extend({ renderData: function() { return printPath(this.srcElement.toPath()); } }); var ArcNode = PathNode.extend({ createDataNode: function(srcElement) { return new ArcDataNode(srcElement); } }); var TextPathDataNode = PathDataNode.extend({ createElement: function() { PathDataNode.fn.createElement.call(this); this.attr("textpathok", true); }, renderData: function() { var rect = this.srcElement.rect(); var center = rect.center(); return "m " + printPoints([new g.Point(rect.topLeft().x, center.y)]) + " l " + printPoints([new g.Point(rect.bottomRight().x, center.y)]); } }); var TextPathNode = Node.extend({ createElement: function() { this.element = createElementVML("textpath"); this.attr("on", true); this.attr("fitpath", false); this.setStyle(); this.setString(); }, optionsChange: function(e) { if (e.field === "content") { this.setString(); } else { this.setStyle(); } Node.fn.optionsChange.call(this, e); }, mapStyle: function() { return [["font", this.srcElement.options.font]]; }, setString: function() { this.attr("string", this.srcElement.content()); } }); var TextNode = PathNode.extend({ init: function(srcElement, transform, opacity) { this.path = new TextPathNode(srcElement); PathNode.fn.init.call(this, srcElement, transform, opacity); }, createDataNode: function(srcElement) { return new TextPathDataNode(srcElement); }, attachTo: function(domElement, pos) { this.path.attachTo(this.element); PathNode.fn.attachTo.call(this, domElement, pos); }, optionsChange: function(e) { if(e.field === "font" || e.field === "content") { this.path.optionsChange(e); this.pathData.geometryChange(e); } PathNode.fn.optionsChange.call(this, e); } }); var ImagePathDataNode = PathDataNode.extend({ renderData: function() { var rect = this.srcElement.rect(); var path = new d.Path().moveTo(rect.topLeft()) .lineTo(rect.topRight()) .lineTo(rect.bottomRight()) .lineTo(rect.bottomLeft()) .close(); return printPath(path); } }); var ImageFillNode = TransformNode.extend({ init: function(srcElement, transform, opacity) { this.opacity = opacity; TransformNode.fn.init.call(this, srcElement, transform); }, createElement: function() { this.element = createElementVML("fill"); this.attr("type", "frame"); this.attr("rotate", true); this.setOpacity(); this.setSrc(); this.setTransform(); }, optionsChange: function(e) { if (e.field === "src") { this.setSrc(); } TransformNode.fn.optionsChange.call(this, e); }, geometryChange: function() { this.refresh(); }, refreshOpacity: function(opacity) { this.opacity = opacity; this.setOpacity(); }, setOpacity: function() { var attrs = []; this.mapOpacityTo(attrs, this.srcElement.options.opacity); this.allAttr(attrs); }, setSrc: function() { this.attr("src", this.srcElement.src()); }, mapTransform: function() { var img = this.srcElement; var rawbbox = img.rawBBox(); var rawcenter = rawbbox.center(); var fillOrigin = COORDINATE_MULTIPLE / 2; var fillSize = COORDINATE_MULTIPLE; var x; var y; var width = rawbbox.width() / fillSize; var height = rawbbox.height() / fillSize; var angle = 0; var transform = this.transform; if (transform) { var matrix = toMatrix(transform); var sx = sqrt(matrix.a * matrix.a + matrix.b * matrix.b); var sy = sqrt(matrix.c * matrix.c + matrix.d * matrix.d); width *= sx; height *= sy; var ax = deg(atan2(matrix.b, matrix.d)); var ay = deg(atan2(-matrix.c, matrix.a)); angle = (ax + ay) / 2; if (angle !== 0) { var center = img.bbox().center(); x = (center.x - fillOrigin) / fillSize; y = (center.y - fillOrigin) / fillSize; } else { x = (rawcenter.x * sx + matrix.e - fillOrigin) / fillSize; y = (rawcenter.y * sy + matrix.f - fillOrigin) / fillSize; } } else { x = (rawcenter.x - fillOrigin) / fillSize; y = (rawcenter.y - fillOrigin) / fillSize; } width = round(width, TRANSFORM_PRECISION); height = round(height, TRANSFORM_PRECISION); x = round(x, TRANSFORM_PRECISION); y = round(y, TRANSFORM_PRECISION); angle = round(angle, TRANSFORM_PRECISION); return [ ["size", width + "," + height], ["position", x + "," + y], ["angle", angle] ]; } }); var ImageNode = PathNode.extend({ createFillNode: function(srcElement, transform, opacity) { return new ImageFillNode(srcElement, transform, opacity); }, createDataNode: function(srcElement) { return new ImagePathDataNode(srcElement); }, optionsChange: function(e) { if (e.field === "src" || e.field === "transform") { this.fill.optionsChange(e); } PathNode.fn.optionsChange.call(this, e); }, geometryChange: function() { this.fill.geometryChange(); PathNode.fn.geometryChange.call(this); }, refreshTransform: function(transform) { PathNode.fn.refreshTransform.call(this, transform); this.fill.refresh(this.srcElement.currentTransform(transform)); } }); var nodeMap = { Group: GroupNode, Text: TextNode, Path: PathNode, MultiPath: MultiPathNode, Circle: CircleNode, Arc: ArcNode, Image: ImageNode }; // Helper functions ======================================================= function enableVML() { if (doc.namespaces && !doc.namespaces.kvml) { doc.namespaces.add("kvml", "urn:schemas-microsoft-com:vml"); var stylesheet = doc.styleSheets.length > 30 ? doc.styleSheets[0] : doc.createStyleSheet(); stylesheet.addRule(".kvml", "behavior:url(#default#VML)"); } } function createElementVML(type) { var element = doc.createElement("kvml:" + type); element.className = "kvml"; return element; } function printPoints(points) { var length = points.length; var result = []; for (var i = 0; i < length; i++) { result.push(points[i] .scaleCopy(COORDINATE_MULTIPLE) .toString(0, ",") ); } return result.join(" "); } function printPath(path, open) { var segments = path.segments, length = segments.length; if (length > 0) { var parts = [], output, type, currentType, i; for (i = 1; i < length; i++) { type = segmentType(segments[i - 1], segments[i]); if (type !== currentType) { currentType = type; parts.push(type); } if (type === "l") { parts.push(printPoints([segments[i].anchor()])); } else { parts.push(printPoints([ segments[i - 1].controlOut(), segments[i].controlIn(), segments[i].anchor() ])); } } output = "m " + printPoints([segments[0].anchor()]) + " " + parts.join(" "); if (path.options.closed) { output += " x"; } if (open !== true) { output += " e"; } return output; } } function segmentType(segmentStart, segmentEnd) { return segmentStart.controlOut() && segmentEnd.controlIn() ? "c" : "l"; } function fillField(field) { return field.indexOf("fill") === 0 || field.indexOf(GRADIENT) === 0; } function stopColor(baseColor, stop) { var color; if (baseColor) { color = blendColors(baseColor, stop.color(), stop.opacity()); } else { color = blendColors(stop.color(), "#fff", 1 - stop.opacity()); } return color; } function blendColors(base, overlay, alpha) { var baseColor = new Color(base), overlayColor = new Color(overlay), r = blendChannel(baseColor.r, overlayColor.r, alpha), g = blendChannel(baseColor.g, overlayColor.g, alpha), b = blendChannel(baseColor.b, overlayColor.b, alpha); return new Color(r, g, b).toHex(); } function blendChannel(a, b, alpha) { return math.round(alpha * b + (1 - alpha) * a); } // Exports ================================================================ kendo.support.vml = (function() { var browser = kendo.support.browser; return browser.msie && browser.version < 9; })(); var EMPTY_CLIP = "inherit"; if (kendo.support.browser.msie && kendo.support.browser.version < 8) { EMPTY_CLIP = "rect(auto auto auto auto)"; } if (kendo.support.vml) { d.SurfaceFactory.current.register("vml", Surface, 30); } deepExtend(d, { vml: { ArcDataNode: ArcDataNode, ArcNode: ArcNode, CircleTransformNode: CircleTransformNode, CircleNode: CircleNode, FillNode: FillNode, GroupNode: GroupNode, ImageNode: ImageNode, ImageFillNode: ImageFillNode, ImagePathDataNode: ImagePathDataNode, MultiPathDataNode: MultiPathDataNode, MultiPathNode: MultiPathNode, Node: Node, PathDataNode: PathDataNode, PathNode: PathNode, RootNode: RootNode, StrokeNode: StrokeNode, Surface: Surface, TextNode: TextNode, TextPathNode: TextPathNode, TextPathDataNode: TextPathDataNode, TransformNode: TransformNode } }); })(window.kendo.jQuery); (function(global, parseFloat, undefined){ "use strict"; // WARNING: removing the following jshint declaration and turning // == into === to make JSHint happy will break functionality. /* jshint eqnull:true */ /* jshint -W069 */ /* jshint loopfunc:true */ /* jshint newcap:false */ /* global VBArray */ var kendo = global.kendo; // XXX: remove this junk (assume `true`) when we no longer have to support IE < 10 var HAS_TYPED_ARRAYS = !!global.Uint8Array; var NL = "\n"; var RESOURCE_COUNTER = 0; var BASE64 = (function(){ var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; return { decode: function(str) { var input = str.replace(/[^A-Za-z0-9\+\/\=]/g, ""), i = 0, n = input.length, output = []; while (i < n) { var enc1 = keyStr.indexOf(input.charAt(i++)); var enc2 = keyStr.indexOf(input.charAt(i++)); var enc3 = keyStr.indexOf(input.charAt(i++)); var enc4 = keyStr.indexOf(input.charAt(i++)); var chr1 = (enc1 << 2) | (enc2 >>> 4); var chr2 = ((enc2 & 15) << 4) | (enc3 >>> 2); var chr3 = ((enc3 & 3) << 6) | enc4; output.push(chr1); if (enc3 != 64) { output.push(chr2); } if (enc4 != 64) { output.push(chr3); } } return output; }, encode: function(bytes) { var i = 0, n = bytes.length; var output = ""; while (i < n) { var chr1 = bytes[i++]; var chr2 = bytes[i++]; var chr3 = bytes[i++]; var enc1 = chr1 >>> 2; var enc2 = ((chr1 & 3) << 4) | (chr2 >>> 4); var enc3 = ((chr2 & 15) << 2) | (chr3 >>> 6); var enc4 = chr3 & 63; if (i - n == 2) { enc3 = enc4 = 64; } else if (i - n == 1) { enc4 = 64; } output += keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); } return output; } }; }()); var PAPER_SIZE = { a0 : [ 2383.94 , 3370.39 ], a1 : [ 1683.78 , 2383.94 ], a2 : [ 1190.55 , 1683.78 ], a3 : [ 841.89 , 1190.55 ], a4 : [ 595.28 , 841.89 ], a5 : [ 419.53 , 595.28 ], a6 : [ 297.64 , 419.53 ], a7 : [ 209.76 , 297.64 ], a8 : [ 147.40 , 209.76 ], a9 : [ 104.88 , 147.40 ], a10 : [ 73.70 , 104.88 ], b0 : [ 2834.65 , 4008.19 ], b1 : [ 2004.09 , 2834.65 ], b2 : [ 1417.32 , 2004.09 ], b3 : [ 1000.63 , 1417.32 ], b4 : [ 708.66 , 1000.63 ], b5 : [ 498.90 , 708.66 ], b6 : [ 354.33 , 498.90 ], b7 : [ 249.45 , 354.33 ], b8 : [ 175.75 , 249.45 ], b9 : [ 124.72 , 175.75 ], b10 : [ 87.87 , 124.72 ], c0 : [ 2599.37 , 3676.54 ], c1 : [ 1836.85 , 2599.37 ], c2 : [ 1298.27 , 1836.85 ], c3 : [ 918.43 , 1298.27 ], c4 : [ 649.13 , 918.43 ], c5 : [ 459.21 , 649.13 ], c6 : [ 323.15 , 459.21 ], c7 : [ 229.61 , 323.15 ], c8 : [ 161.57 , 229.61 ], c9 : [ 113.39 , 161.57 ], c10 : [ 79.37 , 113.39 ], executive : [ 521.86 , 756.00 ], folio : [ 612.00 , 936.00 ], legal : [ 612.00 , 1008.00 ], letter : [ 612.00 , 792.00 ], tabloid : [ 792.00 , 1224.00 ] }; function makeOutput() { var indentLevel = 0, output = BinaryStream(); function out() { for (var i = 0; i < arguments.length; ++i) { var x = arguments[i]; if (x === undefined) { throw new Error("Cannot output undefined to PDF"); } else if (x instanceof PDFValue) { x.beforeRender(out); x.render(out); } else if (isArray(x)) { renderArray(x, out); } else if (isDate(x)) { renderDate(x, out); } else if (typeof x == "number") { if (isNaN(x)) { throw new Error("Cannot output NaN to PDF"); } // make sure it doesn't end up in exponent notation var num = x.toFixed(7); if (num.indexOf(".") >= 0) { num = num.replace(/\.?0+$/, ""); } if (num == "-0") { num = "0"; } output.writeString(num); } else if (/string|boolean/.test(typeof x)) { output.writeString(x+""); } else if (typeof x.get == "function") { output.write(x.get()); } else if (typeof x == "object") { if (!x) { output.writeString("null"); } else { out(new PDFDictionary(x)); } } } } out.writeData = function(data) { output.write(data); }; out.withIndent = function(f) { ++indentLevel; f(out); --indentLevel; }; out.indent = function() { out(NL, pad("", indentLevel * 2, " ")); out.apply(null, arguments); }; out.offset = function() { return output.offset(); }; out.toString = function() { throw new Error("FIX CALLER"); }; out.get = function() { return output.get(); }; out.stream = function() { return output; }; return out; } function wrapObject(value, id) { var beforeRender = value.beforeRender; var renderValue = value.render; value.beforeRender = function(){}; value.render = function(out) { out(id, " 0 R"); }; value.renderFull = function(out) { value._offset = out.offset(); out(id, " 0 obj "); beforeRender.call(value, out); renderValue.call(value, out); out(" endobj"); }; } function PDFDocument(options) { var self = this; var out = makeOutput(); var objcount = 0; var objects = []; function getOption(name, defval) { return (options && options[name] != null) ? options[name] : defval; } self.getOption = getOption; self.attach = function(value) { if (objects.indexOf(value) < 0) { wrapObject(value, ++objcount); objects.push(value); } return value; }; self.pages = []; self.FONTS = {}; self.IMAGES = {}; self.GRAD_COL_FUNCTIONS = {}; // cache for color gradient functions self.GRAD_OPC_FUNCTIONS = {}; // cache for opacity gradient functions self.GRAD_COL = {}; // cache for whole color gradient objects self.GRAD_OPC = {}; // cache for whole opacity gradient objects function getPaperOptions(getOption) { var paperSize = getOption("paperSize", PAPER_SIZE.a4); if (!paperSize) { return {}; } if (typeof paperSize == "string") { paperSize = PAPER_SIZE[paperSize.toLowerCase()]; if (paperSize == null) { throw new Error("Unknown paper size"); } } paperSize[0] = unitsToPoints(paperSize[0]); paperSize[1] = unitsToPoints(paperSize[1]); if (getOption("landscape", false)) { paperSize = [ Math.max(paperSize[0], paperSize[1]), Math.min(paperSize[0], paperSize[1]) ]; } var margin = getOption("margin"); if (margin) { if (typeof margin == "string") { margin = unitsToPoints(margin, 0); margin = { left: margin, top: margin, right: margin, bottom: margin }; } else { margin.left = unitsToPoints(margin.left, 0); margin.top = unitsToPoints(margin.top, 0); margin.right = unitsToPoints(margin.right, 0); margin.bottom = unitsToPoints(margin.bottom, 0); } if (getOption("addMargin")) { paperSize[0] += margin.left + margin.right; paperSize[1] += margin.top + margin.bottom; } } return { paperSize: paperSize, margin: margin }; } var catalog = self.attach(new PDFCatalog()); var pageTree = self.attach(new PDFPageTree()); catalog.setPages(pageTree); self.addPage = function(options) { var paperOptions = getPaperOptions(function(name, defval){ return (options && options[name] != null) ? options[name] : defval; }); var paperSize = paperOptions.paperSize; var margin = paperOptions.margin; var contentWidth = paperSize[0]; var contentHeight = paperSize[1]; if (margin) { contentWidth -= margin.left + margin.right; contentHeight -= margin.top + margin.bottom; } var content = new PDFStream(makeOutput(), null, true); var props = { Contents : self.attach(content), Parent : pageTree, MediaBox : [ 0, 0, paperSize[0], paperSize[1] ] }; var page = new PDFPage(self, props); page._content = content; pageTree.addPage(self.attach(page)); // canvas-like coord. system. (0,0) is upper-left. // text must be vertically mirorred before drawing. page.transform(1, 0, 0, -1, 0, paperSize[1]); if (margin) { page.translate(margin.left, margin.top); // XXX: clip to right/bottom margin. Make this optional? page.rect(0, 0, contentWidth, contentHeight); page.clip(); } self.pages.push(page); return page; }; self.render = function() { var i; /// file header out("%PDF-1.4", NL, "%\xc2\xc1\xda\xcf\xce", NL, NL); /// file body for (i = 0; i < objects.length; ++i) { objects[i].renderFull(out); out(NL, NL); } /// cross-reference table var xrefOffset = out.offset(); out("xref", NL, 0, " ", objects.length + 1, NL); out("0000000000 65535 f ", NL); for (i = 0; i < objects.length; ++i) { out(zeropad(objects[i]._offset, 10), " 00000 n ", NL); } out(NL); /// trailer out("trailer", NL); out(new PDFDictionary({ Size: objects.length + 1, Root: catalog, Info: new PDFDictionary({ Producer : new PDFString("Kendo UI PDF Generator"), Title : new PDFString(getOption("title", "")), Author : new PDFString(getOption("author", "")), Subject : new PDFString(getOption("subject", "")), Keywords : new PDFString(getOption("keywords", "")), Creator : new PDFString(getOption("creator", "Kendo UI PDF Generator")), CreationDate : getOption("date", new Date()) }) }), NL, NL); /// end out("startxref", NL, xrefOffset, NL); out("%%EOF", NL); return out.stream().offset(0); }; } var FONT_CACHE = { "Times-Roman" : true, "Times-Bold" : true, "Times-Italic" : true, "Times-BoldItalic" : true, "Helvetica" : true, "Helvetica-Bold" : true, "Helvetica-Oblique" : true, "Helvetica-BoldOblique" : true, "Courier" : true, "Courier-Bold" : true, "Courier-Oblique" : true, "Courier-BoldOblique" : true, "Symbol" : true, "ZapfDingbats" : true }; function loadBinary(url, cont) { function error() { if (global.console) { if (global.console.error) { global.console.error("Cannot load URL: %s", url); } else { global.console.log("Cannot load URL: %s", url); } } cont(null); } var req = new XMLHttpRequest(); req.open('GET', url, true); if (HAS_TYPED_ARRAYS) { req.responseType = "arraybuffer"; } req.onload = function() { if (req.status == 200 || req.status == 304) { if (HAS_TYPED_ARRAYS) { cont(new Uint8Array(req.response)); } else { cont(new VBArray(req.responseBody).toArray()); // IE9 only } } else { error(); } }; req.onerror = error; req.send(null); } function loadFont(url, cont) { var font = FONT_CACHE[url]; if (font) { cont(font); } else { loadBinary(url, function(data){ if (data == null) { throw new Error("Cannot load font from " + url); } else { var font = new kendo.pdf.TTFFont(data); FONT_CACHE[url] = font; cont(font); } }); } } var IMAGE_CACHE = {}; function loadImage(url, cont) { var img = IMAGE_CACHE[url]; if (img) { cont(img); } else { img = new Image(); if (!(/^data:/i.test(url))) { img.crossOrigin = "Anonymous"; } img.src = url; var onload = function() { var canvas = document.createElement("canvas"); canvas.width = img.width; canvas.height = img.height; var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0); var imgdata; try { imgdata = ctx.getImageData(0, 0, img.width, img.height); } catch(ex) { // it tainted the canvas -- can't draw it. return cont(IMAGE_CACHE[url] = "TAINTED"); } // in case it contains transparency, we must separate rgb data from the alpha // channel and create a PDFRawImage image with opacity. otherwise we can use a // PDFJpegImage. // // to do this in one step, we create the rgb and alpha streams anyway, even if // we might end up not using them if hasAlpha remains false. var hasAlpha = false, rgb = BinaryStream(), alpha = BinaryStream(); var rawbytes = imgdata.data; var i = 0; while (i < rawbytes.length) { rgb.writeByte(rawbytes[i++]); rgb.writeByte(rawbytes[i++]); rgb.writeByte(rawbytes[i++]); var a = rawbytes[i++]; if (a < 255) { hasAlpha = true; } alpha.writeByte(a); } if (hasAlpha) { img = new PDFRawImage(img.width, img.height, rgb, alpha); } else { // no transparency, encode as JPEG. var data = canvas.toDataURL("image/jpeg"); data = data.substr(data.indexOf(";base64,") + 8); var stream = BinaryStream(); stream.writeBase64(data); stream.offset(0); img = new PDFJpegImage(img.width, img.height, stream); } cont(IMAGE_CACHE[url] = img); }; if (img.complete) { onload(); } else { img.onload = onload; img.onerror = function(ev) { cont(IMAGE_CACHE[url] = "TAINTED"); }; } } } function manyLoader(loadOne) { return function(urls, callback) { var n = urls.length, i = n; if (n === 0) { return callback(); } while (i-- > 0) { loadOne(urls[i], function(){ if (--n === 0) { callback(); } }); } }; } var loadFonts = manyLoader(loadFont); var loadImages = manyLoader(loadImage); PDFDocument.prototype = { loadFonts: loadFonts, loadImages: loadImages, getFont: function(url) { var font = this.FONTS[url]; if (!font) { font = FONT_CACHE[url]; if (!font) { throw new Error("Font " + url + " has not been loaded"); } if (font === true) { font = this.attach(new PDFStandardFont(url)); } else { font = this.attach(new PDFFont(this, font)); } this.FONTS[url] = font; } return font; }, getImage: function(url) { var img = this.IMAGES[url]; if (!img) { img = IMAGE_CACHE[url]; if (!img) { throw new Error("Image " + url + " has not been loaded"); } if (img === "TAINTED") { return null; } img = this.IMAGES[url] = this.attach(img.asStream(this)); } return img; }, getOpacityGS: function(opacity, forStroke) { var id = parseFloat(opacity).toFixed(3); opacity = parseFloat(id); id += forStroke ? "S" : "F"; var cache = this._opacityGSCache || (this._opacityGSCache = {}); var gs = cache[id]; if (!gs) { var props = { Type: _("ExtGState") }; if (forStroke) { props.CA = opacity; } else { props.ca = opacity; } gs = this.attach(new PDFDictionary(props)); gs._resourceName = _("GS" + (++RESOURCE_COUNTER)); cache[id] = gs; } return gs; }, dict: function(props) { return new PDFDictionary(props); }, name: function(str) { return _(str); }, stream: function(props, content) { return new PDFStream(content, props); } }; /* -----[ utils ]----- */ function pad(str, len, ch) { while (str.length < len) { str = ch + str; } return str; } function zeropad(n, len) { return pad(n+"", len, "0"); } function hasOwnProperty(obj, key) { return Object.prototype.hasOwnProperty.call(obj, key); } var isArray = Array.isArray || function(obj) { return obj instanceof Array; }; function isDate(obj) { return obj instanceof Date; } function renderArray(a, out) { out("["); if (a.length > 0) { out.withIndent(function(){ for (var i = 0; i < a.length; ++i) { if (i > 0 && i % 8 === 0) { out.indent(a[i]); } else { out(" ", a[i]); } } }); //out.indent(); } out(" ]"); } function renderDate(date, out) { out("(D:", zeropad(date.getUTCFullYear(), 4), zeropad(date.getUTCMonth() + 1, 2), zeropad(date.getUTCDate(), 2), zeropad(date.getUTCHours(), 2), zeropad(date.getUTCMinutes(), 2), zeropad(date.getUTCSeconds(), 2), "Z)"); } function mm2pt(mm) { return mm * (72/25.4); } function cm2pt(cm) { return mm2pt(cm * 10); } function in2pt(inch) { return inch * 72; } function unitsToPoints(x, def) { if (typeof x == "number") { return x; } if (typeof x == "string") { var m; m = /^\s*([0-9.]+)\s*(mm|cm|in|pt)\s*$/.exec(x); if (m) { var num = parseFloat(m[1]); if (!isNaN(num)) { if (m[2] == "pt") { return num; } return { "mm": mm2pt, "cm": cm2pt, "in": in2pt }[m[2]](num); } } } if (def != null) { return def; } throw new Error("Can't parse unit: " + x); } /* -----[ PDF basic objects ]----- */ function PDFValue(){} PDFValue.prototype.beforeRender = function(){}; function defclass(Ctor, proto, Base) { if (!Base) { Base = PDFValue; } Ctor.prototype = new Base(); for (var i in proto) { if (hasOwnProperty(proto, i)) { Ctor.prototype[i] = proto[i]; } } return Ctor; } /// strings var PDFString = defclass(function PDFString(value){ this.value = value; }, { render: function(out) { //out("(\xFE\xFF", utf16_be_encode(this.escape()), ")"); var txt = "", esc = this.escape(); for (var i = 0; i < esc.length; ++i) { txt += String.fromCharCode(esc.charCodeAt(i) & 0xFF); } out("(", txt, ")"); }, escape: function() { return this.value.replace(/([\(\)\\])/g, "\\$1"); }, toString: function() { return this.value; } }); var PDFHexString = defclass(function PDFHexString(value){ this.value = value; }, { render: function(out) { out("<"); for (var i = 0; i < this.value.length; ++i) { out(zeropad(this.value.charCodeAt(i).toString(16), 4)); } out(">"); } }, PDFString); /// names var PDFName = defclass(function PDFName(name) { this.name = name; }, { render: function(out) { out("/" + this.escape()); }, escape: function() { return this.name.replace(/[^\x21-\x7E]/g, function(c){ return "#" + zeropad(c.charCodeAt(0).toString(16), 2); }); }, toString: function() { return this.name; } }); var PDFName_cache = {}; PDFName.get = _; function _(name) { if (hasOwnProperty(PDFName_cache, name)) { return PDFName_cache[name]; } return (PDFName_cache[name] = new PDFName(name)); } /// dictionary var PDFDictionary = defclass(function PDFDictionary(props) { this.props = props; }, { render: function(out) { var props = this.props, empty = true; out("<<"); out.withIndent(function(){ for (var i in props) { if (hasOwnProperty(props, i) && !/^_/.test(i)) { empty = false; out.indent(_(i), " ", props[i]); } } }); if (!empty) { out.indent(); } out(">>"); } }); /// streams var PDFStream = defclass(function PDFStream(data, props, compress) { if (typeof data == "string") { var tmp = BinaryStream(); tmp.write(data); data = tmp; } this.data = data; this.props = props || {}; this.compress = compress; }, { render: function(out) { var data = this.data.get(), props = this.props; if (this.compress && global.pako && typeof global.pako.deflate == "function") { if (!props.Filter) { props.Filter = []; } else if (!(props.Filter instanceof Array)) { props.Filter = [ props.Filter ]; } props.Filter.unshift(_("FlateDecode")); data = global.pako.deflate(data); } props.Length = data.length; out(new PDFDictionary(props), " stream", NL); out.writeData(data); out(NL, "endstream"); } }); /// catalog var PDFCatalog = defclass(function PDFCatalog(props){ props = this.props = props || {}; props.Type = _("Catalog"); }, { setPages: function(pagesObj) { this.props.Pages = pagesObj; } }, PDFDictionary); /// page tree var PDFPageTree = defclass(function PDFPageTree(){ this.props = { Type : _("Pages"), Kids : [], Count : 0 }; }, { addPage: function(pageObj) { this.props.Kids.push(pageObj); this.props.Count++; } }, PDFDictionary); /// images // JPEG function PDFJpegImage(width, height, data) { this.asStream = function() { var stream = new PDFStream(data, { Type : _("XObject"), Subtype : _("Image"), Width : width, Height : height, BitsPerComponent : 8, ColorSpace : _("DeviceRGB"), Filter : _("DCTDecode") }); stream._resourceName = _("I" + (++RESOURCE_COUNTER)); return stream; }; } // PDFRawImage will be used for images with transparency (PNG) function PDFRawImage(width, height, rgb, alpha) { this.asStream = function(pdf) { var mask = new PDFStream(alpha, { Type : _("XObject"), Subtype : _("Image"), Width : width, Height : height, BitsPerComponent : 8, ColorSpace : _("DeviceGray") }, true); var stream = new PDFStream(rgb, { Type : _("XObject"), Subtype : _("Image"), Width : width, Height : height, BitsPerComponent : 8, ColorSpace : _("DeviceRGB"), SMask : pdf.attach(mask) }, true); stream._resourceName = _("I" + (++RESOURCE_COUNTER)); return stream; }; } /// standard fonts var PDFStandardFont = defclass(function PDFStandardFont(name){ this.props = { Type : _("Font"), Subtype : _("Type1"), BaseFont : _(name) }; this._resourceName = _("F" + (++RESOURCE_COUNTER)); }, { encodeText: function(str) { return new PDFString(str+""); } }, PDFDictionary); /// TTF fonts var PDFFont = defclass(function PDFFont(pdf, font, props){ props = this.props = props || {}; props.Type = _("Font"); props.Subtype = _("Type0"); props.Encoding = _("Identity-H"); this._pdf = pdf; this._font = font; this._sub = font.makeSubset(); this._resourceName = _("F" + (++RESOURCE_COUNTER)); var head = font.head; this.name = font.psName; var scale = this.scale = font.scale; this.bbox = [ head.xMin * scale, head.yMin * scale, head.xMax * scale, head.yMax * scale ]; this.italicAngle = font.post.italicAngle; this.ascent = font.ascent * scale; this.descent = font.descent * scale; this.lineGap = font.lineGap * scale; this.capHeight = font.os2.capHeight || this.ascent; this.xHeight = font.os2.xHeight || 0; this.stemV = 0; this.familyClass = (font.os2.familyClass || 0) >> 8; this.isSerif = this.familyClass >= 1 && this.familyClass <= 7; this.isScript = this.familyClass == 10; this.flags = ((font.post.isFixedPitch ? 1 : 0) | (this.isSerif ? 1 << 1 : 0) | (this.isScript ? 1 << 3 : 0) | (this.italicAngle !== 0 ? 1 << 6 : 0) | (1 << 5)); }, { encodeText: function(text) { return new PDFHexString(this._sub.encodeText(text+"")); }, beforeRender: function() { var self = this; var font = self._font; var sub = self._sub; // write the TTF data var data = sub.render(); var fontStream = new PDFStream(BinaryStream(data), { Length1: data.length }, true); var descriptor = self._pdf.attach(new PDFDictionary({ Type : _("FontDescriptor"), FontName : _(self._sub.psName), FontBBox : self.bbox, Flags : self.flags, StemV : self.stemV, ItalicAngle : self.italicAngle, Ascent : self.ascent, Descent : self.descent, CapHeight : self.capHeight, XHeight : self.xHeight, FontFile2 : self._pdf.attach(fontStream) })); var cmap = sub.ncid2ogid; var firstChar = sub.firstChar; var lastChar = sub.lastChar; var charWidths = []; (function loop(i, chunk){ if (i <= lastChar) { var gid = cmap[i]; if (gid == null) { loop(i + 1); } else { if (!chunk) { charWidths.push(i, chunk = []); } chunk.push(self._font.widthOfGlyph(gid)); loop(i + 1, chunk); } } })(firstChar); // As if two dictionaries weren't enough, we need another // one, the "descendant font". Only that one can be of // Subtype CIDFontType2. PDF is the X11 of document // formats: portable but full of legacy that nobody cares // about anymore. var descendant = new PDFDictionary({ Type: _("Font"), Subtype: _("CIDFontType2"), BaseFont: _(self._sub.psName), CIDSystemInfo: new PDFDictionary({ Registry : new PDFString("Adobe"), Ordering : new PDFString("Identity"), Supplement : 0 }), FontDescriptor: descriptor, FirstChar: firstChar, LastChar: lastChar, DW: Math.round(self._font.widthOfGlyph(0)), W: charWidths, CIDToGIDMap: self._pdf.attach(self._makeCidToGidMap()) }); var dict = self.props; dict.BaseFont = _(self._sub.psName); dict.DescendantFonts = [ self._pdf.attach(descendant) ]; // Compute the ToUnicode map so that apps can extract // meaningful text from the PDF. var unimap = new PDFToUnicodeCmap(firstChar, lastChar, sub.subset); var unimapStream = new PDFStream(makeOutput(), null, true); unimapStream.data(unimap); dict.ToUnicode = self._pdf.attach(unimapStream); }, _makeCidToGidMap: function() { return new PDFStream(BinaryStream(this._sub.cidToGidMap()), null, true); } }, PDFDictionary); var PDFToUnicodeCmap = defclass(function PDFUnicodeCMap(firstChar, lastChar, map){ this.firstChar = firstChar; this.lastChar = lastChar; this.map = map; }, { render: function(out) { out.indent("/CIDInit /ProcSet findresource begin"); out.indent("12 dict begin"); out.indent("begincmap"); out.indent("/CIDSystemInfo <<"); out.indent(" /Registry (Adobe)"); out.indent(" /Ordering (UCS)"); out.indent(" /Supplement 0"); out.indent(">> def"); out.indent("/CMapName /Adobe-Identity-UCS def"); out.indent("/CMapType 2 def"); out.indent("1 begincodespacerange"); out.indent(" <0000>"); out.indent("endcodespacerange"); var self = this; out.indent(self.lastChar - self.firstChar + 1, " beginbfchar"); out.withIndent(function(){ for (var code = self.firstChar; code <= self.lastChar; ++code) { var unicode = self.map[code]; out.indent("<", zeropad(code.toString(16), 4), ">", "<", zeropad(unicode.toString(16), 4), ">"); } }); out.indent("endbfchar"); out.indent("endcmap"); out.indent("CMapName currentdict /CMap defineresource pop"); out.indent("end"); out.indent("end"); } }); /// gradients function makeHash(a) { return a.map(function(x){ return isArray(x) ? makeHash(x) : typeof x == "number" ? (Math.round(x * 1000) / 1000).toFixed(3) : x; }).join(" "); } function cacheColorGradientFunction(pdf, r1, g1, b1, r2, g2, b2) { var hash = makeHash([ r1, g1, b1, r2, g2, b2 ]); var func = pdf.GRAD_COL_FUNCTIONS[hash]; if (!func) { func = pdf.GRAD_COL_FUNCTIONS[hash] = pdf.attach(new PDFDictionary({ FunctionType: 2, Domain: [ 0, 1 ], Range: [ 0, 1, 0, 1, 0, 1 ], N: 1, C0: [ r1 , g1 , b1 ], C1: [ r2 , g2 , b2 ] })); } return func; } function cacheOpacityGradientFunction(pdf, a1, a2) { var hash = makeHash([ a1, a2 ]); var func = pdf.GRAD_OPC_FUNCTIONS[hash]; if (!func) { func = pdf.GRAD_OPC_FUNCTIONS[hash] = pdf.attach(new PDFDictionary({ FunctionType: 2, Domain: [ 0, 1 ], Range: [ 0, 1 ], N: 1, C0: [ a1 ], C1: [ a2 ] })); } return func; } function makeGradientFunctions(pdf, stops) { var hasAlpha = false; var opacities = []; var colors = []; var offsets = []; var encode = []; var i, prev, cur, prevColor, curColor; for (i = 1; i < stops.length; ++i) { prev = stops[i - 1]; cur = stops[i]; prevColor = prev.color; curColor = cur.color; colors.push(cacheColorGradientFunction( pdf, prevColor.r, prevColor.g, prevColor.b, curColor.r, curColor.g, curColor.b )); if (prevColor.a < 1 || curColor.a < 1) { hasAlpha = true; } offsets.push(cur.offset); encode.push(0, 1); } if (hasAlpha) { for (i = 1; i < stops.length; ++i) { prev = stops[i - 1]; cur = stops[i]; prevColor = prev.color; curColor = cur.color; opacities.push(cacheOpacityGradientFunction( pdf, prevColor.a, curColor.a )); } } offsets.pop(); return { hasAlpha : hasAlpha, colors : assemble(colors), opacities : hasAlpha ? assemble(opacities) : null }; function assemble(funcs) { if (funcs.length == 1) { return funcs[0]; } return { FunctionType: 3, Functions: funcs, Domain: [ 0, 1 ], Bounds: offsets, Encode: encode }; } } function cacheColorGradient(pdf, isRadial, stops, coords, funcs, box) { var shading, hash; // if box is given then we have user-space coordinates, which // means the gradient is designed for a certain position/size // on page. caching won't do any good. if (!box) { var a = [ isRadial ].concat(coords); stops.forEach(function(x){ a.push(x.offset, x.color.r, x.color.g, x.color.b); }); hash = makeHash(a); shading = pdf.GRAD_COL[hash]; } if (!shading) { shading = new PDFDictionary({ Type: _("Shading"), ShadingType: isRadial ? 3 : 2, ColorSpace: _("DeviceRGB"), Coords: coords, Domain: [ 0, 1 ], Function: funcs, Extend: [ true, true ] }); pdf.attach(shading); shading._resourceName = "S" + (++RESOURCE_COUNTER); if (hash) { pdf.GRAD_COL[hash] = shading; } } return shading; } function cacheOpacityGradient(pdf, isRadial, stops, coords, funcs, box) { var opacity, hash; // if box is given then we have user-space coordinates, which // means the gradient is designed for a certain position/size // on page. caching won't do any good. if (!box) { var a = [ isRadial ].concat(coords); stops.forEach(function(x){ a.push(x.offset, x.color.a); }); hash = makeHash(a); opacity = pdf.GRAD_OPC[hash]; } if (!opacity) { opacity = new PDFDictionary({ Type: _("ExtGState"), AIS: false, CA: 1, ca: 1, SMask: { Type: _("Mask"), S: _("Luminosity"), G: pdf.attach(new PDFStream("/a0 gs /s0 sh", { Type: _("XObject"), Subtype: _("Form"), FormType: 1, BBox: (box ? [ box.left, box.top + box.height, box.left + box.width, box.top ] : [ 0, 1, 1, 0 ]), Group: { Type: _("Group"), S: _("Transparency"), CS: _("DeviceGray"), I: true }, Resources: { ExtGState: { a0: { CA: 1, ca: 1 } }, Shading: { s0: { ColorSpace: _("DeviceGray"), Coords: coords, Domain: [ 0, 1 ], ShadingType: isRadial ? 3 : 2, Function: funcs, Extend: [ true, true ] } } } })) } }); pdf.attach(opacity); opacity._resourceName = "O" + (++RESOURCE_COUNTER); if (hash) { pdf.GRAD_OPC[hash] = opacity; } } return opacity; } function cacheGradient(pdf, gradient, box) { var isRadial = gradient.type == "radial"; var funcs = makeGradientFunctions(pdf, gradient.stops); var coords = isRadial ? [ gradient.start.x , gradient.start.y , gradient.start.r, gradient.end.x , gradient.end.y , gradient.end.r ] : [ gradient.start.x , gradient.start.y, gradient.end.x , gradient.end.y ]; var shading = cacheColorGradient( pdf, isRadial, gradient.stops, coords, funcs.colors, gradient.userSpace && box ); var opacity = funcs.hasAlpha ? cacheOpacityGradient( pdf, isRadial, gradient.stops, coords, funcs.opacities, gradient.userSpace && box ) : null; return { hasAlpha: funcs.hasAlpha, shading: shading, opacity: opacity }; } /// page object var PDFPage = defclass(function PDFPage(pdf, props){ this._pdf = pdf; this._rcount = 0; this._textMode = false; this._fontResources = {}; this._gsResources = {}; this._xResources = {}; this._patResources = {}; this._shResources = {}; this._opacity = 1; this._matrix = [ 1, 0, 0, 1, 0, 0 ]; this._font = null; this._fontSize = null; this._contextStack = []; props = this.props = props || {}; props.Type = _("Page"); props.ProcSet = [ _("PDF"), _("Text"), _("ImageB"), _("ImageC"), _("ImageI") ]; props.Resources = new PDFDictionary({ Font : new PDFDictionary(this._fontResources), ExtGState : new PDFDictionary(this._gsResources), XObject : new PDFDictionary(this._xResources), Pattern : new PDFDictionary(this._patResources), Shading : new PDFDictionary(this._shResources) }); }, { _out: function() { this._content.data.apply(null, arguments); }, transform: function(a, b, c, d, e, f) { if (!isIdentityMatrix(arguments)) { this._matrix = mmul(this._matrix, arguments); this._out(a, " ", b, " ", c, " ", d, " ", e, " ", f, " cm"); // XXX: debug // this._out(" % current matrix: ", this._matrix); this._out(NL); } }, translate: function(dx, dy) { this.transform(1, 0, 0, 1, dx, dy); }, scale: function(sx, sy) { this.transform(sx, 0, 0, sy, 0, 0); }, rotate: function(angle) { var cos = Math.cos(angle), sin = Math.sin(angle); this.transform(cos, sin, -sin, cos, 0, 0); }, beginText: function() { this._textMode = true; this._out("BT", NL); }, endText: function() { this._textMode = false; this._out("ET", NL); }, _requireTextMode: function() { if (!this._textMode) { throw new Error("Text mode required; call page.beginText() first"); } }, _requireFont: function() { if (!this._font) { throw new Error("No font selected; call page.setFont() first"); } }, setFont: function(font, size) { this._requireTextMode(); if (font == null) { font = this._font; } else if (!(font instanceof PDFFont)) { font = this._pdf.getFont(font); } if (size == null) { size = this._fontSize; } this._fontResources[font._resourceName] = font; this._font = font; this._fontSize = size; this._out(font._resourceName, " ", size, " Tf", NL); }, setTextLeading: function(size) { this._requireTextMode(); this._out(size, " TL", NL); }, setTextRenderingMode: function(mode) { this._requireTextMode(); this._out(mode, " Tr", NL); }, showText: function(text) { this._requireFont(); this._out(this._font.encodeText(text), " Tj", NL); }, showTextNL: function(text) { this._requireFont(); this._out(this._font.encodeText(text), " '", NL); }, setStrokeColor: function(r, g, b) { this._out(r, " ", g, " ", b, " RG", NL); }, setOpacity: function(opacity) { this.setFillOpacity(opacity); this.setStrokeOpacity(opacity); this._opacity *= opacity; }, setStrokeOpacity: function(opacity) { if (opacity < 1) { var gs = this._pdf.getOpacityGS(this._opacity * opacity, true); this._gsResources[gs._resourceName] = gs; this._out(gs._resourceName, " gs", NL); } }, setFillColor: function(r, g, b) { this._out(r, " ", g, " ", b, " rg", NL); }, setFillOpacity: function(opacity) { if (opacity < 1) { var gs = this._pdf.getOpacityGS(this._opacity * opacity, false); this._gsResources[gs._resourceName] = gs; this._out(gs._resourceName, " gs", NL); } }, gradient: function(gradient, box) { this.save(); this.rect(box.left, box.top, box.width, box.height); this.clip(); if (!gradient.userSpace) { this.transform(box.width, 0, 0, box.height, box.left, box.top); } var g = cacheGradient(this._pdf, gradient, box); var sname = g.shading._resourceName, oname; this._shResources[sname] = g.shading; if (g.hasAlpha) { oname = g.opacity._resourceName; this._gsResources[oname] = g.opacity; this._out("/" + oname + " gs "); } this._out("/" + sname + " sh", NL); this.restore(); }, setDashPattern: function(dashArray, dashPhase) { this._out(dashArray, " ", dashPhase, " d", NL); }, setLineWidth: function(width) { this._out(width, " w", NL); }, setLineCap: function(lineCap) { this._out(lineCap, " J", NL); }, setLineJoin: function(lineJoin) { this._out(lineJoin, " j", NL); }, setMitterLimit: function(mitterLimit) { this._out(mitterLimit, " M", NL); }, save: function() { this._contextStack.push(this._context()); this._out("q", NL); }, restore: function() { this._out("Q", NL); this._context(this._contextStack.pop()); }, // paths moveTo: function(x, y) { this._out(x, " ", y, " m", NL); }, lineTo: function(x, y) { this._out(x, " ", y, " l", NL); }, bezier: function(x1, y1, x2, y2, x3, y3) { this._out(x1, " ", y1, " ", x2, " ", y2, " ", x3, " ", y3, " c", NL); }, bezier1: function(x1, y1, x3, y3) { this._out(x1, " ", y1, " ", x3, " ", y3, " y", NL); }, bezier2: function(x2, y2, x3, y3) { this._out(x2, " ", y2, " ", x3, " ", y3, " v", NL); }, close: function() { this._out("h", NL); }, rect: function(x, y, w, h) { this._out(x, " ", y, " ", w, " ", h, " re", NL); }, ellipse: function(x, y, rx, ry) { function _X(v) { return x + v; } function _Y(v) { return y + v; } // how to get to the "magic number" is explained here: // http://www.whizkidtech.redprince.net/bezier/circle/kappa/ var k = 0.5522847498307936; this.moveTo(_X(0), _Y(ry)); this.bezier( _X(rx * k) , _Y(ry), _X(rx) , _Y(ry * k), _X(rx) , _Y(0) ); this.bezier( _X(rx) , _Y(-ry * k), _X(rx * k) , _Y(-ry), _X(0) , _Y(-ry) ); this.bezier( _X(-rx * k) , _Y(-ry), _X(-rx) , _Y(-ry * k), _X(-rx) , _Y(0) ); this.bezier( _X(-rx) , _Y(ry * k), _X(-rx * k) , _Y(ry), _X(0) , _Y(ry) ); }, circle: function(x, y, r) { this.ellipse(x, y, r, r); }, stroke: function() { this._out("S", NL); }, nop: function() { this._out("n", NL); }, clip: function() { this._out("W n", NL); }, clipStroke: function() { this._out("W S", NL); }, closeStroke: function() { this._out("s", NL); }, fill: function() { this._out("f", NL); }, fillStroke: function() { this._out("B", NL); }, drawImage: function(url) { var img = this._pdf.getImage(url); if (img) { // the result can be null for a cross-domain image this._xResources[img._resourceName] = img; this._out(img._resourceName, " Do", NL); } }, comment: function(txt) { var self = this; txt.split(/\r?\n/g).forEach(function(line){ self._out("% ", line, NL); }); }, // internal _context: function(val) { if (val != null) { this._opacity = val.opacity; this._matrix = val.matrix; } else { return { opacity: this._opacity, matrix: this._matrix }; } } }, PDFDictionary); function BinaryStream(data) { var offset = 0, length = 0; if (data == null) { data = HAS_TYPED_ARRAYS ? new Uint8Array(256) : []; } else { length = data.length; } var ensure = HAS_TYPED_ARRAYS ? function(len) { if (len >= data.length) { var tmp = new Uint8Array(Math.max(len + 256, data.length * 2)); tmp.set(data, 0); data = tmp; } } : function() {}; var get = HAS_TYPED_ARRAYS ? function() { return new Uint8Array(data.buffer, 0, length); } : function() { return data; }; var write = HAS_TYPED_ARRAYS ? function(bytes) { if (typeof bytes == "string") { return writeString(bytes); } var len = bytes.length; ensure(offset + len); data.set(bytes, offset); offset += len; if (offset > length) { length = offset; } } : function(bytes) { if (typeof bytes == "string") { return writeString(bytes); } for (var i = 0; i < bytes.length; ++i) { writeByte(bytes[i]); } }; var slice = HAS_TYPED_ARRAYS ? function(start, length) { if (data.buffer.slice) { return new Uint8Array(data.buffer.slice(start, start + length)); } else { // IE10 var x = new Uint8Array(length); x.set(new Uint8Array(data.buffer, start, length)); return x; } } : function(start, length) { return data.slice(start, start + length); }; function eof() { return offset >= length; } function readByte() { return offset < length ? data[offset++] : 0; } function writeByte(b) { ensure(offset); data[offset++] = b & 0xFF; if (offset > length) { length = offset; } } function readShort() { return (readByte() << 8) | readByte(); } function writeShort(w) { writeByte(w >> 8); writeByte(w); } function readShort_() { var w = readShort(); return w >= 0x8000 ? w - 0x10000 : w; } function writeShort_(w) { writeShort(w < 0 ? w + 0x10000 : w); } function readLong() { return (readShort() * 0x10000) + readShort(); } function writeLong(w) { writeShort((w >>> 16) & 0xFFFF); writeShort(w & 0xFFFF); } function readLong_() { var w = readLong(); return w >= 0x80000000 ? w - 0x100000000 : w; } function writeLong_(w) { writeLong(w < 0 ? w + 0x100000000 : w); } function readFixed() { return readLong() / 0x10000; } function writeFixed(f) { writeLong(Math.round(f * 0x10000)); } function readFixed_() { return readLong_() / 0x10000; } function writeFixed_(f) { writeLong_(Math.round(f * 0x10000)); } function read(len) { return times(len, readByte); } function readString(len) { return String.fromCharCode.apply(String, read(len)); } function writeString(str) { for (var i = 0; i < str.length; ++i) { writeByte(str.charCodeAt(i)); } } function times(n, reader) { for (var ret = new Array(n), i = 0; i < n; ++i) { ret[i] = reader(); } return ret; } var stream = { eof : eof, readByte : readByte, writeByte : writeByte, readShort : readShort, writeShort : writeShort, readLong : readLong, writeLong : writeLong, readFixed : readFixed, writeFixed : writeFixed, // signed numbers. readShort_ : readShort_, writeShort_ : writeShort_, readLong_ : readLong_, writeLong_ : writeLong_, readFixed_ : readFixed_, writeFixed_ : writeFixed_, read : read, write : write, readString : readString, writeString : writeString, times : times, get : get, slice : slice, offset: function(pos) { if (pos != null) { offset = pos; return stream; } return offset; }, skip: function(nbytes) { offset += nbytes; }, toString: function() { throw new Error("FIX CALLER. BinaryStream is no longer convertible to string!"); }, length: function() { return length; }, saveExcursion: function(f) { var pos = offset; try { return f(); } finally { offset = pos; } }, writeBase64: function(base64) { if (window.atob) { writeString(window.atob(base64)); } else { write(BASE64.decode(base64)); } }, base64: function() { return BASE64.encode(get()); } }; return stream; } function unquote(str) { return str.replace(/^\s*(['"])(.*)\1\s*$/, "$2"); } function parseFontDef(fontdef) { // XXX: this is very crude for now and buggy. Proper parsing is quite involved. var rx = /^\s*((normal|italic)\s+)?((normal|small-caps)\s+)?((normal|bold|\d+)\s+)?(([0-9.]+)(px|pt))(\/(([0-9.]+)(px|pt)|normal))?\s+(.*?)\s*$/i; var m = rx.exec(fontdef); if (!m) { return { fontSize: 12, fontFamily: "sans-serif" }; } var fontSize = m[8] ? parseInt(m[8], 10) : 12; return { italic : m[2] && m[2].toLowerCase() == "italic", variant : m[4], bold : m[6] && /bold|700/i.test(m[6]), fontSize : fontSize, lineHeight : m[12] ? m[12] == "normal" ? fontSize : parseInt(m[12], 10) : null, fontFamily : m[14].split(/\s*,\s*/g).map(unquote) }; } function getFontURL(style) { function mkFamily(name) { if (style.bold) { name += "|bold"; } if (style.italic) { name += "|italic"; } return name.toLowerCase(); } var fontFamily = style.fontFamily; var name, url; if (fontFamily instanceof Array) { for (var i = 0; i < fontFamily.length; ++i) { name = mkFamily(fontFamily[i]); url = FONT_MAPPINGS[name]; if (url) { break; } } } else { url = FONT_MAPPINGS[fontFamily.toLowerCase()]; } while (typeof url == "function") { url = url(); } if (!url) { url = "Times-Roman"; } return url; } var FONT_MAPPINGS = { "serif" : "Times-Roman", "serif|bold" : "Times-Bold", "serif|italic" : "Times-Italic", "serif|bold|italic" : "Times-BoldItalic", "sans-serif" : "Helvetica", "sans-serif|bold" : "Helvetica-Bold", "sans-serif|italic" : "Helvetica-Oblique", "sans-serif|bold|italic" : "Helvetica-BoldOblique", "monospace" : "Courier", "monospace|bold" : "Courier-Bold", "monospace|italic" : "Courier-Oblique", "monospace|bold|italic" : "Courier-BoldOblique", "zapfdingbats" : "ZapfDingbats", "zapfdingbats|bold" : "ZapfDingbats", "zapfdingbats|italic" : "ZapfDingbats", "zapfdingbats|bold|italic" : "ZapfDingbats" }; function fontAlias(alias, name) { alias = alias.toLowerCase(); FONT_MAPPINGS[alias] = function() { return FONT_MAPPINGS[name]; }; FONT_MAPPINGS[alias + "|bold"] = function() { return FONT_MAPPINGS[name + "|bold"]; }; FONT_MAPPINGS[alias + "|italic"] = function() { return FONT_MAPPINGS[name + "|italic"]; }; FONT_MAPPINGS[alias + "|bold|italic"] = function() { return FONT_MAPPINGS[name + "|bold|italic"]; }; } // Let's define some common names to an appropriate replacement. // These are overridable via kendo.pdf.defineFont, should the user // want to include the proper versions. fontAlias("Times New Roman" , "serif"); fontAlias("Courier New" , "monospace"); fontAlias("Arial" , "sans-serif"); fontAlias("Helvetica" , "sans-serif"); fontAlias("Verdana" , "sans-serif"); fontAlias("Tahoma" , "sans-serif"); fontAlias("Georgia" , "sans-serif"); fontAlias("Monaco" , "monospace"); fontAlias("Andale Mono" , "monospace"); function defineFont(name, url) { if (arguments.length == 1) { for (var i in name) { if (hasOwnProperty(name, i)) { defineFont(i, name[i]); } } } else { name = name.toLowerCase(); FONT_MAPPINGS[name] = url; // special handling for DejaVu fonts: if they get defined, // let them also replace the default families, for good // Unicode support out of the box. switch (name) { case "dejavu sans" : FONT_MAPPINGS["sans-serif"] = url; break; case "dejavu sans|bold" : FONT_MAPPINGS["sans-serif|bold"] = url; break; case "dejavu sans|italic" : FONT_MAPPINGS["sans-serif|italic"] = url; break; case "dejavu sans|bold|italic" : FONT_MAPPINGS["sans-serif|bold|italic"] = url; break; case "dejavu serif" : FONT_MAPPINGS["serif"] = url; break; case "dejavu serif|bold" : FONT_MAPPINGS["serif|bold"] = url; break; case "dejavu serif|italic" : FONT_MAPPINGS["serif|italic"] = url; break; case "dejavu serif|bold|italic" : FONT_MAPPINGS["serif|bold|italic"] = url; break; case "dejavu mono" : FONT_MAPPINGS["monospace"] = url; break; case "dejavu mono|bold" : FONT_MAPPINGS["monospace|bold"] = url; break; case "dejavu mono|italic" : FONT_MAPPINGS["monospace|italic"] = url; break; case "dejavu mono|bold|italic" : FONT_MAPPINGS["monospace|bold|italic"] = url; break; } } } /// exports. kendo.pdf = { Document : PDFDocument, BinaryStream : BinaryStream, defineFont : defineFont, parseFontDef : parseFontDef, getFontURL : getFontURL, loadFonts : loadFonts, loadImages : loadImages, TEXT_RENDERING_MODE : { fill : 0, stroke : 1, fillAndStroke : 2, invisible : 3, fillAndClip : 4, strokeAndClip : 5, fillStrokeClip : 6, clip : 7 } }; function mmul(a, b) { var a1 = a[0], b1 = a[1], c1 = a[2], d1 = a[3], e1 = a[4], f1 = a[5]; var a2 = b[0], b2 = b[1], c2 = b[2], d2 = b[3], e2 = b[4], f2 = b[5]; return [ a1*a2 + b1*c2, a1*b2 + b1*d2, c1*a2 + d1*c2, c1*b2 + d1*d2, e1*a2 + f1*c2 + e2, e1*b2 + f1*d2 + f2 ]; } function isIdentityMatrix(m) { return m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1 && m[4] === 0 && m[5] === 0; } })(this, parseFloat); (function(global){ /*****************************************************************************\ * * The code in this file, although written from scratch, is influenced by the * TrueType parser/encoder in PDFKit -- http://pdfkit.org/ (a CoffeeScript * library for producing PDF files). * * PDFKit is (c) Devon Govett 2014 and released under the MIT License. * \*****************************************************************************/ "use strict"; // WARNING: removing the following jshint declaration and turning // == into === to make JSHint happy will break functionality. /* jshint eqnull:true */ /* jshint loopfunc:true */ /* jshint newcap:false */ function hasOwnProperty(obj, key) { return Object.prototype.hasOwnProperty.call(obj, key); } function sortedKeys(obj) { return Object.keys(obj).sort(function(a, b){ return a - b; }).map(parseFloat); } var PDF = global.kendo.pdf; var BinaryStream = PDF.BinaryStream; /// function Directory(data) { this.raw = data; this.scalerType = data.readLong(); this.tableCount = data.readShort(); this.searchRange = data.readShort(); this.entrySelector = data.readShort(); this.rangeShift = data.readShort(); var tables = this.tables = {}; for (var i = 0; i < this.tableCount; ++i) { var entry = { tag : data.readString(4), checksum : data.readLong(), offset : data.readLong(), length : data.readLong() }; tables[entry.tag] = entry; } } Directory.prototype = { readTable: function(name, Ctor) { var def = this.tables[name]; if (!def) { throw new Error("Table " + name + " not found in directory"); } return (this[name] = def.table = new Ctor(this, def)); }, render: function(tables) { var tableCount = Object.keys(tables).length; var maxpow2 = Math.pow(2, Math.floor(Math.log(tableCount) / Math.LN2)); var searchRange = maxpow2 * 16; var entrySelector = Math.floor(Math.log(maxpow2) / Math.LN2); var rangeShift = tableCount * 16 - searchRange; var out = BinaryStream(); out.writeLong(this.scalerType); out.writeShort(tableCount); out.writeShort(searchRange); out.writeShort(entrySelector); out.writeShort(rangeShift); var directoryLength = tableCount * 16; var offset = out.offset() + directoryLength; var headOffset = null; var tableData = BinaryStream(); for (var tag in tables) { if (hasOwnProperty(tables, tag)) { var table = tables[tag]; out.writeString(tag); out.writeLong(this.checksum(table)); out.writeLong(offset); out.writeLong(table.length); tableData.write(table); if (tag == "head") { headOffset = offset; } offset += table.length; while (offset % 4) { tableData.writeByte(0); offset++; } } } out.write(tableData.get()); var sum = this.checksum(out.get()); var adjustment = 0xB1B0AFBA - sum; out.offset(headOffset + 8); out.writeLong(adjustment); return out.get(); }, checksum: function(data) { data = BinaryStream(data); var sum = 0; while (!data.eof()) { sum += data.readLong(); } return sum & 0xFFFFFFFF; } }; function deftable(methods) { function Ctor(file, def) { this.definition = def; this.length = def.length; this.offset = def.offset; this.file = file; this.rawData = file.raw; this.parse(file.raw); } Ctor.prototype.raw = function() { return this.rawData.slice(this.offset, this.length); }; for (var i in methods) { if (hasOwnProperty(methods, i)) { Ctor[i] = Ctor.prototype[i] = methods[i]; } } return Ctor; } var HeadTable = deftable({ parse: function(data) { data.offset(this.offset); this.version = data.readLong(); this.revision = data.readLong(); this.checkSumAdjustment = data.readLong(); this.magicNumber = data.readLong(); this.flags = data.readShort(); this.unitsPerEm = data.readShort(); this.created = data.read(8); this.modified = data.read(8); this.xMin = data.readShort_(); this.yMin = data.readShort_(); this.xMax = data.readShort_(); this.yMax = data.readShort_(); this.macStyle = data.readShort(); this.lowestRecPPEM = data.readShort(); this.fontDirectionHint = data.readShort_(); this.indexToLocFormat = data.readShort_(); this.glyphDataFormat = data.readShort_(); }, render: function(indexToLocFormat) { var out = BinaryStream(); out.writeLong(this.version); out.writeLong(this.revision); out.writeLong(0); // checksum adjustment; shall be computed later out.writeLong(this.magicNumber); out.writeShort(this.flags); out.writeShort(this.unitsPerEm); out.write(this.created); out.write(this.modified); out.writeShort_(this.xMin); out.writeShort_(this.yMin); out.writeShort_(this.xMax); out.writeShort_(this.yMax); out.writeShort(this.macStyle); out.writeShort(this.lowestRecPPEM); out.writeShort_(this.fontDirectionHint); out.writeShort_(indexToLocFormat); // this will depend on the `loca` table out.writeShort_(this.glyphDataFormat); return out.get(); } }); var LocaTable = deftable({ parse: function(data) { data.offset(this.offset); var format = this.file.head.indexToLocFormat; if (format === 0) { this.offsets = data.times(this.length / 2, function(){ return 2 * data.readShort(); }); } else { this.offsets = data.times(this.length / 4, data.readLong); } }, offsetOf: function(id) { return this.offsets[id]; }, lengthOf: function(id) { return this.offsets[id + 1] - this.offsets[id]; }, render: function(offsets) { var out = BinaryStream(); var needsLongFormat = offsets[offsets.length - 1] > 0xFFFF; for (var i = 0; i < offsets.length; ++i) { if (needsLongFormat) { out.writeLong(offsets[i]); } else { out.writeShort(offsets[i] / 2); } } return { format: needsLongFormat ? 1 : 0, table: out.get() }; } }); var HheaTable = deftable({ parse: function(data) { data.offset(this.offset); this.version = data.readLong(); this.ascent = data.readShort_(); this.descent = data.readShort_(); this.lineGap = data.readShort_(); this.advanceWidthMax = data.readShort(); this.minLeftSideBearing = data.readShort_(); this.minRightSideBearing = data.readShort_(); this.xMaxExtent = data.readShort_(); this.caretSlopeRise = data.readShort_(); this.caretSlopeRun = data.readShort_(); this.caretOffset = data.readShort_(); data.skip(4 * 2); // reserved this.metricDataFormat = data.readShort_(); this.numOfLongHorMetrics = data.readShort(); }, render: function(ids) { var out = BinaryStream(); out.writeLong(this.version); out.writeShort_(this.ascent); out.writeShort_(this.descent); out.writeShort_(this.lineGap); out.writeShort(this.advanceWidthMax); out.writeShort_(this.minLeftSideBearing); out.writeShort_(this.minRightSideBearing); out.writeShort_(this.xMaxExtent); out.writeShort_(this.caretSlopeRise); out.writeShort_(this.caretSlopeRun); out.writeShort_(this.caretOffset); out.write([ 0, 0, 0, 0, 0, 0, 0, 0 ]); // reserved bytes out.writeShort_(this.metricDataFormat); out.writeShort(ids.length); return out.get(); } }); var MaxpTable = deftable({ parse: function(data) { data.offset(this.offset); this.version = data.readLong(); this.numGlyphs = data.readShort(); this.maxPoints = data.readShort(); this.maxContours = data.readShort(); this.maxComponentPoints = data.readShort(); this.maxComponentContours = data.readShort(); this.maxZones = data.readShort(); this.maxTwilightPoints = data.readShort(); this.maxStorage = data.readShort(); this.maxFunctionDefs = data.readShort(); this.maxInstructionDefs = data.readShort(); this.maxStackElements = data.readShort(); this.maxSizeOfInstructions = data.readShort(); this.maxComponentElements = data.readShort(); this.maxComponentDepth = data.readShort(); }, render: function(glyphIds) { var out = BinaryStream(); out.writeLong(this.version); out.writeShort(glyphIds.length); out.writeShort(this.maxPoints); out.writeShort(this.maxContours); out.writeShort(this.maxComponentPoints); out.writeShort(this.maxComponentContours); out.writeShort(this.maxZones); out.writeShort(this.maxTwilightPoints); out.writeShort(this.maxStorage); out.writeShort(this.maxFunctionDefs); out.writeShort(this.maxInstructionDefs); out.writeShort(this.maxStackElements); out.writeShort(this.maxSizeOfInstructions); out.writeShort(this.maxComponentElements); out.writeShort(this.maxComponentDepth); return out.get(); } }); var HmtxTable = deftable({ parse: function(data) { data.offset(this.offset); var dir = this.file, hhea = dir.hhea; this.metrics = data.times(hhea.numOfLongHorMetrics, function(){ return { advance: data.readShort(), lsb: data.readShort_() }; }); var lsbCount = dir.maxp.numGlyphs - dir.hhea.numOfLongHorMetrics; this.leftSideBearings = data.times(lsbCount, data.readShort_); }, forGlyph: function(id) { var metrics = this.metrics; var n = metrics.length; if (id < n) { return metrics[id]; } return { advance: metrics[n - 1].advance, lsb: this.leftSideBearings[id - n] }; }, render: function(glyphIds) { var out = BinaryStream(); for (var i = 0; i < glyphIds.length; ++i) { var m = this.forGlyph(glyphIds[i]); out.writeShort(m.advance); out.writeShort_(m.lsb); } return out.get(); } }); var GlyfTable = (function(){ function SimpleGlyph(raw) { this.raw = raw; } SimpleGlyph.prototype = { compound: false, render: function() { return this.raw.get(); } }; var ARG_1_AND_2_ARE_WORDS = 0x0001; var WE_HAVE_A_SCALE = 0x0008; var MORE_COMPONENTS = 0x0020; var WE_HAVE_AN_X_AND_Y_SCALE = 0x0040; var WE_HAVE_A_TWO_BY_TWO = 0x0080; var WE_HAVE_INSTRUCTIONS = 0x0100; function CompoundGlyph(data) { this.raw = data; var ids = this.glyphIds = []; var offsets = this.idOffsets = []; while (true) { var flags = data.readShort(); offsets.push(data.offset()); ids.push(data.readShort()); if (!(flags & MORE_COMPONENTS)) { break; } data.skip(flags & ARG_1_AND_2_ARE_WORDS ? 4 : 2); if (flags & WE_HAVE_A_TWO_BY_TWO) { data.skip(8); } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { data.skip(4); } else if (flags & WE_HAVE_A_SCALE) { data.skip(2); } } } CompoundGlyph.prototype = { compound: true, render: function(old2new) { var out = BinaryStream(this.raw.get()); for (var i = 0; i < this.glyphIds.length; ++i) { var id = this.glyphIds[i]; out.offset(this.idOffsets[i]); out.writeShort(old2new[id]); } return out.get(); } }; return deftable({ parse: function(data) { this.cache = {}; }, glyphFor: function(id) { var cache = this.cache; if (hasOwnProperty(cache, id)) { return cache[id]; } var loca = this.file.loca; var length = loca.lengthOf(id); if (length === 0) { return (cache[id] = null); } var data = this.rawData; var offset = this.offset + loca.offsetOf(id); var raw = BinaryStream(data.slice(offset, length)); var numberOfContours = raw.readShort_(); var xMin = raw.readShort_(); var yMin = raw.readShort_(); var xMax = raw.readShort_(); var yMax = raw.readShort_(); var glyph = cache[id] = numberOfContours == -1 ? new CompoundGlyph(raw) : new SimpleGlyph(raw); glyph.numberOfContours = numberOfContours; glyph.xMin = xMin; glyph.yMin = yMin; glyph.xMax = xMax; glyph.yMax = yMax; return glyph; }, render: function(glyphs, oldIds, old2new) { var out = BinaryStream(), offsets = []; for (var i = 0; i < oldIds.length; ++i) { var id = oldIds[i]; var glyph = glyphs[id]; offsets.push(out.offset()); if (glyph) { out.write(glyph.render(old2new)); } } offsets.push(out.offset()); return { table: out.get(), offsets: offsets }; } }); }()); var NameTable = (function(){ function NameEntry(text, entry) { this.text = text; this.length = text.length; this.platformID = entry.platformID; this.platformSpecificID = entry.platformSpecificID; this.languageID = entry.languageID; this.nameID = entry.nameID; } return deftable({ parse: function(data) { data.offset(this.offset); var format = data.readShort(); var count = data.readShort(); var stringOffset = this.offset + data.readShort(); var nameRecords = data.times(count, function(){ return { platformID : data.readShort(), platformSpecificID : data.readShort(), languageID : data.readShort(), nameID : data.readShort(), length : data.readShort(), offset : data.readShort() + stringOffset }; }); var strings = this.strings = {}; for (var i = 0; i < nameRecords.length; ++i) { var rec = nameRecords[i]; data.offset(rec.offset); var text = data.readString(rec.length); if (!strings[rec.nameID]) { strings[rec.nameID] = []; } strings[rec.nameID].push(new NameEntry(text, rec)); } this.postscriptEntry = strings[6][0]; this.postscriptName = this.postscriptEntry.text.replace(/[^\x20-\x7F]/g, ""); }, render: function(psName) { var strings = this.strings; var strCount = 0; for (var i in strings) { if (hasOwnProperty(strings, i)) { strCount += strings[i].length; } } var out = BinaryStream(); var strTable = BinaryStream(); out.writeShort(0); // format out.writeShort(strCount); out.writeShort(6 + 12 * strCount); // stringOffset for (i in strings) { if (hasOwnProperty(strings, i)) { var list = i == 6 ? [ new NameEntry(psName, this.postscriptEntry) ] : strings[i]; for (var j = 0; j < list.length; ++j) { var str = list[j]; out.writeShort(str.platformID); out.writeShort(str.platformSpecificID); out.writeShort(str.languageID); out.writeShort(str.nameID); out.writeShort(str.length); out.writeShort(strTable.offset()); strTable.writeString(str.text); } } } out.write(strTable.get()); return out.get(); } }); })(); var PostTable = (function(){ var POSTSCRIPT_GLYPHS = ".notdef .null nonmarkingreturn space exclam quotedbl numbersign dollar percent ampersand quotesingle parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde Adieresis Aring Ccedilla Eacute Ntilde Odieresis Udieresis aacute agrave acircumflex adieresis atilde aring ccedilla eacute egrave ecircumflex edieresis iacute igrave icircumflex idieresis ntilde oacute ograve ocircumflex odieresis otilde uacute ugrave ucircumflex udieresis dagger degree cent sterling section bullet paragraph germandbls registered copyright trademark acute dieresis notequal AE Oslash infinity plusminus lessequal greaterequal yen mu partialdiff summation product pi integral ordfeminine ordmasculine Omega ae oslash questiondown exclamdown logicalnot radical florin approxequal Delta guillemotleft guillemotright ellipsis nonbreakingspace Agrave Atilde Otilde OE oe endash emdash quotedblleft quotedblright quoteleft quoteright divide lozenge ydieresis Ydieresis fraction currency guilsinglleft guilsinglright fi fl daggerdbl periodcentered quotesinglbase quotedblbase perthousand Acircumflex Ecircumflex Aacute Edieresis Egrave Iacute Icircumflex Idieresis Igrave Oacute Ocircumflex apple Ograve Uacute Ucircumflex Ugrave dotlessi circumflex tilde macron breve dotaccent ring cedilla hungarumlaut ogonek caron Lslash lslash Scaron scaron Zcaron zcaron brokenbar Eth eth Yacute yacute Thorn thorn minus multiply onesuperior twosuperior threesuperior onehalf onequarter threequarters franc Gbreve gbreve Idotaccent Scedilla scedilla Cacute cacute Ccaron ccaron dcroat".split(/\s+/g); return deftable({ parse: function(data) { data.offset(this.offset); this.format = data.readLong(); this.italicAngle = data.readFixed_(); this.underlinePosition = data.readShort_(); this.underlineThickness = data.readShort_(); this.isFixedPitch = data.readLong(); this.minMemType42 = data.readLong(); this.maxMemType42 = data.readLong(); this.minMemType1 = data.readLong(); this.maxMemType1 = data.readLong(); var numberOfGlyphs; switch (this.format) { case 0x00010000: case 0x00030000: break; case 0x00020000: numberOfGlyphs = data.readShort(); this.glyphNameIndex = data.times(numberOfGlyphs, data.readShort); this.names = []; var limit = this.offset + this.length; while (data.offset() < limit) { this.names.push(data.readString(data.readByte())); } break; case 0x00025000: numberOfGlyphs = data.readShort(); this.offsets = data.read(numberOfGlyphs); break; case 0x00040000: this.map = data.times(this.file.maxp.numGlyphs, data.readShort); break; } }, glyphFor: function(code) { switch (this.format) { case 0x00010000: return POSTSCRIPT_GLYPHS[code] || ".notdef"; case 0x00020000: var index = this.glyphNameIndex[code]; if (index < POSTSCRIPT_GLYPHS.length) { return POSTSCRIPT_GLYPHS[index]; } return this.names[index - POSTSCRIPT_GLYPHS.length] || ".notdef"; case 0x00025000: case 0x00030000: return ".notdef"; case 0x00040000: return this.map[code] || 0xFFFF; } }, render: function(mapping) { if (this.format == 0x00030000) { return this.raw(); } // keep original header, but set format to 2.0 var out = BinaryStream(this.rawData.slice(this.offset, 32)); out.writeLong(0x00020000); out.offset(32); var indexes = []; var strings = []; for (var i = 0; i < mapping.length; ++i) { var id = mapping[i]; var post = this.glyphFor(id); var index = POSTSCRIPT_GLYPHS.indexOf(post); if (index >= 0) { indexes.push(index); } else { indexes.push(POSTSCRIPT_GLYPHS.length + strings.length); strings.push(post); } } out.writeShort(mapping.length); for (i = 0; i < indexes.length; ++i) { out.writeShort(indexes[i]); } for (i = 0; i < strings.length; ++i) { out.writeByte(strings[i].length); out.writeString(strings[i]); } return out.get(); } }); })(); var CmapTable = (function(){ function CmapEntry(data, offset) { var self = this; self.platformID = data.readShort(); self.platformSpecificID = data.readShort(); self.offset = offset + data.readLong(); data.saveExcursion(function(){ data.offset(self.offset); self.format = data.readShort(); self.length = data.readShort(); self.language = data.readShort(); self.isUnicode = ( self.platformID == 3 && self.platformSpecificID == 1 && self.format == 4 ) || ( self.platformID === 0 && self.format == 4 ); self.codeMap = {}; switch (self.format) { case 0: for (var i = 0; i < 256; ++i) { self.codeMap[i] = data.readByte(); } break; case 4: var segCount = data.readShort() / 2; data.skip(6); // searchRange, entrySelector, rangeShift var endCode = data.times(segCount, data.readShort); data.skip(2); // reserved pad var startCode = data.times(segCount, data.readShort); var idDelta = data.times(segCount, data.readShort_); var idRangeOffset = data.times(segCount, data.readShort); var count = (self.length + self.offset - data.offset()) / 2; var glyphIds = data.times(count, data.readShort); for (i = 0; i < segCount; ++i) { var start = startCode[i], end = endCode[i]; for (var code = start; code <= end; ++code) { var glyphId; if (idRangeOffset[i] === 0) { glyphId = code + idDelta[i]; } else { /// // When non-zero, idRangeOffset contains for each segment the byte offset of the Glyph ID // into the glyphIds table, from the *current* `i` cell of idRangeOffset. In other words, // this offset spans from the first into the second array. This works, because the arrays // are consecutive in the TTF file: // // [ ...idRangeOffset... ][ ...glyphIds... ] // ...... 48 ...... .... ID .... // ^----- 48 bytes -----^ // // (but I can't stop wondering why is it not just a plain index, possibly incremented by 1 // so that we can have that special `zero` value.) // // The elements of idRangeOffset are even numbers, because both arrays contain 16-bit words, // yet the offset is in bytes. That is why we divide it by 2. Then we subtract the // remaining segments (segCount-i), and add the code-start offset, to which we need to add // the corresponding delta to get the actual glyph ID. /// var index = idRangeOffset[i] / 2 - (segCount - i) + (code - start); glyphId = glyphIds[index] || 0; if (glyphId !== 0) { glyphId += idDelta[i]; } } self.codeMap[code] = glyphId & 0xFFFF; } } } }); } function renderCharmap(ncid2ogid, ogid2ngid) { var codes = sortedKeys(ncid2ogid); var startCodes = []; var endCodes = []; var last = null; var diff = null; function new_gid(charcode) { return ogid2ngid[ncid2ogid[charcode]]; } for (var i = 0; i < codes.length; ++i) { var code = codes[i]; var gid = new_gid(code); var delta = gid - code; if (last == null || delta !== diff) { if (last) { endCodes.push(last); } startCodes.push(code); diff = delta; } last = code; } if (last) { endCodes.push(last); } endCodes.push(0xFFFF); startCodes.push(0xFFFF); var segCount = startCodes.length; var segCountX2 = segCount * 2; var searchRange = 2 * Math.pow(2, Math.floor(Math.log(segCount) / Math.LN2)); var entrySelector = Math.log(searchRange / 2) / Math.LN2; var rangeShift = segCountX2 - searchRange; var deltas = []; var rangeOffsets = []; var glyphIds = []; for (i = 0; i < segCount; ++i) { var startCode = startCodes[i]; var endCode = endCodes[i]; if (startCode == 0xFFFF) { deltas.push(0); rangeOffsets.push(0); break; } var startGlyph = new_gid(startCode); if (startCode - startGlyph >= 0x8000) { deltas.push(0); rangeOffsets.push(2 * (glyphIds.length + segCount - i)); for (var j = startCode; j <= endCode; ++j) { glyphIds.push(new_gid(j)); } } else { deltas.push(startGlyph - startCode); rangeOffsets.push(0); } } var out = BinaryStream(); out.writeShort(3); // platformID out.writeShort(1); // platformSpecificID out.writeLong(12); // offset out.writeShort(4); // format out.writeShort(16 + segCount * 8 + glyphIds.length * 2); // length out.writeShort(0); // language out.writeShort(segCountX2); out.writeShort(searchRange); out.writeShort(entrySelector); out.writeShort(rangeShift); endCodes.forEach(out.writeShort); out.writeShort(0); // reserved pad startCodes.forEach(out.writeShort); deltas.forEach(out.writeShort_); rangeOffsets.forEach(out.writeShort); glyphIds.forEach(out.writeShort); return out.get(); } return deftable({ parse: function(data) { var self = this; var offset = self.offset; data.offset(offset); self.version = data.readShort(); var tableCount = data.readShort(); self.unicodeEntry = null; self.tables = data.times(tableCount, function(){ var entry = new CmapEntry(data, offset); if (entry.isUnicode) { self.unicodeEntry = entry; } return entry; }); }, render: function(ncid2ogid, ogid2ngid) { var out = BinaryStream(); out.writeShort(0); // version out.writeShort(1); // tableCount out.write(renderCharmap(ncid2ogid, ogid2ngid)); return out.get(); }, getUnicodeEntry: function() { if (!this.unicodeEntry) { throw new Error("Font doesn't have an Unicode encoding"); } return this.unicodeEntry; } }); })(); var OS2Table = deftable({ parse: function(data) { data.offset(this.offset); this.version = data.readShort(); this.averageCharWidth = data.readShort_(); this.weightClass = data.readShort(); this.widthClass = data.readShort(); this.type = data.readShort(); this.ySubscriptXSize = data.readShort_(); this.ySubscriptYSize = data.readShort_(); this.ySubscriptXOffset = data.readShort_(); this.ySubscriptYOffset = data.readShort_(); this.ySuperscriptXSize = data.readShort_(); this.ySuperscriptYSize = data.readShort_(); this.ySuperscriptXOffset = data.readShort_(); this.ySuperscriptYOffset = data.readShort_(); this.yStrikeoutSize = data.readShort_(); this.yStrikeoutPosition = data.readShort_(); this.familyClass = data.readShort_(); this.panose = data.times(10, data.readByte); this.charRange = data.times(4, data.readLong); this.vendorID = data.readString(4); this.selection = data.readShort(); this.firstCharIndex = data.readShort(); this.lastCharIndex = data.readShort(); if (this.version > 0) { this.ascent = data.readShort_(); this.descent = data.readShort_(); this.lineGap = data.readShort_(); this.winAscent = data.readShort(); this.winDescent = data.readShort(); this.codePageRange = data.times(2, data.readLong); if (this.version > 1) { this.xHeight = data.readShort(); this.capHeight = data.readShort(); this.defaultChar = data.readShort(); this.breakChar = data.readShort(); this.maxContext = data.readShort(); } } }, render: function() { return this.raw(); } }); var subsetTag = 100000; function nextSubsetTag() { var ret = "", n = subsetTag+""; for (var i = 0; i < n.length; ++i) { ret += String.fromCharCode(n.charCodeAt(i) - 48 + 65); } ++subsetTag; return ret; } function Subfont(font) { this.font = font; this.subset = {}; this.unicodes = {}; this.ogid2ngid = { 0: 0 }; this.ngid2ogid = { 0: 0 }; this.ncid2ogid = {}; this.next = this.firstChar = 1; this.nextGid = 1; this.psName = nextSubsetTag() + "+" + this.font.psName; } Subfont.prototype = { use: function(ch) { var code; if (typeof ch == "string") { var ret = ""; for (var i = 0; i < ch.length; ++i) { code = this.use(ch.charCodeAt(i)); ret += String.fromCharCode(code); } return ret; } code = this.unicodes[ch]; if (!code) { code = this.next++; this.subset[code] = ch; this.unicodes[ch] = code; // generate new GID (glyph ID) and maintain newGID -> // oldGID and back mappings var old_gid = this.font.cmap.getUnicodeEntry().codeMap[ch]; if (old_gid) { this.ncid2ogid[code] = old_gid; if (this.ogid2ngid[old_gid] == null) { var new_gid = this.nextGid++; this.ogid2ngid[old_gid] = new_gid; this.ngid2ogid[new_gid] = old_gid; } } } return code; }, encodeText: function(text) { return this.use(text); }, glyphIds: function() { return sortedKeys(this.ogid2ngid); }, glyphsFor: function(glyphIds, result) { if (!result) { result = {}; } for (var i = 0; i < glyphIds.length; ++i) { var id = glyphIds[i]; if (!result[id]) { var glyph = result[id] = this.font.glyf.glyphFor(id); if (glyph && glyph.compound) { this.glyphsFor(glyph.glyphIds, result); } } } return result; }, render: function() { var glyphs = this.glyphsFor(this.glyphIds()); // add missing sub-glyphs for (var old_gid in glyphs) { if (hasOwnProperty(glyphs, old_gid)) { old_gid = parseInt(old_gid, 10); if (this.ogid2ngid[old_gid] == null) { var new_gid = this.nextGid++; this.ogid2ngid[old_gid] = new_gid; this.ngid2ogid[new_gid] = old_gid; } } } // must obtain old_gid_ids in an order matching sorted // new_gid_ids var new_gid_ids = sortedKeys(this.ngid2ogid); var old_gid_ids = new_gid_ids.map(function(id){ return this.ngid2ogid[id]; }, this); var font = this.font; var glyf = font.glyf.render(glyphs, old_gid_ids, this.ogid2ngid); var loca = font.loca.render(glyf.offsets); this.lastChar = this.next - 1; var tables = { "cmap" : CmapTable.render(this.ncid2ogid, this.ogid2ngid), "glyf" : glyf.table, "loca" : loca.table, "hmtx" : font.hmtx.render(old_gid_ids), "hhea" : font.hhea.render(old_gid_ids), "maxp" : font.maxp.render(old_gid_ids), "post" : font.post.render(old_gid_ids), "name" : font.name.render(this.psName), "head" : font.head.render(loca.format), "OS/2" : font.os2.render() }; return this.font.directory.render(tables); }, cidToGidMap: function() { var out = BinaryStream(), len = 0; for (var cid = this.firstChar; cid < this.next; ++cid) { while (len < cid) { out.writeShort(0); len++; } var old_gid = this.ncid2ogid[cid]; if (old_gid) { var new_gid = this.ogid2ngid[old_gid]; out.writeShort(new_gid); } else { out.writeShort(0); } len++; } return out.get(); } }; function TTFFont(rawData, name) { var self = this; var data = self.contents = BinaryStream(rawData); if (data.readString(4) == "ttcf") { if (!name) { throw new Error("Must specify a name for TTC files"); } var version = data.readLong(); var numFonts = data.readLong(); for (var i = 0; i < numFonts; ++i) { var offset = data.readLong(); data.saveExcursion(function(){ data.offset(offset); self.parse(); }); if (self.psName == name) { return; } } throw new Error("Font " + name + " not found in collection"); } else { data.offset(0); self.parse(); } } TTFFont.prototype = { parse: function() { var dir = this.directory = new Directory(this.contents); this.head = dir.readTable("head", HeadTable); this.loca = dir.readTable("loca", LocaTable); this.hhea = dir.readTable("hhea", HheaTable); this.maxp = dir.readTable("maxp", MaxpTable); this.hmtx = dir.readTable("hmtx", HmtxTable); this.glyf = dir.readTable("glyf", GlyfTable); this.name = dir.readTable("name", NameTable); this.post = dir.readTable("post", PostTable); this.cmap = dir.readTable("cmap", CmapTable); this.os2 = dir.readTable("OS/2", OS2Table); this.psName = this.name.postscriptName; this.ascent = this.os2.ascent || this.hhea.ascent; this.descent = this.os2.descent || this.hhea.descent; this.lineGap = this.os2.lineGap || this.hhea.lineGap; this.scale = 1000 / this.head.unitsPerEm; }, widthOfGlyph: function(glyph) { return this.hmtx.forGlyph(glyph).advance * this.scale; }, makeSubset: function() { return new Subfont(this); } }; PDF.TTFFont = TTFFont; })(this); (function(kendo){ kendo.PDFMixin = { extend: function(proto) { proto.events.push("pdfExport"); proto.options.pdf = this.options; proto.saveAsPDF = this.saveAsPDF; }, options: { fileName : "Export.pdf", proxyURL : "", // paperSize can be an usual name, i.e. "A4", or an array of two Number-s specifying the // width/height in points (1pt = 1/72in), or strings including unit, i.e. "10mm". Supported // units are "mm", "cm", "in" and "pt". The default "auto" means paper size is determined // by content. paperSize : "auto", // pass true to reverse the paper dimensions if needed such that width is the larger edge. // doesn't make much sense with "auto" paperSize. landscape : false, // pass an object containing { left, top, bottom, right } margins (numbers of strings with // units). margin : null, // optional information for the PDF Info dictionary; all strings except for the date. title : null, author : null, subject : null, keywords : null, creator : "Kendo UI PDF Generator", date : null // CreationDate; must be a Date object, defaults to new Date() }, saveAsPDF: function() { if (this.trigger("pdfExport")) { return; } var options = this.options.pdf; kendo.drawing.drawDOM(this.wrapper[0]) .then(function(root) { return kendo.drawing.exportPDF(root, options); }) .done(function(dataURI) { kendo.saveAs({ dataURI: dataURI, fileName: options.fileName, proxyURL: options.proxyURL, forceProxy: options.forceProxy }); }); } }; })(kendo); (function(kendo, $){ "use strict"; // WARNING: removing the following jshint declaration and turning // == into === to make JSHint happy will break functionality. /*jshint eqnull:true */ var drawing = kendo.drawing; var geo = kendo.geometry; var Color = drawing.Color; function PDF() { if (!kendo.pdf) { throw new Error("kendo.pdf.js is not loaded"); } return kendo.pdf; } var DASH_PATTERNS = { dash : [ 4 ], dashDot : [ 4, 2, 1, 2 ], dot : [ 1, 2 ], longDash : [ 8, 2 ], longDashDot : [ 8, 2, 1, 2 ], longDashDotDot : [ 8, 2, 1, 2, 1, 2 ], solid : [] }; var LINE_CAP = { butt : 0, round : 1, square : 2 }; var LINE_JOIN = { miter : 0, round : 1, bevel : 2 }; function render(group, callback) { var fonts = [], images = [], options = group.options; function getOption(name, defval, hash) { if (!hash) { hash = options; } if (hash.pdf && hash.pdf[name] != null) { return hash.pdf[name]; } return defval; } var multiPage = getOption("multiPage"); group.traverse(function(element){ dispatch({ Image: function(element) { if (images.indexOf(element.src()) < 0) { images.push(element.src()); } }, Text: function(element) { var style = PDF().parseFontDef(element.options.font); var url = PDF().getFontURL(style); if (fonts.indexOf(url) < 0) { fonts.push(url); } } }, element); }); function doIt() { if (--count > 0) { return; } var pdf = new (PDF().Document)({ title : getOption("title"), author : getOption("author"), subject : getOption("subject"), keywords : getOption("keywords"), creator : getOption("creator"), date : getOption("date") }); function drawPage(group) { var options = group.options; var tmp = optimize(group); var bbox = tmp.bbox; group = tmp.root; var paperSize = getOption("paperSize", getOption("paperSize", "auto"), options), addMargin = false; if (paperSize == "auto") { if (bbox) { var size = bbox.getSize(); paperSize = [ size.width, size.height ]; addMargin = true; var origin = bbox.getOrigin(); tmp = new drawing.Group(); tmp.transform(new geo.Matrix(1, 0, 0, 1, -origin.x, -origin.y)); tmp.append(group); group = tmp; } else { paperSize = "A4"; } } var page; page = pdf.addPage({ paperSize : paperSize, margin : getOption("margin", getOption("margin"), options), addMargin : addMargin, landscape : getOption("landscape", getOption("landscape", false), options) }); drawElement(group, page, pdf); } if (multiPage) { group.children.forEach(drawPage); } else { drawPage(group); } callback(pdf.render(), pdf); } var count = 2; PDF().loadFonts(fonts, doIt); PDF().loadImages(images, doIt); } function toDataURL(group, callback) { render(group, function(data){ callback("data:application/pdf;base64," + data.base64()); }); } function toBlob(group, callback) { render(group, function(data){ callback(new Blob([ data.get() ], { type: "application/pdf" })); }); } function saveAs(group, filename, proxy, callback) { // XXX: Safari has Blob, but does not support the download attribute // so we'd end up converting to dataURL and using the proxy anyway. if (window.Blob && !kendo.support.browser.safari) { toBlob(group, function(blob){ kendo.saveAs({ dataURI: blob, fileName: filename }); if (callback) { callback(blob); } }); } else { toDataURL(group, function(dataURL){ kendo.saveAs({ dataURI: dataURL, fileName: filename, proxyURL: proxy }); if (callback) { callback(dataURL); } }); } } function dispatch(handlers, element) { var handler = handlers[element.nodeType]; if (handler) { return handler.call.apply(handler, arguments); } return element; } function drawElement(element, page, pdf) { if (element.DEBUG) { page.comment(element.DEBUG); } var transform = element.transform(); var opacity = element.opacity(); page.save(); if (opacity != null && opacity < 1) { page.setOpacity(opacity); } setStrokeOptions(element, page, pdf); setFillOptions(element, page, pdf); setClipping(element, page, pdf); if (transform) { var m = transform.matrix(); page.transform(m.a, m.b, m.c, m.d, m.e, m.f); } dispatch({ Path : drawPath, MultiPath : drawMultiPath, Circle : drawCircle, Arc : drawArc, Text : drawText, Image : drawImage, Group : drawGroup }, element, page, pdf); page.restore(); } function setStrokeOptions(element, page, pdf) { var stroke = element.stroke && element.stroke(); if (!stroke) { return; } var color = stroke.color; if (color) { color = parseColor(color); if (color == null) { return; // no stroke } page.setStrokeColor(color.r, color.g, color.b); if (color.a != 1) { page.setStrokeOpacity(color.a); } } var width = stroke.width; if (width != null) { if (width === 0) { return; // no stroke } page.setLineWidth(width); } var dashType = stroke.dashType; if (dashType) { page.setDashPattern(DASH_PATTERNS[dashType], 0); } var lineCap = stroke.lineCap; if (lineCap) { page.setLineCap(LINE_CAP[lineCap]); } var lineJoin = stroke.lineJoin; if (lineJoin) { page.setLineJoin(LINE_JOIN[lineJoin]); } var opacity = stroke.opacity; if (opacity != null) { page.setStrokeOpacity(opacity); } } function setFillOptions(element, page, pdf) { var fill = element.fill && element.fill(); if (!fill) { return; } if (fill instanceof drawing.Gradient) { return; } var color = fill.color; if (color) { color = parseColor(color); if (color == null) { return; // no fill } page.setFillColor(color.r, color.g, color.b); if (color.a != 1) { page.setFillOpacity(color.a); } } var opacity = fill.opacity; if (opacity != null) { page.setFillOpacity(opacity); } } function setClipping(element, page, pdf) { // XXX: only Path supported at the moment. var clip = element.clip(); if (clip) { _drawPath(clip, page, pdf); page.clip(); // page.setStrokeColor(Math.random(), Math.random(), Math.random()); // page.setLineWidth(1); // page.stroke(); } } function shouldDraw(thing) { return (thing && (thing instanceof drawing.Gradient || (thing.color && !/^(none|transparent)$/i.test(thing.color) && (thing.width == null || thing.width > 0) && (thing.opacity == null || thing.opacity > 0)))); } function maybeGradient(element, page, pdf, stroke) { var fill = element.fill(); if (fill instanceof drawing.Gradient) { if (stroke) { page.clipStroke(); } else { page.clip(); } var isRadial = fill instanceof drawing.RadialGradient; var start, end; if (isRadial) { start = { x: fill.center().x , y: fill.center().y , r: 0 }; end = { x: fill.center().x , y: fill.center().y , r: fill.radius() }; } else { start = { x: fill.start().x , y: fill.start().y }; end = { x: fill.end().x , y: fill.end().y }; } var gradient = { type: isRadial ? "radial" : "linear", start: start, end: end, userSpace: fill.userSpace(), stops: fill.stops.elements().map(function(stop){ var offset = stop.offset(); if (/%$/.test(offset)) { offset = parseFloat(offset) / 100; } else { offset = parseFloat(offset); } var color = parseColor(stop.color()); color.a *= stop.opacity(); return { offset: offset, color: color }; }) }; var box = element.rawBBox(); var tl = box.topLeft(), size = box.getSize(); box = { left : tl.x, top : tl.y, width : size.width, height : size.height }; page.gradient(gradient, box); return true; } } function maybeFillStroke(element, page, pdf) { if (shouldDraw(element.fill()) && shouldDraw(element.stroke())) { if (!maybeGradient(element, page, pdf, true)) { page.fillStroke(); } } else if (shouldDraw(element.fill())) { if (!maybeGradient(element, page, pdf, false)) { page.fill(); } } else if (shouldDraw(element.stroke())) { page.stroke(); } else { // we should not get here; the path should have been // optimized away. but let's be prepared. page.nop(); } } function maybeDrawRect(path, page, pdf) { var segments = path.segments; if (segments.length == 4 && path.options.closed) { // detect if this path looks like a rectangle parallel to the axis var a = []; for (var i = 0; i < segments.length; ++i) { if (segments[i].controlIn()) { // has curve? return false; } a[i] = segments[i].anchor(); } // it's a rectangle if the y/x/y/x or x/y/x/y coords of // consecutive points are the same. var isRect = ( a[0].y == a[1].y && a[1].x == a[2].x && a[2].y == a[3].y && a[3].x == a[0].x ) || ( a[0].x == a[1].x && a[1].y == a[2].y && a[2].x == a[3].x && a[3].y == a[0].y ); if (isRect) { // this saves a bunch of instructions in PDF: // moveTo, lineTo, lineTo, lineTo, close -> rect. page.rect(a[0].x, a[0].y, a[2].x - a[0].x /*width*/, a[2].y - a[0].y /*height*/); return true; } } } function _drawPath(element, page, pdf) { var segments = element.segments; if (segments.length === 0) { return; } if (!maybeDrawRect(element, page, pdf)) { for (var prev, i = 0; i < segments.length; ++i) { var seg = segments[i]; var anchor = seg.anchor(); if (!prev) { page.moveTo(anchor.x, anchor.y); } else { var prevOut = prev.controlOut(); var controlIn = seg.controlIn(); if (prevOut && controlIn) { page.bezier( prevOut.x , prevOut.y, controlIn.x , controlIn.y, anchor.x , anchor.y ); } else { page.lineTo(anchor.x, anchor.y); } } prev = seg; } if (element.options.closed) { page.close(); } } } function drawPath(element, page, pdf) { _drawPath(element, page, pdf); maybeFillStroke(element, page, pdf); } function drawMultiPath(element, page, pdf) { var paths = element.paths; for (var i = 0; i < paths.length; ++i) { _drawPath(paths[i], page, pdf); } maybeFillStroke(element, page, pdf); } function drawCircle(element, page, pdf) { var g = element.geometry(); page.circle(g.center.x, g.center.y, g.radius); maybeFillStroke(element, page, pdf); } function drawArc(element, page, pdf) { var points = element.geometry().curvePoints(); page.moveTo(points[0].x, points[0].y); for (var i = 1; i < points.length;) { page.bezier( points[i].x, points[i++].y, points[i].x, points[i++].y, points[i].x, points[i++].y ); } maybeFillStroke(element, page, pdf); } function drawText(element, page, pdf) { var style = PDF().parseFontDef(element.options.font); var pos = element._position; var mode; if (element.fill() && element.stroke()) { mode = PDF().TEXT_RENDERING_MODE.fillAndStroke; } else if (element.fill()) { mode = PDF().TEXT_RENDERING_MODE.fill; } else if (element.stroke()) { mode = PDF().TEXT_RENDERING_MODE.stroke; } page.transform(1, 0, 0, -1, pos.x, pos.y + style.fontSize); page.beginText(); page.setFont(PDF().getFontURL(style), style.fontSize); page.setTextRenderingMode(mode); page.showText(element.content()); page.endText(); } function drawGroup(element, page, pdf) { var children = element.children; for (var i = 0; i < children.length; ++i) { drawElement(children[i], page, pdf); } } function drawImage(element, page, pdf) { var url = element.src(); var rect = element.rect(); var tl = rect.getOrigin(); var sz = rect.getSize(); page.transform(sz.width, 0, 0, -sz.height, tl.x, tl.y + sz.height); page.drawImage(url); } function exportPDF(group, options) { var defer = $.Deferred(); group.options.set("pdf", options); drawing.pdf.toDataURL(group, defer.resolve); return defer.promise(); } function parseColor(x) { var color = kendo.parseColor(x, true); return color ? color.toRGB() : null; } function optimize(root) { var clipbox = false; var matrix = geo.Matrix.unit(); var currentBox = null; var changed; do { changed = false; root = opt(root); } while (root && changed); return { root: root, bbox: currentBox }; function change(newShape) { changed = true; return newShape; } function visible(shape) { return (shape.visible() && shape.opacity() > 0 && ( shouldDraw(shape.fill()) || shouldDraw(shape.stroke()) )); } function optArray(a) { var b = []; for (var i = 0; i < a.length; ++i) { var el = opt(a[i]); if (el != null) { b.push(el); } } return b; } function withClipping(shape, f) { var saveclipbox = clipbox; var savematrix = matrix; if (shape.transform()) { matrix = matrix.multiplyCopy(shape.transform().matrix()); } var clip = shape.clip(); if (clip) { clip = clip.bbox(); if (clip) { clip = clip.bbox(matrix); clipbox = clipbox ? geo.Rect.intersect(clipbox, clip) : clip; } } try { return f(); } finally { clipbox = saveclipbox; matrix = savematrix; } } function inClipbox(shape) { if (clipbox == null) { return false; } var box = shape.rawBBox().bbox(matrix); if (clipbox && box) { box = geo.Rect.intersect(box, clipbox); } return box; } function opt(shape) { return withClipping(shape, function(){ if (!(shape instanceof drawing.Group || shape instanceof drawing.MultiPath)) { var box = inClipbox(shape); if (!box) { return change(null); } currentBox = currentBox ? geo.Rect.union(currentBox, box) : box; } return dispatch({ Path: function(shape) { if (shape.segments.length === 0 || !visible(shape)) { return change(null); } return shape; }, MultiPath: function(shape) { if (!visible(shape)) { return change(null); } var el = new drawing.MultiPath(shape.options); el.paths = optArray(shape.paths); if (el.paths.length === 0) { return change(null); } return el; }, Circle: function(shape) { if (!visible(shape)) { return change(null); } return shape; }, Arc: function(shape) { if (!visible(shape)) { return change(null); } return shape; }, Text: function(shape) { if (!/\S/.test(shape.content()) || !visible(shape)) { return change(null); } return shape; }, Image: function(shape) { if (!(shape.visible() && shape.opacity() > 0)) { return change(null); } return shape; }, Group: function(shape) { var el = new drawing.Group(shape.options); el.children = optArray(shape.children); if (shape !== root && el.children.length === 0) { return change(null); } return el; } }, shape); }); } } kendo.deepExtend(drawing, { exportPDF: exportPDF, pdf: { toDataURL : toDataURL, toBlob : toBlob, saveAs : saveAs, toStream : render } }); })(window.kendo, window.kendo.jQuery); (function($, parseFloat, Math){ "use strict"; /* jshint eqnull:true */ /* jshint -W069 */ /* -----[ local vars ]----- */ var drawing = kendo.drawing; var geo = kendo.geometry; var slice = Array.prototype.slice; var browser = kendo.support.browser; var KENDO_PSEUDO_ELEMENT = "KENDO-PSEUDO-ELEMENT"; var IMAGE_CACHE = {}; /* -----[ exports ]----- */ function drawDOM(element) { var defer = $.Deferred(); element = $(element)[0]; if (typeof window.getComputedStyle != "function") { throw new Error("window.getComputedStyle is missing. You are using an unsupported browser, or running in IE8 compatibility mode. Drawing HTML is supported in Chrome, Firefox, Safari and IE9+."); } if (kendo.pdf) { kendo.pdf.defineFont(getFontFaces()); } if (element) { cacheImages(element, function(){ var group = new drawing.Group(); // translate to start of page var pos = element.getBoundingClientRect(); setTransform(group, [ 1, 0, 0, 1, -pos.left, -pos.top ]); nodeInfo._clipbox = false; nodeInfo._matrix = geo.Matrix.unit(); nodeInfo._stackingContext = { element: element, group: group }; $(element).addClass("k-pdf-export"); renderElement(element, group); $(element).removeClass("k-pdf-export"); defer.resolve(group); }); } else { defer.reject("No element to export"); } return defer.promise(); } drawing.drawDOM = drawDOM; drawDOM.getFontFaces = getFontFaces; var nodeInfo = {}; nodeInfo._root = nodeInfo; var parseGradient = (function(){ var tok_linear_gradient = /^((-webkit-|-moz-|-o-|-ms-)?linear-gradient\s*)\(/; var tok_radial_gradient = /^((-webkit-|-moz-|-o-|-ms-)?radial-gradient\s*)\(/; var tok_percent = /^([-0-9.]+%)/; var tok_length = /^([-0-9.]+px)/; var tok_keyword = /^(left|right|top|bottom|to|center)\W/; var tok_angle = /^([-0-9.]+(deg|grad|rad|turn))/; var tok_whitespace = /^(\s+)/; var tok_popen = /^(\()/; var tok_pclose = /^(\))/; var tok_comma = /^(,)/; var cache = {}; return function(input) { var orig = input; if (hasOwnProperty(cache, orig)) { return cache[orig]; } function skip_ws() { var m = tok_whitespace.exec(input); if (m) { input = input.substr(m[1].length); } } function read(token) { skip_ws(); var m = token.exec(input); if (m) { input = input.substr(m[1].length); return m[1]; } } function read_stop() { // XXX: do NOT use the parseColor (defined later) here. // kendo.parseColor leaves the `match` data in the // object, that would be lost after .toRGB(). var color = kendo.parseColor(input, true); var length, percent; if (color) { input = input.substr(color.match[0].length); color = color.toRGB(); if (!(length = read(tok_length))) { percent = read(tok_percent); } return { color: color, length: length, percent: percent }; } } function read_linear_gradient(propName) { var angle; var to1, to2; var stops = []; var reverse = false; if (read(tok_popen)) { // 1. [ || to , ]? angle = read(tok_angle); if (angle) { angle = parseAngle(angle); read(tok_comma); } else { to1 = read(tok_keyword); if (to1 == "to") { to1 = read(tok_keyword); } else if (to1 && /^-/.test(propName)) { reverse = true; } to2 = read(tok_keyword); read(tok_comma); } if (/-moz-/.test(propName) && angle == null && to1 == null) { var x = read(tok_percent), y = read(tok_percent); reverse = true; if (x == "0%") { to1 = "left"; } else if (x == "100%") { to1 = "right"; } if (y == "0%") { to2 = "top"; } else if (y == "100%") { to2 = "bottom"; } read(tok_comma); } // 2. color stops while (input && !read(tok_pclose)) { var stop = read_stop(); if (!stop) { break; } stops.push(stop); read(tok_comma); } return { type : "linear", angle : angle, to : to1 && to2 ? to1 + " " + to2 : to1 ? to1 : to2 ? to2 : null, stops : stops, reverse : reverse, orig : orig }; } } var tok = read(tok_linear_gradient); if (tok) { tok = read_linear_gradient(tok); } return (cache[orig] = tok); }; })(); var splitProperty = (function(){ var cache = {}; return function(input, separator) { if (!separator) { separator = /^\s*,\s*/; } var cacheKey = input + separator; if (hasOwnProperty(cache, cacheKey)) { return cache[cacheKey]; } var ret = []; var last = 0, pos = 0; var in_paren = 0; var in_string = false; var m; function looking_at(rx) { return (m = rx.exec(input.substr(pos))); } function trim(str) { return str.replace(/^\s+|\s+$/g, ""); } while (pos < input.length) { if (!in_string && looking_at(/^[\(\[\{]/)) { in_paren++; pos++; } else if (!in_string && looking_at(/^[\)\]\}]/)) { in_paren--; pos++; } else if (!in_string && looking_at(/^[\"\']/)) { in_string = m[0]; pos++; } else if (in_string == "'" && looking_at(/^\\\'/)) { pos += 2; } else if (in_string == '"' && looking_at(/^\\\"/)) { pos += 2; } else if (in_string == "'" && looking_at(/^\'/)) { in_string = false; pos++; } else if (in_string == '"' && looking_at(/^\"/)) { in_string = false; pos++; } else if (looking_at(separator)) { if (!in_string && !in_paren && pos > last) { ret.push(trim(input.substring(last, pos))); last = pos + m[0].length; } pos += m[0].length; } else { pos++; } } if (last < pos) { ret.push(trim(input.substring(last, pos))); } return (cache[cacheKey] = ret); }; })(); var getFontURL = (function(){ var cache = {}; return function(el){ // XXX: for IE we get here the whole cssText of the rule, // because the computedStyle.src is empty. Next time we need // to fix these regexps we better write a CSS parser. :-\ var url = cache[el]; if (!url) { var m; if ((m = /url\((['"]?)([^'")]*?)\1\)\s+format\((['"]?)truetype\3\)/.exec(el))) { url = cache[el] = m[2]; } else if ((m = /url\((['"]?)([^'")]*?\.ttf)\1\)/.exec(el))) { url = cache[el] = m[2]; } } return url; }; })(); function getFontFaces() { var result = {}; for (var i = 0; i < document.styleSheets.length; ++i) { doStylesheet(document.styleSheets[i]); } return result; function doStylesheet(ss) { if (ss) { var rules = null; try { rules = ss.cssRules; } catch(ex) {} if (rules) { addRules(ss, rules); } } } function findFonts(rule) { var src = getPropertyValue(rule.style, "src"); if (src) { return splitProperty(src).reduce(function(a, el){ var font = getFontURL(el); if (font) { a.push(font); } return a; }, []); } else { // Internet Explorer // XXX: this is gross. should work though for valid CSS. var font = getFontURL(rule.cssText); return font ? [ font ] : []; } } function addRules(styleSheet, rules) { for (var i = 0; i < rules.length; ++i) { var r = rules[i]; switch (r.type) { case 3: // CSSImportRule doStylesheet(r.styleSheet); break; case 5: // CSSFontFaceRule var style = r.style; var family = splitProperty(getPropertyValue(style, "font-family")); var bold = /^(400|bold)$/i.test(getPropertyValue(style, "font-weight")); var italic = "italic" == getPropertyValue(style, "font-style"); var src = findFonts(r); if (src.length > 0) { addRule(styleSheet, family, bold, italic, src[0]); } } } } function addRule(styleSheet, names, bold, italic, url) { // We get full resolved absolute URLs in Chrome, but sadly // not in Firefox. if (!(/^https?:\/\//.test(url) || /^\//.test(url))) { url = String(styleSheet.href).replace(/[^\/]*$/, "") + url; } names.forEach(function(name){ name = name.replace(/^(['"]?)(.*?)\1$/, "$2"); // it's quoted if (bold) { name += "|bold"; } if (italic) { name += "|italic"; } result[name] = url; }); } } function hasOwnProperty(obj, key) { return Object.prototype.hasOwnProperty.call(obj, key); } function getCounter(name) { name = "_counter_" + name; return nodeInfo[name]; } function getAllCounters(name) { var values = [], p = nodeInfo; name = "_counter_" + name; while (p) { if (hasOwnProperty(p, name)) { values.push(p[name]); } p = Object.getPrototypeOf(p); } return values.reverse(); } function incCounter(name, inc) { var p = nodeInfo; name = "_counter_" + name; while (p && !hasOwnProperty(p, name)) { p = Object.getPrototypeOf(p); } if (!p) { p = nodeInfo._root; } p[name] = (p[name] || 0) + (inc == null ? 1 : inc); } function resetCounter(name, val) { name = "_counter_" + name; nodeInfo[name] = val == null ? 0 : val; } function doCounters(a, f, def) { for (var i = 0; i < a.length;) { var name = a[i++]; var val = parseFloat(a[i]); if (isNaN(val)) { f(name, def); } else { f(name, val); ++i; } } } function parseColor(str, css) { var color = kendo.parseColor(str); if (color) { color = color.toRGB(); if (css) { color = color.toCssRgba(); } else if (color.a === 0) { color = null; } } return color; } function cacheImages(element, callback) { var urls = []; function add(url) { if (!IMAGE_CACHE[url]) { IMAGE_CACHE[url] = true; urls.push(url); } } (function dive(element){ var bg = backgroundImageURL(getPropertyValue(getComputedStyle(element), "background-image")); if (/^img$/i.test(element.tagName)) { add(element.src); } if (bg) { add(bg); } for (var i = element.firstChild; i; i = i.nextSibling) { if (i.nodeType == 1) { dive(i); } } })(element); var count = urls.length; function next() { if (--count <= 0) { callback(); } } if (count === 0) { next(); } urls.forEach(function(url){ var img = IMAGE_CACHE[url] = new Image(); if (!(/^data:/i.test(url))) { img.crossOrigin = "Anonymous"; } img.src = url; if (img.complete) { next(); } else { img.onload = next; img.onerror = function() { IMAGE_CACHE[url] = null; next(); }; } }); } function romanNumeral(n) { var literals = { 1 : "i", 10 : "x", 100 : "c", 2 : "ii", 20 : "xx", 200 : "cc", 3 : "iii", 30 : "xxx", 300 : "ccc", 4 : "iv", 40 : "xl", 400 : "cd", 5 : "v", 50 : "l", 500 : "d", 6 : "vi", 60 : "lx", 600 : "dc", 7 : "vii", 70 : "lxx", 700 : "dcc", 8 : "viii", 80 : "lxxx", 800 : "dccc", 9 : "ix", 90 : "xc", 900 : "cm", 1000 : "m" }; var values = [ 1000, 900 , 800, 700, 600, 500, 400, 300, 200, 100, 90 , 80 , 70 , 60 , 50 , 40 , 30 , 20 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ]; var roman = ""; while (n > 0) { if (n < values[0]) { values.shift(); } else { roman += literals[values[0]]; n -= values[0]; } } return roman; } function alphaNumeral(n) { var result = ""; do { var r = n % 26; result = String.fromCharCode(97 + r) + result; n = Math.floor(n / 26); } while (n > 0); return result; } function backgroundImageURL(backgroundImage) { var m = /^\s*url\((['"]?)(.*?)\1\)\s*$/i.exec(backgroundImage); if (m) { return m[2]; } } function pushNodeInfo(element, style, group) { nodeInfo = Object.create(nodeInfo); nodeInfo[element.tagName.toLowerCase()] = { element: element, style: style }; var decoration = getPropertyValue(style, "text-decoration"); if (decoration && decoration != "none") { var color = getPropertyValue(style, "color"); decoration.split(/\s+/g).forEach(function(name){ if (!nodeInfo[name]) { nodeInfo[name] = color; } }); } if (createsStackingContext(element)) { nodeInfo._stackingContext = { element: element, group: group }; } } function popNodeInfo() { nodeInfo = Object.getPrototypeOf(nodeInfo); } function updateClipbox(path) { if (nodeInfo._clipbox != null) { var box = path.bbox(nodeInfo._matrix); if (nodeInfo._clipbox) { nodeInfo._clipbox = geo.Rect.intersect(nodeInfo._clipbox, box); } else { nodeInfo._clipbox = box; } } } function createsStackingContext(element) { var style = getComputedStyle(element); function prop(name) { return getPropertyValue(style, name); } if (prop("transform") != "none" || (prop("position") != "static" && prop("z-index") != "auto") || (prop("opacity") < 1)) { return true; } } function getComputedStyle(element, pseudoElt) { return window.getComputedStyle(element, pseudoElt || null); } function getPropertyValue(style, prop) { return style.getPropertyValue(prop) || ( browser.webkit && style.getPropertyValue("-webkit-" + prop )) || ( browser.firefox && style.getPropertyValue("-moz-" + prop )) || ( browser.opera && style.getPropertyValue("-o-" + prop)) || ( browser.msie && style.getPropertyValue("-ms-" + prop)) ; } function pleaseSetPropertyValue(style, prop, value, important) { style.setProperty(prop, value, important); if (browser.webkit) { style.setProperty("-webkit-" + prop, value, important); } else if (browser.firefox) { style.setProperty("-moz-" + prop, value, important); } else if (browser.opera) { style.setProperty("-o-" + prop, value, important); } else if (browser.msie) { style.setProperty("-ms-" + prop, value, important); prop = "ms" + prop.replace(/(^|-)([a-z])/g, function(s, p1, p2){ return p1 + p2.toUpperCase(); }); style[prop] = value; } } function getBorder(style, side) { side = "border-" + side; return { width: parseFloat(getPropertyValue(style, side + "-width")), style: getPropertyValue(style, side + "-style"), color: parseColor(getPropertyValue(style, side + "-color"), true) }; } function saveStyle(element, func) { var prev = element.style.cssText; var result = func(); element.style.cssText = prev; return result; } function getBorderRadius(style, side) { var r = getPropertyValue(style, "border-" + side + "-radius").split(/\s+/g).map(parseFloat); if (r.length == 1) { r.push(r[0]); } return sanitizeRadius({ x: r[0], y: r[1] }); } function getContentBox(element) { var box = element.getBoundingClientRect(); box = innerBox(box, "border-*-width", element); box = innerBox(box, "padding-*", element); return box; } function innerBox(box, prop, element) { var style, wt, wr, wb, wl; if (typeof prop == "string") { style = getComputedStyle(element); wt = parseFloat(getPropertyValue(style, prop.replace("*", "top"))); wr = parseFloat(getPropertyValue(style, prop.replace("*", "right"))); wb = parseFloat(getPropertyValue(style, prop.replace("*", "bottom"))); wl = parseFloat(getPropertyValue(style, prop.replace("*", "left"))); } else if (typeof prop == "number") { wt = wr = wb = wl = prop; } return { top : box.top + wt, right : box.right - wr, bottom : box.bottom - wb, left : box.left + wl, width : box.right - box.left - wr - wl, height : box.bottom - box.top - wb - wt }; } function getTransform(style) { var transform = getPropertyValue(style, "transform"); if (transform == "none") { return null; } var matrix = /^\s*matrix\(\s*(.*?)\s*\)\s*$/.exec(transform); if (matrix) { var origin = getPropertyValue(style, "transform-origin"); matrix = matrix[1].split(/\s*,\s*/g).map(parseFloat); origin = origin.split(/\s+/g).map(parseFloat); return { matrix: matrix, origin: origin }; } } function radiansToDegrees(radians) { return ((180 * radians) / Math.PI) % 360; } function parseAngle(angle) { var num = parseFloat(angle); if (/grad$/.test(angle)) { return Math.PI * num / 200; } else if (/rad$/.test(angle)) { return num; } else if (/turn$/.test(angle)) { return Math.PI * num * 2; } else if (/deg$/.test(angle)) { return Math.PI * num / 180; } } function setTransform(shape, m) { m = new geo.Matrix(m[0], m[1], m[2], m[3], m[4], m[5]); shape.transform(m); return m; } function setClipping(shape, clipPath) { shape.clip(clipPath); } function addArcToPath(path, x, y, options) { var points = new geo.Arc([ x, y ], options).curvePoints(), i = 1; while (i < points.length) { path.curveTo(points[i++], points[i++], points[i++]); } } function sanitizeRadius(r) { if (r.x <= 0 || r.y <= 0) { r.x = r.y = 0; } return r; } function elementRoundBox(element, box, type) { var style = getComputedStyle(element); var rTL = getBorderRadius(style, "top-left"); var rTR = getBorderRadius(style, "top-right"); var rBL = getBorderRadius(style, "bottom-left"); var rBR = getBorderRadius(style, "bottom-right"); if (type == "padding" || type == "content") { var bt = getBorder(style, "top"); var br = getBorder(style, "right"); var bb = getBorder(style, "bottom"); var bl = getBorder(style, "left"); rTL.x -= bl.width; rTL.y -= bt.width; rTR.x -= br.width; rTR.y -= bt.width; rBR.x -= br.width; rBR.y -= bb.width; rBL.x -= bl.width; rBL.y -= bb.width; if (type == "content") { var pt = parseFloat(getPropertyValue(style, "padding-top")); var pr = parseFloat(getPropertyValue(style, "padding-right")); var pb = parseFloat(getPropertyValue(style, "padding-bottom")); var pl = parseFloat(getPropertyValue(style, "padding-left")); rTL.x -= pl; rTL.y -= pt; rTR.x -= pr; rTR.y -= pt; rBR.x -= pr; rBR.y -= pb; rBL.x -= pl; rBL.y -= pb; } } if (typeof type == "number") { rTL.x -= type; rTL.y -= type; rTR.x -= type; rTR.y -= type; rBR.x -= type; rBR.y -= type; rBL.x -= type; rBL.y -= type; } return roundBox(box, rTL, rTR, rBR, rBL); } // Create a drawing.Path for a rounded rectangle. Receives the // bounding box and the border-radiuses in CSS order (top-left, // top-right, bottom-right, bottom-left). The radiuses must be // objects containing x (horiz. radius) and y (vertical radius). function roundBox(box, rTL, rTR, rBR, rBL) { var path = new drawing.Path({ fill: null, stroke: null }); sanitizeRadius(rTL); sanitizeRadius(rTR); sanitizeRadius(rBR); sanitizeRadius(rBL); path.moveTo(box.left, box.top + rTL.y); if (rTL.x) { addArcToPath(path, box.left + rTL.x, box.top + rTL.y, { startAngle: -180, endAngle: -90, radiusX: rTL.x, radiusY: rTL.y }); } path.lineTo(box.right - rTR.x, box.top); if (rTR.x) { addArcToPath(path, box.right - rTR.x, box.top + rTR.y, { startAngle: -90, endAngle: 0, radiusX: rTR.x, radiusY: rTR.y }); } path.lineTo(box.right, box.bottom - rBR.y); if (rBR.x) { addArcToPath(path, box.right - rBR.x, box.bottom - rBR.y, { startAngle: 0, endAngle: 90, radiusX: rBR.x, radiusY: rBR.y }); } path.lineTo(box.left + rBL.x, box.bottom); if (rBL.x) { addArcToPath(path, box.left + rBL.x, box.bottom - rBL.y, { startAngle: 90, endAngle: 180, radiusX: rBL.x, radiusY: rBL.y }); } return path.close(); } function formatCounter(val, style) { var str = parseFloat(val) + ""; switch (style) { case "decimal-leading-zero": if (str.length < 2) { str = "0" + str; } return str; case "lower-roman": return romanNumeral(val); case "upper-roman": return romanNumeral(val).toUpperCase(); case "lower-latin": case "lower-alpha": return alphaNumeral(val - 1); case "upper-latin": case "upper-alpha": return alphaNumeral(val - 1).toUpperCase(); default: return str; } } function evalPseudoElementContent(element, content) { function displayCounter(name, style, separator) { if (!separator) { return formatCounter(getCounter(name) || 0, style); } separator = separator.replace(/^\s*(["'])(.*)\1\s*$/, "$2"); return getAllCounters(name).map(function(val){ return formatCounter(val, style); }).join(separator); } var a = splitProperty(content, /^\s+/); var result = [], m; a.forEach(function(el){ var tmp; if ((m = /^\s*(["'])(.*)\1\s*$/.exec(el))) { result.push(m[2].replace(/\\([0-9a-f]{4})/gi, function(s, p){ return String.fromCharCode(parseInt(p, 16)); })); } else if ((m = /^\s*counter\((.*?)\)\s*$/.exec(el))) { tmp = splitProperty(m[1]); result.push(displayCounter(tmp[0], tmp[1])); } else if ((m = /^\s*counters\((.*?)\)\s*$/.exec(el))) { tmp = splitProperty(m[1]); result.push(displayCounter(tmp[0], tmp[2], tmp[1])); } else if ((m = /^\s*attr\((.*?)\)\s*$/.exec(el))) { result.push(element.getAttribute(m[1]) || ""); } else { result.push(el); } }); return result.join(""); } function getCssText(style) { if (style.cssText) { return style.cssText; } // Status: NEW. Report year: 2002. Current year: 2014. // Nice played, Mozillians. // https://bugzilla.mozilla.org/show_bug.cgi?id=137687 var result = []; for (var i = 0; i < style.length; ++i) { result.push(style[i] + ": " + getPropertyValue(style, style[i])); } return result.join(";\n"); } function _renderWithPseudoElements(element, group) { if (element.tagName == KENDO_PSEUDO_ELEMENT) { _renderElement(element, group); return; } var fake = []; function pseudo(kind, place) { var style = getComputedStyle(element, kind); if (style.content && style.content != "normal" && style.content != "none") { var psel = document.createElement(KENDO_PSEUDO_ELEMENT); psel.style.cssText = getCssText(style); psel.textContent = evalPseudoElementContent(element, style.content); element.insertBefore(psel, place); if (kind == ":before" && !(/absolute|fixed/.test(getPropertyValue(psel.style, "position")))) { // we need to shift the "pseudo element" to the left by its width, because we // created it as a real node and it'll overlap the host element position. psel.style.marginLeft = parseFloat(getPropertyValue(psel.style, "margin-left")) - psel.offsetWidth + "px"; } fake.push(psel); } } pseudo(":before", element.firstChild); pseudo(":after", null); _renderElement(element, group); fake.forEach(function(el){ element.removeChild(el); }); } function _renderElement(element, group) { var style = getComputedStyle(element); var top = getBorder(style, "top"); var right = getBorder(style, "right"); var bottom = getBorder(style, "bottom"); var left = getBorder(style, "left"); var rTL = getBorderRadius(style, "top-left"); var rTR = getBorderRadius(style, "top-right"); var rBL = getBorderRadius(style, "bottom-left"); var rBR = getBorderRadius(style, "bottom-right"); var dir = getPropertyValue(style, "direction"); var backgroundColor = getPropertyValue(style, "background-color"); backgroundColor = parseColor(backgroundColor); var backgroundImage = splitProperty( getPropertyValue(style, "background-image") ); var backgroundRepeat = splitProperty( getPropertyValue(style, "background-repeat") ); var backgroundPosition = splitProperty( getPropertyValue(style, "background-position") ); var backgroundOrigin = splitProperty( getPropertyValue(style, "background-origin") ); var backgroundSize = splitProperty( getPropertyValue(style, "background-size") ); if (browser.msie && browser.version < 10) { // IE9 hacks. getPropertyValue won't return the correct // value. Sucks that we have to do it here, I'd prefer to // move it in getPropertyValue, but we don't have the // element. backgroundPosition = splitProperty(element.currentStyle.backgroundPosition); } var innerbox = innerBox(element.getBoundingClientRect(), "border-*-width", element); // CSS "clip" property - if present, replace the group with a // new one which is clipped. This must happen before drawing // the borders and background. (function(){ var clip = getPropertyValue(style, "clip"); var m = /^\s*rect\((.*)\)\s*$/.exec(clip); if (m) { var a = m[1].split(/[ ,]+/g); var top = a[0] == "auto" ? innerbox.top : parseFloat(a[0]) + innerbox.top; var right = a[1] == "auto" ? innerbox.right : parseFloat(a[1]) + innerbox.left; var bottom = a[2] == "auto" ? innerbox.bottom : parseFloat(a[2]) + innerbox.top; var left = a[3] == "auto" ? innerbox.left : parseFloat(a[3]) + innerbox.left; var tmp = new drawing.Group(); var clipPath = new drawing.Path() .moveTo(left, top) .lineTo(right, top) .lineTo(right, bottom) .lineTo(left, bottom) .close(); setClipping(tmp, clipPath); group.append(tmp); group = tmp; updateClipbox(clipPath); } })(); var boxes = element.getClientRects(); if (boxes.length == 1) { // Workaround the missing borders in Chrome! getClientRects() boxes contains values // rounded to integer. getBoundingClientRect() appears to work fine. We still need // getClientRects() to support cases where there are more boxes (continued inline // elements that might have border/background). boxes = [ element.getBoundingClientRect() ]; } // This function workarounds another Chrome bug, where boxes returned for a table with // border-collapse: collapse will overlap the table border. Our rendering is not perfect in // such case anyway, but with this is better than without it. boxes = adjustBoxes(boxes); for (var i = 0; i < boxes.length; ++i) { drawOneBox(boxes[i], i === 0, i == boxes.length - 1); } if (boxes.length > 0 && getPropertyValue(style, "display") == "list-item") { drawBullet(boxes[0]); } // overflow: hidden/auto - if present, replace the group with // a new one clipped by the inner box. (function(){ function clipit() { var clipPath = elementRoundBox(element, innerbox, "padding"); var tmp = new drawing.Group(); setClipping(tmp, clipPath); group.append(tmp); group = tmp; updateClipbox(clipPath); } if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, "overflow"))) { clipit(); } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, "overflow-x"))) { clipit(); } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, "overflow-y"))) { clipit(); } })(); if (!maybeRenderWidget(element, group)) { renderContents(element, group); } return group; // only utility functions after this line. function adjustBoxes(boxes) { if (/^td$/i.test(element.tagName)) { var table = nodeInfo.table; if (table && getPropertyValue(table.style, "border-collapse") == "collapse") { var tableBorderLeft = getBorder(table.style, "left").width; var tableBorderTop = getBorder(table.style, "top").width; // check if we need to adjust if (tableBorderLeft === 0 && tableBorderTop === 0) { return boxes; // nope } var tableBox = table.element.getBoundingClientRect(); var firstCell = table.element.rows[0].cells[0]; var firstCellBox = firstCell.getBoundingClientRect(); if (firstCellBox.top == tableBox.top || firstCellBox.left == tableBox.left) { return slice.call(boxes).map(function(box){ return { left : box.left + tableBorderLeft, top : box.top + tableBorderTop, right : box.right + tableBorderLeft, bottom : box.bottom + tableBorderTop, height : box.height, width : box.width }; }); } } } return boxes; } // this function will be called to draw each border. it // draws starting at origin and the resulted path must be // translated/rotated to be placed in the proper position. // // arguments are named as if it draws the top border: // // - `len` the length of the edge // - `Wtop` the width of the edge (i.e. border-top-width) // - `Wleft` the width of the left edge (border-left-width) // - `Wright` the width of the right edge // - `rl` and `rl` -- the border radius on the left and right // (objects containing x and y, for horiz/vertical radius) // - `transform` -- transformation to apply // function drawEdge(color, len, Wtop, Wleft, Wright, rl, rr, transform) { if (Wtop <= 0) { return; } var path, edge = new drawing.Group(); setTransform(edge, transform); group.append(edge); sanitizeRadius(rl); sanitizeRadius(rr); // draw main border. this is the area without the rounded corners path = new drawing.Path({ fill: { color: color }, stroke: null }); edge.append(path); path.moveTo(rl.x ? Math.max(rl.x, Wleft) : 0, 0) .lineTo(len - (rr.x ? Math.max(rr.x, Wright) : 0), 0) .lineTo(len - Math.max(rr.x, Wright), Wtop) .lineTo(Math.max(rl.x, Wleft), Wtop) .close(); if (rl.x) { drawRoundCorner(Wleft, rl, [ -1, 0, 0, 1, rl.x, 0 ]); } if (rr.x) { drawRoundCorner(Wright, rr, [ 1, 0, 0, 1, len - rr.x, 0 ]); } // draws one round corner, starting at origin (needs to be // translated/rotated to be placed properly). function drawRoundCorner(Wright, r, transform) { var angle = Math.PI/2 * Wright / (Wright + Wtop); // not sanitizing this one, because negative values // are useful to fill the box correctly. var ri = { x: r.x - Wright, y: r.y - Wtop }; var path = new drawing.Path({ fill: { color: color }, stroke: null }).moveTo(0, 0); setTransform(path, transform); addArcToPath(path, 0, r.y, { startAngle: -90, endAngle: -radiansToDegrees(angle), radiusX: r.x, radiusY: r.y }); if (ri.x > 0 && ri.y > 0) { path.lineTo(ri.x * Math.cos(angle), r.y - ri.y * Math.sin(angle)); addArcToPath(path, 0, r.y, { startAngle: -radiansToDegrees(angle), endAngle: -90, radiusX: ri.x, radiusY: ri.y, anticlockwise: true }); } else if (ri.x > 0) { path.lineTo(ri.x, Wtop) .lineTo(0, Wtop); } else { path.lineTo(ri.x, Wtop) .lineTo(ri.x, 0); } edge.append(path.close()); } } function drawBackground(box) { var background = new drawing.Group(); setClipping(background, roundBox(box, rTL, rTR, rBR, rBL)); group.append(background); if (backgroundColor) { var path = new drawing.Path({ fill: { color: backgroundColor.toCssRgba() }, stroke: null }); path.moveTo(box.left, box.top) .lineTo(box.right, box.top) .lineTo(box.right, box.bottom) .lineTo(box.left, box.bottom) .close(); background.append(path); } var bgImage, bgRepeat, bgPosition, bgOrigin, bgSize; for (var i = backgroundImage.length; --i >= 0;) { bgImage = backgroundImage[i]; bgRepeat = backgroundRepeat[i] || backgroundRepeat[backgroundRepeat.length - 1]; bgPosition = backgroundPosition[i] || backgroundPosition[backgroundPosition.length - 1]; bgOrigin = backgroundOrigin[i] || backgroundOrigin[backgroundOrigin.length - 1]; bgSize = backgroundSize[i] || backgroundSize[backgroundSize.length - 1]; drawOneBackground( background, box, bgImage, bgRepeat, bgPosition, bgOrigin, bgSize ); } } function drawOneBackground(group, box, backgroundImage, backgroundRepeat, backgroundPosition, backgroundOrigin, backgroundSize) { if (!backgroundImage || (backgroundImage == "none")) { return; } // SVG taints the canvas, can't draw it. if (/^url\(\"data:image\/svg/i.test(backgroundImage)) { return; } var url = backgroundImageURL(backgroundImage); if (url) { var img = IMAGE_CACHE[url]; if (img && img.width > 0 && img.height > 0) { drawBackgroundImage(group, box, img.width, img.height, function(group, rect){ group.append(new drawing.Image(url, rect)); }); } } else { var gradient = parseGradient(backgroundImage); if (gradient) { drawBackgroundImage(group, box, box.width, box.height, gradientRenderer(gradient)); } } function drawBackgroundImage(group, box, img_width, img_height, renderBG) { var aspect_ratio = img_width / img_height; // for background-origin: border-box the box is already appropriate var orgBox = box; if (backgroundOrigin == "content-box") { orgBox = innerBox(orgBox, "border-*-width", element); orgBox = innerBox(orgBox, "padding-*", element); } else if (backgroundOrigin == "padding-box") { orgBox = innerBox(orgBox, "border-*-width", element); } if (!/^\s*auto(\s+auto)?\s*$/.test(backgroundSize)) { var size = backgroundSize.split(/\s+/g); // compute width if (/%$/.test(size[0])) { img_width = orgBox.width * parseFloat(size[0]) / 100; } else { img_width = parseFloat(size[0]); } // compute height if (size.length == 1 || size[1] == "auto") { img_height = img_width / aspect_ratio; } else if (/%$/.test(size[1])) { img_height = orgBox.height * parseFloat(size[1]) / 100; } else { img_height = parseFloat(size[1]); } } var pos = (backgroundPosition+"").split(/\s+/); if (pos.length == 1) { pos[1] = "50%"; } if (/%$/.test(pos[0])) { pos[0] = parseFloat(pos[0]) / 100 * (orgBox.width - img_width); } else { pos[0] = parseFloat(pos[0]); } if (/%$/.test(pos[1])) { pos[1] = parseFloat(pos[1]) / 100 * (orgBox.height - img_height); } else { pos[1] = parseFloat(pos[1]); } var rect = new geo.Rect([ orgBox.left + pos[0], orgBox.top + pos[1] ], [ img_width, img_height ]); // XXX: background-repeat could be implemented more // efficiently as a fill pattern (at least for PDF // output, probably SVG too). function rewX() { while (rect.origin.x > box.left) { rect.origin.x -= img_width; } } function rewY() { while (rect.origin.y > box.top) { rect.origin.y -= img_height; } } function repeatX() { while (rect.origin.x < box.right) { renderBG(group, rect.clone()); rect.origin.x += img_width; } } if (backgroundRepeat == "no-repeat") { renderBG(group, rect); } else if (backgroundRepeat == "repeat-x") { rewX(); repeatX(); } else if (backgroundRepeat == "repeat-y") { rewY(); while (rect.origin.y < box.bottom) { renderBG(group, rect.clone()); rect.origin.y += img_height; } } else if (backgroundRepeat == "repeat") { rewX(); rewY(); var origin = rect.origin.clone(); while (rect.origin.y < box.bottom) { rect.origin.x = origin.x; repeatX(); rect.origin.y += img_height; } } } } function drawBullet(box) { var listStyleType = getPropertyValue(style, "list-style-type"); if (listStyleType == "none") { return; } var listStyleImage = getPropertyValue(style, "list-style-image"); var listStylePosition = getPropertyValue(style, "list-style-position"); function _drawBullet(f) { saveStyle(element, function(){ element.style.position = "relative"; var bullet = document.createElement(KENDO_PSEUDO_ELEMENT); bullet.style.position = "absolute"; bullet.style.boxSizing = "border-box"; if (listStylePosition == "outside") { bullet.style.width = "6em"; bullet.style.left = "-6.8em"; bullet.style.textAlign = "right"; } else { bullet.style.left = "0px"; } f(bullet); element.insertBefore(bullet, element.firstChild); renderElement(bullet, group); element.removeChild(bullet); }); } function elementIndex(f) { var a = element.parentNode.children; for (var i = 0; i < a.length; ++i) { if (a[i] === element) { return f(i, a.length); } } } switch (listStyleType) { case "circle": case "disc": case "square": _drawBullet(function(bullet){ // XXX: the science behind these values is called "trial and error". // also, ZapfDingbats works well in PDF output, but not in SVG/Canvas. bullet.style.fontSize = "70%"; bullet.style.lineHeight = "150%"; bullet.style.paddingRight = "0.5em"; bullet.style.fontFamily = "ZapfDingbats"; bullet.innerHTML = { "disc" : "l", "circle" : "m", "square" : "n" }[listStyleType]; }); break; case "decimal": case "decimal-leading-zero": _drawBullet(function(bullet){ elementIndex(function(idx, len){ ++idx; if (listStyleType == "decimal-leading-zero" && (idx+"").length < 2) { idx = "0" + idx; } bullet.innerHTML = idx + "."; }); }); break; case "lower-roman": case "upper-roman": _drawBullet(function(bullet){ elementIndex(function(idx, len){ idx = romanNumeral(idx + 1); if (listStyleType == "upper-roman") { idx = idx.toUpperCase(); } bullet.innerHTML = idx + "."; }); }); break; case "lower-latin": case "lower-alpha": case "upper-latin": case "upper-alpha": _drawBullet(function(bullet){ elementIndex(function(idx, len){ idx = alphaNumeral(idx); if (/^upper/i.test(listStyleType)) { idx = idx.toUpperCase(); } bullet.innerHTML = idx + "."; }); }); break; } } // draws a single border box function drawOneBox(box, isFirst, isLast) { if (box.width === 0 || box.height === 0) { return; } drawBackground(box); var shouldDrawLeft = (left.width > 0 && ((isFirst && dir == "ltr") || (isLast && dir == "rtl"))); var shouldDrawRight = (right.width > 0 && ((isLast && dir == "ltr") || (isFirst && dir == "rtl"))); // The most general case is that the 4 borders have different widths and border // radiuses. The way that is handled is by drawing 3 Paths for each border: the // straight line, and two round corners which represent half of the entire rounded // corner. To simplify code those shapes are drawed at origin (by the drawEdge // function), then translated/rotated into the right position. // // However, this leads to poor results due to rounding in the simpler cases where // borders are straight lines. Therefore we handle a few such cases separately with // straight lines. C^wC^wC^w -- nope, scratch that. poor rendering was because of a bug // in Chrome (getClientRects() returns rounded integer values rather than exact floats. // web dev is still a ghetto.) // first, just in case there is no border... if (top.width === 0 && left.width === 0 && right.width === 0 && bottom.width === 0) { return; } if (true) { // so that it's easy to comment out.. uglifyjs will drop the spurious if. // if all borders have equal colors... if (top.color == right.color && top.color == bottom.color && top.color == left.color) { // if same widths too, we can draw the whole border by stroking a single path. if (top.width == right.width && top.width == bottom.width && top.width == left.width) { if (shouldDrawLeft && shouldDrawRight) { // reduce box by half the border width, so we can draw it by stroking. box = innerBox(box, top.width/2); // adjust the border radiuses, again by top.width/2, and make the path element. var path = elementRoundBox(element, box, top.width/2); path.options.stroke = { color: top.color, width: top.width }; group.append(path); return; } } } // if border radiuses are zero and widths are at most one pixel, we can again use simple // paths. if (rTL.x === 0 && rTR.x === 0 && rBR.x === 0 && rBL.x === 0) { // alright, 1.9px will do as well. the difference in color blending should not be // noticeable. if (top.width < 2 && left.width < 2 && right.width < 2 && bottom.width < 2) { // top border if (top.width > 0) { group.append( new drawing.Path({ stroke: { width: top.width, color: top.color } }) .moveTo(box.left, box.top + top.width/2) .lineTo(box.right, box.top + top.width/2) ); } // bottom border if (bottom.width > 0) { group.append( new drawing.Path({ stroke: { width: bottom.width, color: bottom.color } }) .moveTo(box.left, box.bottom - bottom.width/2) .lineTo(box.right, box.bottom - bottom.width/2) ); } // left border if (shouldDrawLeft) { group.append( new drawing.Path({ stroke: { width: left.width, color: left.color } }) .moveTo(box.left + left.width/2, box.top) .lineTo(box.left + left.width/2, box.bottom) ); } // right border if (shouldDrawRight) { group.append( new drawing.Path({ stroke: { width: right.width, color: right.color } }) .moveTo(box.right - right.width/2, box.top) .lineTo(box.right - right.width/2, box.bottom) ); } return; } } } // top border drawEdge(top.color, box.width, top.width, left.width, right.width, rTL, rTR, [ 1, 0, 0, 1, box.left, box.top ]); // bottom border drawEdge(bottom.color, box.width, bottom.width, right.width, left.width, rBR, rBL, [ -1, 0, 0, -1, box.right, box.bottom ]); // for left/right borders we need to invert the border-radiuses function inv(p) { return { x: p.y, y: p.x }; } // left border drawEdge(left.color, box.height, left.width, bottom.width, top.width, inv(rBL), inv(rTL), [ 0, -1, 1, 0, box.left, box.bottom ]); // right border drawEdge(right.color, box.height, right.width, top.width, bottom.width, inv(rTR), inv(rBR), [ 0, 1, -1, 0, box.right, box.top ]); } } function gradientRenderer(gradient) { return function(group, rect) { var width = rect.width(), height = rect.height(), tl = rect.topLeft(); switch (gradient.type) { case "linear": // figure out the angle. var angle = gradient.angle != null ? gradient.angle : Math.PI; switch (gradient.to) { case "top": angle = 0; break; case "left": angle = -Math.PI / 2; break; case "bottom": angle = Math.PI; break; case "right": angle = Math.PI / 2; break; case "top left": case "left top": angle = -Math.atan2(height, width); break; case "top right": case "right top": angle = Math.atan2(height, width); break; case "bottom left": case "left bottom": angle = Math.PI + Math.atan2(height, width); break; case "bottom right": case "right bottom": angle = Math.PI - Math.atan2(height, width); break; } if (gradient.reverse) { angle -= Math.PI; } // limit the angle between 0..2PI angle %= 2 * Math.PI; if (angle < 0) { angle += 2 * Math.PI; } // compute gradient's start/end points. here len is the length of the gradient line // and x,y is the end point relative to the center of the rectangle in conventional // (math) axis direction. // this is the original (unscaled) length of the gradient line. needed to deal with // absolutely positioned color stops. formula from the CSS spec: // http://dev.w3.org/csswg/css-images-3/#linear-gradient-syntax var pxlen = Math.abs(width * Math.sin(angle)) + Math.abs(height * Math.cos(angle)); // The math below is pretty simple, but it took a while to figure out. We compute x // and y, the *end* of the gradient line. However, we want to transform them into // element-based coordinates (SVG's gradientUnits="objectBoundingBox"). That means, // x=0 is the left edge, x=1 is the right edge, y=0 is the top edge and y=1 is the // bottom edge. // // A naive approach would use the original angle for these calculations. Say we'd // like to draw a gradient angled at 45deg in a 100x400 box. When we use // objectBoundingBox, the renderer will draw it in a 1x1 *square* box, and then // scale that to the desired dimensions. The 45deg angle will look more like 70deg // after scaling. SVG (http://www.w3.org/TR/SVG/pservers.html#LinearGradients) says // the following: // // When gradientUnits="objectBoundingBox" and 'gradientTransform' is the // identity matrix, the normal of the linear gradient is perpendicular to the // gradient vector in object bounding box space (i.e., the abstract coordinate // system where (0,0) is at the top/left of the object bounding box and (1,1) is // at the bottom/right of the object bounding box). When the object's bounding // box is not square, the gradient normal which is initially perpendicular to // the gradient vector within object bounding box space may render // non-perpendicular relative to the gradient vector in user space. If the // gradient vector is parallel to one of the axes of the bounding box, the // gradient normal will remain perpendicular. This transformation is due to // application of the non-uniform scaling transformation from bounding box space // to user space. // // which is an extremely long and confusing way to tell what I just said above. // // For this reason we need to apply the reverse scaling to the original angle, so // that when it'll finally be rendered it'll actually be at the desired slope. Now // I'll let you figure out the math yourself. var scaledAngle = Math.atan(width * Math.tan(angle) / height); var sin = Math.sin(scaledAngle), cos = Math.cos(scaledAngle); var len = Math.abs(sin) + Math.abs(cos); var x = len/2 * sin; var y = len/2 * cos; // Because of the arctangent, our scaledAngle ends up between -PI/2..PI/2, possibly // losing the intended direction of the gradient. The following fixes it. if (angle > Math.PI/2 && angle <= 3*Math.PI/2) { x = -x; y = -y; } // compute the color stops. var implicit = [], right = 0; var stops = gradient.stops.map(function(s, i){ var offset = s.percent; if (offset) { offset = parseFloat(offset) / 100; } else if (s.length) { offset = parseFloat(s.length) / pxlen; } else if (i === 0) { offset = 0; } else if (i == gradient.stops.length - 1) { offset = 1; } var stop = { color: s.color.toCssRgba(), offset: offset }; if (offset != null) { right = offset; // fix implicit offsets implicit.forEach(function(s, i){ var stop = s.stop; stop.offset = s.left + (right - s.left) * (i + 1) / (implicit.length + 1); }); implicit = []; } else { implicit.push({ left: right, stop: stop }); } return stop; }); var start = [ 0.5 - x, 0.5 + y ]; var end = [ 0.5 + x, 0.5 - y ]; // finally, draw it. group.append( drawing.Path.fromRect(rect) .stroke(null) .fill(new drawing.LinearGradient({ start : start, end : end, stops : stops, userSpace : false })) ); break; case "radial": // XXX: if (window.console && window.console.log) { window.console.log("Radial gradients are not yet supported in HTML renderer"); } break; } }; } function maybeRenderWidget(element, group) { if (element.getAttribute(kendo.attr("role"))) { var widget = kendo.widgetInstance($(element)); if (widget && (widget.exportDOMVisual || widget.exportVisual)) { var visual; if (widget.exportDOMVisual) { visual = widget.exportDOMVisual(); } else { visual = widget.exportVisual(); } var wrap = new drawing.Group(); wrap.children.push(visual); var bbox = element.getBoundingClientRect(); wrap.transform(geo.transform().translate(bbox.left, bbox.top)); group.append(wrap); return true; } } } function renderImage(element, url, group) { var box = getContentBox(element); var rect = new geo.Rect([ box.left, box.top ], [ box.width, box.height ]); var image = new drawing.Image(url, rect); setClipping(image, elementRoundBox(element, box, "content")); group.append(image); } function zIndexSort(a, b) { var sa = getComputedStyle(a); var sb = getComputedStyle(b); var za = parseFloat(getPropertyValue(sa, "z-index")); var zb = parseFloat(getPropertyValue(sb, "z-index")); var pa = getPropertyValue(sa, "position"); var pb = getPropertyValue(sb, "position"); if (isNaN(za) && isNaN(zb)) { if ((/static|absolute/.test(pa)) && (/static|absolute/.test(pb))) { return 0; } if (pa == "static") { return -1; } if (pb == "static") { return 1; } return 0; } if (isNaN(za)) { return zb === 0 ? 0 : zb > 0 ? -1 : 1; } if (isNaN(zb)) { return za === 0 ? 0 : za > 0 ? 1 : -1; } return parseFloat(za) - parseFloat(zb); } function renderContents(element, group) { switch (element.tagName.toLowerCase()) { case "img": renderImage(element, element.src, group); break; case "canvas": try { renderImage(element, element.toDataURL("image/jpeg"), group); } catch(ex) { // tainted; can't draw it, ignore. } break; case "textarea": case "input": break; default: var blocks = [], floats = [], inline = [], positioned = []; for (var i = element.firstChild; i; i = i.nextSibling) { switch (i.nodeType) { case 3: // Text if (/\S/.test(i.data)) { renderText(element, i, group); } break; case 1: // Element var style = getComputedStyle(i); var display = getPropertyValue(style, "display"); var floating = getPropertyValue(style, "float"); var position = getPropertyValue(style, "position"); if (position != "static") { positioned.push(i); } else if (display != "inline") { if (floating != "none") { floats.push(i); } else { blocks.push(i); } } else { inline.push(i); } break; } } blocks.sort(zIndexSort).forEach(function(el){ renderElement(el, group); }); floats.sort(zIndexSort).forEach(function(el){ renderElement(el, group); }); inline.sort(zIndexSort).forEach(function(el){ renderElement(el, group); }); positioned.sort(zIndexSort).forEach(function(el){ renderElement(el, group); }); } } function renderText(element, node, group) { var style = getComputedStyle(element); if (parseFloat(getPropertyValue(style, "text-indent")) < -500) { // assume it should not be displayed. the slider's // draggable handle displays a Drag text for some reason, // having text-indent: -3333px. return; } var text = node.data; var range = element.ownerDocument.createRange(); var align = getPropertyValue(style, "text-align"); var isJustified = align == "justify"; // skip whitespace var start = 0; var end = /\S\s*$/.exec(node.data).index + 1; function doChunk() { while (!/\S/.test(text.charAt(start))) { if (start >= end) { return true; } start++; } range.setStart(node, start); var len = 0; while (++start <= end) { ++len; range.setEnd(node, start); // for justified text we must split at each space, as // space has variable width. otherwise we can // optimize and split only at end of line (i.e. when a // new rectangle would be created). if (len > 1 && ((isJustified && /\s/.test(text.charAt(start - 1))) || range.getClientRects().length > 1)) { // // In IE, getClientRects for a
  • element will return an additional rectangle for the bullet, but // *only* when only the first char in the LI is selected. Checking if len > 1 above appears to be a // good workaround. // //// DEBUG // Array.prototype.slice.call(range.getClientRects()).concat([ range.getBoundingClientRect() ]).forEach(function(r){ // $("
    ").css({ // position : "absolute", // left : r.left + "px", // top : r.top + "px", // width : r.right - r.left + "px", // height : r.bottom - r.top + "px", // boxSizing : "border-box", // border : "1px solid red" // }).appendTo(document.body); // }); range.setEnd(node, --start); break; } } // another workaround for IE: if we rely on getBoundingClientRect() we'll overlap with the bullet for LI // elements. Calling getClientRects() and using the *first* rect appears to give us the correct location. var box = range.getClientRects()[0]; var str = range.toString().replace(/\s+$/, ""); drawText(str, box); } var fontSize = getPropertyValue(style, "font-size"); var lineHeight = getPropertyValue(style, "line-height"); // simply getPropertyValue("font") doesn't work in Firefox :-\ var font = [ getPropertyValue(style, "font-style"), getPropertyValue(style, "font-variant"), getPropertyValue(style, "font-weight"), fontSize, // no need for line height here; it breaks layout in FF getPropertyValue(style, "font-family") ].join(" "); fontSize = parseFloat(fontSize); lineHeight = parseFloat(lineHeight); if (fontSize === 0) { return; } var color = getPropertyValue(style, "color"); function drawText(str, box) { str = str.replace(/[\r\n ]+/g, " "); // In IE the box height will be approximately lineHeight, while in // other browsers it'll (correctly) be the height of the bounding // box for the current text/font. Which is to say, IE sucks again. // The only good solution I can think of is to measure the text // ourselves and center the bounding box. if (browser.msie && !isNaN(lineHeight)) { var size = drawing.util.measureText(str, { font: font }); var top = (box.top + box.bottom - size.height) / 2; box = { top : top, right : box.right, bottom : top + size.height, left : box.left, height : size.height, width : box.right - box.left }; } // var path = new drawing.Path({ stroke: { color: "red" }}); // path.moveTo(box.left, box.top) // .lineTo(box.right, box.top) // .lineTo(box.right, box.bottom) // .lineTo(box.left, box.bottom) // .close(); // group.append(path); var text = new drawing.Text(str, new geo.Point(box.left, box.top), { font: font, fill: { color: color } }); group.append(text); decorate(box); } function decorate(box) { line(nodeInfo["underline"], box.bottom); line(nodeInfo["line-through"], box.bottom - box.height / 2.7); line(nodeInfo["overline"], box.top); function line(color, ypos) { if (color) { var width = fontSize / 12; var path = new drawing.Path({ stroke: { width: width, color: color }}); ypos -= width; path.moveTo(box.left, ypos) .lineTo(box.right, ypos); group.append(path); } } } while (!doChunk()) {} } function groupInStackingContext(group, zIndex) { var main = nodeInfo._stackingContext.group; var a = main.children; for (var i = 0; i < a.length; ++i) { if (a[i]._dom_zIndex != null && a[i]._dom_zIndex > zIndex) { break; } } var tmp = new drawing.Group(); main.insertAt(tmp, i); tmp._dom_zIndex = zIndex; // if (nodeInfo._matrix) { // tmp.transform(nodeInfo._matrix); // } if (nodeInfo._clipbox) { tmp.clip(drawing.Path.fromRect(nodeInfo._clipbox)); } return tmp; } function renderElement(element, container) { var style = getComputedStyle(element); var counterReset = getPropertyValue(style, "counter-reset"); if (counterReset) { doCounters(splitProperty(counterReset, /^\s+/), resetCounter, 0); } var counterIncrement = getPropertyValue(style, "counter-increment"); if (counterIncrement) { doCounters(splitProperty(counterIncrement, /^\s+/), incCounter, 1); } if (/^(style|script|link|meta|iframe|svg|col|colgroup)$/i.test(element.tagName)) { return; } if (nodeInfo._clipbox == null) { return; } var opacity = parseFloat(getPropertyValue(style, "opacity")); var visibility = getPropertyValue(style, "visibility"); var display = getPropertyValue(style, "display"); if (opacity === 0 || visibility == "hidden" || display == "none") { return; } var tr = getTransform(style); var group; var zIndex = getPropertyValue(style, "z-index"); if ((tr || opacity < 1) && zIndex == "auto") { zIndex = 0; } if (zIndex != "auto") { group = groupInStackingContext(container, zIndex); } else { group = new drawing.Group(); container.append(group); } // XXX: remove at some point group.DEBUG = $(element).data("debug"); if (opacity < 1) { group.opacity(opacity * group.opacity()); } pushNodeInfo(element, style, group); if (!tr) { _renderWithPseudoElements(element, group); } else { saveStyle(element, function(){ // must clear transform, so getBoundingClientRect returns correct values. pleaseSetPropertyValue(element.style, "transform", "none", "important"); // must also clear transitions, so correct values are returned *immediately* pleaseSetPropertyValue(element.style, "transition", "none", "important"); // the presence of any transform makes it behave like it had position: relative, // because why not. // http://meyerweb.com/eric/thoughts/2011/09/12/un-fixing-fixed-elements-with-css-transforms/ if (getPropertyValue(style, "position") == "static") { // but only if it's not already positioned. :-/ pleaseSetPropertyValue(element.style, "position", "relative", "important"); } // must translate to origin before applying the CSS // transformation, then translate back. var bbox = element.getBoundingClientRect(); var x = bbox.left + tr.origin[0]; var y = bbox.top + tr.origin[1]; var m = [ 1, 0, 0, 1, -x, -y ]; m = mmul(m, tr.matrix); m = mmul(m, [ 1, 0, 0, 1, x, y ]); m = setTransform(group, m); nodeInfo._matrix = nodeInfo._matrix.multiplyCopy(m); _renderWithPseudoElements(element, group); }); } popNodeInfo(); //drawDebugBox(element, container); } function drawDebugBox(element, group) { var box = element.getBoundingClientRect(); var path = drawing.Path.fromRect(new geo.Rect([ box.left, box.top ], [ box.width, box.height ])); group.append(path); } function mmul(a, b) { var a1 = a[0], b1 = a[1], c1 = a[2], d1 = a[3], e1 = a[4], f1 = a[5]; var a2 = b[0], b2 = b[1], c2 = b[2], d2 = b[3], e2 = b[4], f2 = b[5]; return [ a1*a2 + b1*c2, a1*b2 + b1*d2, c1*a2 + d1*c2, c1*b2 + d1*d2, e1*a2 + f1*c2 + e2, e1*b2 + f1*d2 + f2 ]; } })(window.kendo.jQuery, parseFloat, Math); (function ($, Math) { // Imports ================================================================ var doc = document, noop = $.noop, kendo = window.kendo, Class = kendo.Class, util = kendo.util, animationFrame = kendo.animationFrame, deepExtend = kendo.deepExtend; // Base element animation ================================================ var Animation = Class.extend({ init: function(element, options) { var anim = this; anim.options = deepExtend({}, anim.options, options); anim.element = element; }, options: { duration: 500, easing: "swing" }, setup: noop, step: noop, play: function() { var anim = this, options = anim.options, easing = $.easing[options.easing], duration = options.duration, delay = options.delay || 0, start = util.now() + delay, finish = start + duration; if (duration === 0) { anim.step(1); anim.abort(); } else { setTimeout(function() { var loop = function() { if (anim._stopped) { return; } var wallTime = util.now(); var time = util.limitValue(wallTime - start, 0, duration); var pos = time / duration; var easingPos = easing(pos, time, 0, 1, duration); anim.step(easingPos); if (wallTime < finish) { animationFrame(loop); } else { anim.abort(); } }; loop(); }, delay); } }, abort: function() { this._stopped = true; }, destroy: function() { this.abort(); } }); // Animation factory ===================================================== var AnimationFactory = function() { this._items = []; }; AnimationFactory.prototype = { register: function(name, type) { this._items.push({ name: name, type: type }); }, create: function(element, options) { var items = this._items; var match; if (options && options.type) { var type = options.type.toLowerCase(); for (var i = 0; i < items.length; i++) { if (items[i].name.toLowerCase() === type) { match = items[i]; break; } } } if (match) { return new match.type(element, options); } } }; AnimationFactory.current = new AnimationFactory(); Animation.create = function(type, element, options) { return AnimationFactory.current.create(type, element, options); }; // Exports ================================================================ deepExtend(kendo.drawing, { Animation: Animation, AnimationFactory: AnimationFactory }); })(window.kendo.jQuery, Math); /* jshint eqnull: true */ (function($, undefined) { var kendo = window.kendo, Widget = kendo.ui.Widget, NS = ".kendoValidator", INVALIDMSG = "k-invalid-msg", invalidMsgRegExp = new RegExp(INVALIDMSG,'i'), INVALIDINPUT = "k-invalid", emailRegExp = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i, urlRegExp = /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i, INPUTSELECTOR = ":input:not(:button,[type=submit],[type=reset],[disabled],[readonly])", CHECKBOXSELECTOR = ":checkbox:not([disabled],[readonly])", NUMBERINPUTSELECTOR = "[type=number],[type=range]", BLUR = "blur", NAME = "name", FORM = "form", NOVALIDATE = "novalidate", proxy = $.proxy, patternMatcher = function(value, pattern) { if (typeof pattern === "string") { pattern = new RegExp('^(?:' + pattern + ')$'); } return pattern.test(value); }, matcher = function(input, selector, pattern) { var value = input.val(); if (input.filter(selector).length && value !== "") { return patternMatcher(value, pattern); } return true; }, hasAttribute = function(input, name) { if (input.length) { return input[0].attributes[name] != null; } return false; }; if (!kendo.ui.validator) { kendo.ui.validator = { rules: {}, messages: {} }; } function resolveRules(element) { var resolvers = kendo.ui.validator.ruleResolvers || {}, rules = {}, name; for (name in resolvers) { $.extend(true, rules, resolvers[name].resolve(element)); } return rules; } function decode(value) { return value.replace(/&/g, '&') .replace(/"/g, '"') .replace(/'/g, "'") .replace(/</g, '<') .replace(/>/g, '>'); } function numberOfDecimalDigits(value) { value = (value + "").split('.'); if (value.length > 1) { return value[1].length; } return 0; } function parseHtml(text) { if ($.parseHTML) { return $($.parseHTML(text)); } return $(text); } function searchForMessageContainer(elements, fieldName) { var containers = $(), element, attr; for (var idx = 0, length = elements.length; idx < length; idx++) { element = elements[idx]; if (invalidMsgRegExp.test(element.className)) { attr = element.getAttribute(kendo.attr("for")); if (attr === fieldName) { containers = containers.add(element); } } } return containers; } var Validator = Widget.extend({ init: function(element, options) { var that = this, resolved = resolveRules(element), validateAttributeSelector = "[" + kendo.attr("validate") + "!=false]"; options = options || {}; options.rules = $.extend({}, kendo.ui.validator.rules, resolved.rules, options.rules); options.messages = $.extend({}, kendo.ui.validator.messages, resolved.messages, options.messages); Widget.fn.init.call(that, element, options); that._errorTemplate = kendo.template(that.options.errorTemplate); if (that.element.is(FORM)) { that.element.attr(NOVALIDATE, NOVALIDATE); } that._inputSelector = INPUTSELECTOR + validateAttributeSelector; that._checkboxSelector = CHECKBOXSELECTOR + validateAttributeSelector; that._errors = {}; that._attachEvents(); that._isValidated = false; }, events: [ "validate", "change" ], options: { name: "Validator", errorTemplate: '' + ' #=message#', messages: { required: "{0} is required", pattern: "{0} is not valid", min: "{0} should be greater than or equal to {1}", max: "{0} should be smaller than or equal to {1}", step: "{0} is not valid", email: "{0} is not valid email", url: "{0} is not valid URL", date: "{0} is not valid date" }, rules: { required: function(input) { var checkbox = input.filter("[type=checkbox]").length && !input.is(":checked"), value = input.val(); return !(hasAttribute(input, "required") && (value === "" || !value || checkbox)); }, pattern: function(input) { if (input.filter("[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]").filter("[pattern]").length && input.val() !== "") { return patternMatcher(input.val(), input.attr("pattern")); } return true; }, min: function(input) { if (input.filter(NUMBERINPUTSELECTOR + ",[" + kendo.attr("type") + "=number]").filter("[min]").length && input.val() !== "") { var min = parseFloat(input.attr("min")) || 0, val = kendo.parseFloat(input.val()); return min <= val; } return true; }, max: function(input) { if (input.filter(NUMBERINPUTSELECTOR + ",[" + kendo.attr("type") + "=number]").filter("[max]").length && input.val() !== "") { var max = parseFloat(input.attr("max")) || 0, val = kendo.parseFloat(input.val()); return max >= val; } return true; }, step: function(input) { if (input.filter(NUMBERINPUTSELECTOR + ",[" + kendo.attr("type") + "=number]").filter("[step]").length && input.val() !== "") { var min = parseFloat(input.attr("min")) || 0, step = parseFloat(input.attr("step")) || 1, val = parseFloat(input.val()), decimals = numberOfDecimalDigits(step), raise; if (decimals) { raise = Math.pow(10, decimals); return ((Math.floor((val-min)*raise))%(step*raise)) / Math.pow(100, decimals) === 0; } return ((val-min)%step) === 0; } return true; }, email: function(input) { return matcher(input, "[type=email],[" + kendo.attr("type") + "=email]", emailRegExp); }, url: function(input) { return matcher(input, "[type=url],[" + kendo.attr("type") + "=url]", urlRegExp); }, date: function(input) { if (input.filter("[type^=date],[" + kendo.attr("type") + "=date]").length && input.val() !== "") { return kendo.parseDate(input.val(), input.attr(kendo.attr("format"))) !== null; } return true; } }, validateOnBlur: true }, destroy: function() { Widget.fn.destroy.call(this); this.element.off(NS); }, value: function() { if (!this._isValidated) { return false; } return this.errors().length === 0; }, _submit: function(e) { if (!this.validate()) { e.stopPropagation(); e.stopImmediatePropagation(); e.preventDefault(); return false; } return true; }, _checkElement: function(element) { var state = this.value(); this.validateInput(element); if (this.value() !== state) { this.trigger("change"); } }, _attachEvents: function() { var that = this; if (that.element.is(FORM)) { that.element.on("submit" + NS, proxy(that._submit, that)); } if (that.options.validateOnBlur) { if (!that.element.is(INPUTSELECTOR)) { that.element.on(BLUR + NS, that._inputSelector, function() { that._checkElement($(this)); }); that.element.on("click" + NS, that._checkboxSelector, function() { that._checkElement($(this)); }); } else { that.element.on(BLUR + NS, function() { that._checkElement(that.element); }); if (that.element.is(CHECKBOXSELECTOR)) { that.element.on("click" + NS, function() { that._checkElement(that.element); }); } } } }, validate: function() { var inputs; var idx; var result = false; var length; var isValid = this.value(); this._errors = {}; if (!this.element.is(INPUTSELECTOR)) { var invalid = false; inputs = this.element.find(this._inputSelector); for (idx = 0, length = inputs.length; idx < length; idx++) { if (!this.validateInput(inputs.eq(idx))) { invalid = true; } } result = !invalid; } else { result = this.validateInput(this.element); } this.trigger("validate", { valid: result }); if (isValid !== result) { this.trigger("change"); } return result; }, validateInput: function(input) { input = $(input); this._isValidated = true; var that = this, template = that._errorTemplate, result = that._checkValidity(input), valid = result.valid, className = "." + INVALIDMSG, fieldName = (input.attr(NAME) || ""), lbl = that._findMessageContainer(fieldName).add(input.next(className).filter(function() { var element = $(this); if (element.filter("[" + kendo.attr("for") + "]").length) { return element.attr(kendo.attr("for")) === fieldName; } return true; })).hide(), messageText; input.removeAttr("aria-invalid"); if (!valid) { messageText = that._extractMessage(input, result.key); that._errors[fieldName] = messageText; var messageLabel = parseHtml(template({ message: decode(messageText) })); that._decorateMessageContainer(messageLabel, fieldName); if (!lbl.replaceWith(messageLabel).length) { messageLabel.insertAfter(input); } messageLabel.show(); input.attr("aria-invalid", true); } else { delete that._errors[fieldName]; } input.toggleClass(INVALIDINPUT, !valid); return valid; }, hideMessages: function() { var that = this, className = "." + INVALIDMSG, element = that.element; if (!element.is(INPUTSELECTOR)) { element.find(className).hide(); } else { element.next(className).hide(); } }, _findMessageContainer: function(fieldName) { var locators = kendo.ui.validator.messageLocators, name, containers = $(); for (var idx = 0, length = this.element.length; idx < length; idx++) { containers = containers.add(searchForMessageContainer(this.element[idx].getElementsByTagName("*"), fieldName)); } for (name in locators) { containers = containers.add(locators[name].locate(this.element, fieldName)); } return containers; }, _decorateMessageContainer: function(container, fieldName) { var locators = kendo.ui.validator.messageLocators, name; container.addClass(INVALIDMSG) .attr(kendo.attr("for"), fieldName || ""); for (name in locators) { locators[name].decorate(container, fieldName); } container.attr("role", "alert"); }, _extractMessage: function(input, ruleKey) { var that = this, customMessage = that.options.messages[ruleKey], fieldName = input.attr(NAME); customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage; return kendo.format(input.attr(kendo.attr(ruleKey + "-msg")) || input.attr("validationMessage") || input.attr("title") || customMessage || "", fieldName, input.attr(ruleKey)); }, _checkValidity: function(input) { var rules = this.options.rules, rule; for (rule in rules) { if (!rules[rule].call(this, input)) { return { valid: false, key: rule }; } } return { valid: true }; }, errors: function() { var results = [], errors = this._errors, error; for (error in errors) { results.push(errors[error]); } return results; } }); kendo.ui.plugin(Validator); })(window.kendo.jQuery); (function ($, undefined) { var kendo = window.kendo, support = kendo.support, document = window.document, Class = kendo.Class, Observable = kendo.Observable, now = $.now, extend = $.extend, OS = support.mobileOS, invalidZeroEvents = OS && OS.android, DEFAULT_MIN_HOLD = 800, DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, // WP8 and W8 are very sensitive and always report move. // UserEvents events PRESS = "press", HOLD = "hold", SELECT = "select", START = "start", MOVE = "move", END = "end", CANCEL = "cancel", TAP = "tap", RELEASE = "release", GESTURESTART = "gesturestart", GESTURECHANGE = "gesturechange", GESTUREEND = "gestureend", GESTURETAP = "gesturetap"; var THRESHOLD = { "api": 0, "touch": 0, "mouse": 9, "pointer": 9 }; var ENABLE_GLOBAL_SURFACE = (!support.touch || support.mouseAndTouchPresent); function touchDelta(touch1, touch2) { var x1 = touch1.x.location, y1 = touch1.y.location, x2 = touch2.x.location, y2 = touch2.y.location, dx = x1 - x2, dy = y1 - y2; return { center: { x: (x1 + x2) / 2, y: (y1 + y2) / 2 }, distance: Math.sqrt(dx*dx + dy*dy) }; } function getTouches(e) { var touches = [], originalEvent = e.originalEvent, currentTarget = e.currentTarget, idx = 0, length, changedTouches, touch; if (e.api) { touches.push({ id: 2, // hardcoded ID for API call; event: e, target: e.target, currentTarget: e.target, location: e, type: "api" }); } else if (e.type.match(/touch/)) { changedTouches = originalEvent ? originalEvent.changedTouches : []; for (length = changedTouches.length; idx < length; idx ++) { touch = changedTouches[idx]; touches.push({ location: touch, event: e, target: touch.target, currentTarget: currentTarget, id: touch.identifier, type: "touch" }); } } else if (support.pointers || support.msPointers) { touches.push({ location: originalEvent, event: e, target: e.target, currentTarget: currentTarget, id: originalEvent.pointerId, type: "pointer" }); } else { touches.push({ id: 1, // hardcoded ID for mouse event; event: e, target: e.target, currentTarget: currentTarget, location: e, type: "mouse" }); } return touches; } var TouchAxis = Class.extend({ init: function(axis, location) { var that = this; that.axis = axis; that._updateLocationData(location); that.startLocation = that.location; that.velocity = that.delta = 0; that.timeStamp = now(); }, move: function(location) { var that = this, offset = location["page" + that.axis], timeStamp = now(), timeDelta = (timeStamp - that.timeStamp) || 1; // Firing manually events in tests can make this 0; if (!offset && invalidZeroEvents) { return; } that.delta = offset - that.location; that._updateLocationData(location); that.initialDelta = offset - that.startLocation; that.velocity = that.delta / timeDelta; that.timeStamp = timeStamp; }, _updateLocationData: function(location) { var that = this, axis = that.axis; that.location = location["page" + axis]; that.client = location["client" + axis]; that.screen = location["screen" + axis]; } }); var Touch = Class.extend({ init: function(userEvents, target, touchInfo) { extend(this, { x: new TouchAxis("X", touchInfo.location), y: new TouchAxis("Y", touchInfo.location), type: touchInfo.type, threshold: userEvents.threshold || THRESHOLD[touchInfo.type], userEvents: userEvents, target: target, currentTarget: touchInfo.currentTarget, initialTouch: touchInfo.target, id: touchInfo.id, pressEvent: touchInfo, _moved: false, _finished: false }); }, press: function() { this._holdTimeout = setTimeout($.proxy(this, "_hold"), this.userEvents.minHold); this._trigger(PRESS, this.pressEvent); }, _hold: function() { this._trigger(HOLD, this.pressEvent); }, move: function(touchInfo) { var that = this; if (that._finished) { return; } that.x.move(touchInfo.location); that.y.move(touchInfo.location); if (!that._moved) { if (that._withinIgnoreThreshold()) { return; } if (!UserEvents.current || UserEvents.current === that.userEvents) { that._start(touchInfo); } else { return that.dispose(); } } // Event handlers may cancel the drag in the START event handler, hence the double check for pressed. if (!that._finished) { that._trigger(MOVE, touchInfo); } }, end: function(touchInfo) { var that = this; that.endTime = now(); if (that._finished) { return; } // Mark the object as finished if there are blocking operations in the event handlers (alert/confirm) that._finished = true; that._trigger(RELEASE, touchInfo); // Release should be fired before TAP (as click is after mouseup/touchend) if (that._moved) { that._trigger(END, touchInfo); } else { that._trigger(TAP, touchInfo); } clearTimeout(that._holdTimeout); that.dispose(); }, dispose: function() { var userEvents = this.userEvents, activeTouches = userEvents.touches; this._finished = true; this.pressEvent = null; clearTimeout(this._holdTimeout); activeTouches.splice($.inArray(this, activeTouches), 1); }, skip: function() { this.dispose(); }, cancel: function() { this.dispose(); }, isMoved: function() { return this._moved; }, _start: function(touchInfo) { clearTimeout(this._holdTimeout); this.startTime = now(); this._moved = true; this._trigger(START, touchInfo); }, _trigger: function(name, touchInfo) { var that = this, jQueryEvent = touchInfo.event, data = { touch: that, x: that.x, y: that.y, target: that.target, event: jQueryEvent }; if(that.userEvents.notify(name, data)) { jQueryEvent.preventDefault(); } }, _withinIgnoreThreshold: function() { var xDelta = this.x.initialDelta, yDelta = this.y.initialDelta; return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold; } }); function withEachUpEvent(callback) { var downEvents = kendo.eventMap.up.split(" "), idx = 0, length = downEvents.length; for(; idx < length; idx ++) { callback(downEvents[idx]); } } var UserEvents = Observable.extend({ init: function(element, options) { var that = this, filter, ns = kendo.guid(); options = options || {}; filter = that.filter = options.filter; that.threshold = options.threshold || DEFAULT_THRESHOLD; that.minHold = options.minHold || DEFAULT_MIN_HOLD; that.touches = []; that._maxTouches = options.multiTouch ? 2 : 1; that.allowSelection = options.allowSelection; that.captureUpIfMoved = options.captureUpIfMoved; that.eventNS = ns; element = $(element).handler(that); Observable.fn.init.call(that); extend(that, { element: element, // the touch events lock to the element anyway, so no need for the global setting surface: options.global && ENABLE_GLOBAL_SURFACE ? $(document.documentElement) : $(options.surface || element), stopPropagation: options.stopPropagation, pressed: false }); that.surface.handler(that) .on(kendo.applyEventMap("move", ns), "_move") .on(kendo.applyEventMap("up cancel", ns), "_end"); element.on(kendo.applyEventMap("down", ns), filter, "_start"); if (support.pointers || support.msPointers) { element.css("-ms-touch-action", "pinch-zoom double-tap-zoom"); } if (options.preventDragEvent) { element.on(kendo.applyEventMap("dragstart", ns), kendo.preventDefault); } element.on(kendo.applyEventMap("mousedown", ns), filter, { root: element }, "_select"); if (that.captureUpIfMoved && support.eventCapture) { var surfaceElement = that.surface[0], preventIfMovingProxy = $.proxy(that.preventIfMoving, that); withEachUpEvent(function(eventName) { surfaceElement.addEventListener(eventName, preventIfMovingProxy, true); }); } that.bind([ PRESS, HOLD, TAP, START, MOVE, END, RELEASE, CANCEL, GESTURESTART, GESTURECHANGE, GESTUREEND, GESTURETAP, SELECT ], options); }, preventIfMoving: function(e) { if (this._isMoved()) { e.preventDefault(); } }, destroy: function() { var that = this; if (that._destroyed) { return; } that._destroyed = true; if (that.captureUpIfMoved && support.eventCapture) { var surfaceElement = that.surface[0]; withEachUpEvent(function(eventName) { surfaceElement.removeEventListener(eventName, that.preventIfMoving); }); } that.element.kendoDestroy(that.eventNS); that.surface.kendoDestroy(that.eventNS); that.element.removeData("handler"); that.surface.removeData("handler"); that._disposeAll(); that.unbind(); delete that.surface; delete that.element; delete that.currentTarget; }, capture: function() { UserEvents.current = this; }, cancel: function() { this._disposeAll(); this.trigger(CANCEL); }, notify: function(eventName, data) { var that = this, touches = that.touches; if (this._isMultiTouch()) { switch(eventName) { case MOVE: eventName = GESTURECHANGE; break; case END: eventName = GESTUREEND; break; case TAP: eventName = GESTURETAP; break; } extend(data, {touches: touches}, touchDelta(touches[0], touches[1])); } return this.trigger(eventName, extend(data, {type: eventName})); }, // API press: function(x, y, target) { this._apiCall("_start", x, y, target); }, move: function(x, y) { this._apiCall("_move", x, y); }, end: function(x, y) { this._apiCall("_end", x, y); }, _isMultiTouch: function() { return this.touches.length > 1; }, _maxTouchesReached: function() { return this.touches.length >= this._maxTouches; }, _disposeAll: function() { var touches = this.touches; while (touches.length > 0) { touches.pop().dispose(); } }, _isMoved: function() { return $.grep(this.touches, function(touch) { return touch.isMoved(); }).length; }, _select: function(e) { if (!this.allowSelection || this.trigger(SELECT, { event: e })) { e.preventDefault(); } }, _start: function(e) { var that = this, idx = 0, filter = that.filter, target, touches = getTouches(e), length = touches.length, touch, which = e.which; if ((which && which > 1) || (that._maxTouchesReached())){ return; } UserEvents.current = null; that.currentTarget = e.currentTarget; if (that.stopPropagation) { e.stopPropagation(); } for (; idx < length; idx ++) { if (that._maxTouchesReached()) { break; } touch = touches[idx]; if (filter) { target = $(touch.currentTarget); // target.is(filter) ? target : target.closest(filter, that.element); } else { target = that.element; } if (!target.length) { continue; } touch = new Touch(that, target, touch); that.touches.push(touch); touch.press(); if (that._isMultiTouch()) { that.notify("gesturestart", {}); } } }, _move: function(e) { this._eachTouch("move", e); }, _end: function(e) { this._eachTouch("end", e); }, _eachTouch: function(methodName, e) { var that = this, dict = {}, touches = getTouches(e), activeTouches = that.touches, idx, touch, touchInfo, matchingTouch; for (idx = 0; idx < activeTouches.length; idx ++) { touch = activeTouches[idx]; dict[touch.id] = touch; } for (idx = 0; idx < touches.length; idx ++) { touchInfo = touches[idx]; matchingTouch = dict[touchInfo.id]; if (matchingTouch) { matchingTouch[methodName](touchInfo); } } }, _apiCall: function(type, x, y, target) { this[type]({ api: true, pageX: x, pageY: y, clientX: x, clientY: y, target: $(target || this.element)[0], stopPropagation: $.noop, preventDefault: $.noop }); } }); UserEvents.defaultThreshold = function(value) { DEFAULT_THRESHOLD = value; }; UserEvents.minHold = function(value) { DEFAULT_MIN_HOLD = value; }; kendo.getTouches = getTouches; kendo.touchDelta = touchDelta; kendo.UserEvents = UserEvents; })(window.kendo.jQuery); (function ($, undefined) { var kendo = window.kendo, support = kendo.support, document = window.document, Class = kendo.Class, Widget = kendo.ui.Widget, Observable = kendo.Observable, UserEvents = kendo.UserEvents, proxy = $.proxy, extend = $.extend, getOffset = kendo.getOffset, draggables = {}, dropTargets = {}, dropAreas = {}, lastDropTarget, elementUnderCursor = kendo.elementUnderCursor, KEYUP = "keyup", CHANGE = "change", // Draggable events DRAGSTART = "dragstart", HOLD = "hold", DRAG = "drag", DRAGEND = "dragend", DRAGCANCEL = "dragcancel", HINTDESTROYED = "hintDestroyed", // DropTarget events DRAGENTER = "dragenter", DRAGLEAVE = "dragleave", DROP = "drop"; function contains(parent, child) { try { return $.contains(parent, child) || parent == child; } catch (e) { return false; } } function numericCssPropery(element, property) { return parseInt(element.css(property), 10) || 0; } function within(value, range) { return Math.min(Math.max(value, range.min), range.max); } function containerBoundaries(container, element) { var offset = getOffset(container), minX = offset.left + numericCssPropery(container, "borderLeftWidth") + numericCssPropery(container, "paddingLeft"), minY = offset.top + numericCssPropery(container, "borderTopWidth") + numericCssPropery(container, "paddingTop"), maxX = minX + container.width() - element.outerWidth(true), maxY = minY + container.height() - element.outerHeight(true); return { x: { min: minX, max: maxX }, y: { min: minY, max: maxY } }; } function checkTarget(target, targets, areas) { var theTarget, theFilter, i = 0, targetLen = targets && targets.length, areaLen = areas && areas.length; while (target && target.parentNode) { for (i = 0; i < targetLen; i ++) { theTarget = targets[i]; if (theTarget.element[0] === target) { return { target: theTarget, targetElement: target }; } } for (i = 0; i < areaLen; i ++) { theFilter = areas[i]; if (support.matchesSelector.call(target, theFilter.options.filter)) { return { target: theFilter, targetElement: target }; } } target = target.parentNode; } return undefined; } var TapCapture = Observable.extend({ init: function(element, options) { var that = this, domElement = element[0]; that.capture = false; if (domElement.addEventListener) { $.each(kendo.eventMap.down.split(" "), function() { domElement.addEventListener(this, proxy(that._press, that), true); }); $.each(kendo.eventMap.up.split(" "), function() { domElement.addEventListener(this, proxy(that._release, that), true); }); } else { $.each(kendo.eventMap.down.split(" "), function() { domElement.attachEvent(this, proxy(that._press, that)); }); $.each(kendo.eventMap.up.split(" "), function() { domElement.attachEvent(this, proxy(that._release, that)); }); } Observable.fn.init.call(that); that.bind(["press", "release"], options || {}); }, captureNext: function() { this.capture = true; }, cancelCapture: function() { this.capture = false; }, _press: function(e) { var that = this; that.trigger("press"); if (that.capture) { e.preventDefault(); } }, _release: function(e) { var that = this; that.trigger("release"); if (that.capture) { e.preventDefault(); that.cancelCapture(); } } }); var PaneDimension = Observable.extend({ init: function(options) { var that = this; Observable.fn.init.call(that); that.forcedEnabled = false; $.extend(that, options); that.scale = 1; if (that.horizontal) { that.measure = "offsetWidth"; that.scrollSize = "scrollWidth"; that.axis = "x"; } else { that.measure = "offsetHeight"; that.scrollSize = "scrollHeight"; that.axis = "y"; } }, makeVirtual: function() { $.extend(this, { virtual: true, forcedEnabled: true, _virtualMin: 0, _virtualMax: 0 }); }, virtualSize: function(min, max) { if (this._virtualMin !== min || this._virtualMax !== max) { this._virtualMin = min; this._virtualMax = max; this.update(); } }, outOfBounds: function(offset) { return offset > this.max || offset < this.min; }, forceEnabled: function() { this.forcedEnabled = true; }, getSize: function() { return this.container[0][this.measure]; }, getTotal: function() { return this.element[0][this.scrollSize]; }, rescale: function(scale) { this.scale = scale; }, update: function(silent) { var that = this, total = that.virtual ? that._virtualMax : that.getTotal(), scaledTotal = total * that.scale, size = that.getSize(); if (total === 0 && !that.forcedEnabled) { return; // we are not visible. } that.max = that.virtual ? -that._virtualMin : 0; that.size = size; that.total = scaledTotal; that.min = Math.min(that.max, size - scaledTotal); that.minScale = size / total; that.centerOffset = (scaledTotal - size) / 2; that.enabled = that.forcedEnabled || (scaledTotal > size); if (!silent) { that.trigger(CHANGE, that); } } }); var PaneDimensions = Observable.extend({ init: function(options) { var that = this; Observable.fn.init.call(that); that.x = new PaneDimension(extend({horizontal: true}, options)); that.y = new PaneDimension(extend({horizontal: false}, options)); that.container = options.container; that.forcedMinScale = options.minScale; that.maxScale = options.maxScale || 100; that.bind(CHANGE, options); }, rescale: function(newScale) { this.x.rescale(newScale); this.y.rescale(newScale); this.refresh(); }, centerCoordinates: function() { return { x: Math.min(0, -this.x.centerOffset), y: Math.min(0, -this.y.centerOffset) }; }, refresh: function() { var that = this; that.x.update(); that.y.update(); that.enabled = that.x.enabled || that.y.enabled; that.minScale = that.forcedMinScale || Math.min(that.x.minScale, that.y.minScale); that.fitScale = Math.max(that.x.minScale, that.y.minScale); that.trigger(CHANGE); } }); var PaneAxis = Observable.extend({ init: function(options) { var that = this; extend(that, options); Observable.fn.init.call(that); }, outOfBounds: function() { return this.dimension.outOfBounds(this.movable[this.axis]); }, dragMove: function(delta) { var that = this, dimension = that.dimension, axis = that.axis, movable = that.movable, position = movable[axis] + delta; if (!dimension.enabled) { return; } if ((position < dimension.min && delta < 0) || (position > dimension.max && delta > 0)) { delta *= that.resistance; } movable.translateAxis(axis, delta); that.trigger(CHANGE, that); } }); var Pane = Class.extend({ init: function(options) { var that = this, x, y, resistance, movable; extend(that, {elastic: true}, options); resistance = that.elastic ? 0.5 : 0; movable = that.movable; that.x = x = new PaneAxis({ axis: "x", dimension: that.dimensions.x, resistance: resistance, movable: movable }); that.y = y = new PaneAxis({ axis: "y", dimension: that.dimensions.y, resistance: resistance, movable: movable }); that.userEvents.bind(["move", "end", "gesturestart", "gesturechange"], { gesturestart: function(e) { that.gesture = e; that.offset = that.dimensions.container.offset(); }, gesturechange: function(e) { var previousGesture = that.gesture, previousCenter = previousGesture.center, center = e.center, scaleDelta = e.distance / previousGesture.distance, minScale = that.dimensions.minScale, maxScale = that.dimensions.maxScale, coordinates; if (movable.scale <= minScale && scaleDelta < 1) { // Resist shrinking. Instead of shrinking from 1 to 0.5, it will shrink to 0.5 + (1 /* minScale */ - 0.5) * 0.8 = 0.9; scaleDelta += (1 - scaleDelta) * 0.8; } if (movable.scale * scaleDelta >= maxScale) { scaleDelta = maxScale / movable.scale; } var offsetX = movable.x + that.offset.left, offsetY = movable.y + that.offset.top; coordinates = { x: (offsetX - previousCenter.x) * scaleDelta + center.x - offsetX, y: (offsetY - previousCenter.y) * scaleDelta + center.y - offsetY }; movable.scaleWith(scaleDelta); x.dragMove(coordinates.x); y.dragMove(coordinates.y); that.dimensions.rescale(movable.scale); that.gesture = e; e.preventDefault(); }, move: function(e) { if (e.event.target.tagName.match(/textarea|input/i)) { return; } if (x.dimension.enabled || y.dimension.enabled) { x.dragMove(e.x.delta); y.dragMove(e.y.delta); e.preventDefault(); } else { e.touch.skip(); } }, end: function(e) { e.preventDefault(); } }); } }); var TRANSFORM_STYLE = support.transitions.prefix + "Transform", translate; if (support.hasHW3D) { translate = function(x, y, scale) { return "translate3d(" + x + "px," + y +"px,0) scale(" + scale + ")"; }; } else { translate = function(x, y, scale) { return "translate(" + x + "px," + y +"px) scale(" + scale + ")"; }; } var Movable = Observable.extend({ init: function(element) { var that = this; Observable.fn.init.call(that); that.element = $(element); that.element[0].style.webkitTransformOrigin = "left top"; that.x = 0; that.y = 0; that.scale = 1; that._saveCoordinates(translate(that.x, that.y, that.scale)); }, translateAxis: function(axis, by) { this[axis] += by; this.refresh(); }, scaleTo: function(scale) { this.scale = scale; this.refresh(); }, scaleWith: function(scaleDelta) { this.scale *= scaleDelta; this.refresh(); }, translate: function(coordinates) { this.x += coordinates.x; this.y += coordinates.y; this.refresh(); }, moveAxis: function(axis, value) { this[axis] = value; this.refresh(); }, moveTo: function(coordinates) { extend(this, coordinates); this.refresh(); }, refresh: function() { var that = this, x = that.x, y = that.y, newCoordinates; if (that.round) { x = Math.round(x); y = Math.round(y); } newCoordinates = translate(x, y, that.scale); if (newCoordinates != that.coordinates) { if (kendo.support.browser.msie && kendo.support.browser.version < 10) { that.element[0].style.position = "absolute"; that.element[0].style.left = that.x + "px"; that.element[0].style.top = that.y + "px"; } else { that.element[0].style[TRANSFORM_STYLE] = newCoordinates; } that._saveCoordinates(newCoordinates); that.trigger(CHANGE); } }, _saveCoordinates: function(coordinates) { this.coordinates = coordinates; } }); function destroyDroppable(collection, widget) { var groupName = widget.options.group, droppables = collection[groupName], i; Widget.fn.destroy.call(widget); if (droppables.length > 1) { for (i = 0; i < droppables.length; i++) { if (droppables[i] == widget) { droppables.splice(i, 1); break; } } } else { droppables.length = 0; // WTF, porting this from the previous destroyGroup delete collection[groupName]; } } var DropTarget = Widget.extend({ init: function(element, options) { var that = this; Widget.fn.init.call(that, element, options); var group = that.options.group; if (!(group in dropTargets)) { dropTargets[group] = [ that ]; } else { dropTargets[group].push( that ); } }, events: [ DRAGENTER, DRAGLEAVE, DROP ], options: { name: "DropTarget", group: "default" }, destroy: function() { destroyDroppable(dropTargets, this); }, _trigger: function(eventName, e) { var that = this, draggable = draggables[that.options.group]; if (draggable) { return that.trigger(eventName, extend({}, e.event, { draggable: draggable, dropTarget: e.dropTarget })); } }, _over: function(e) { this._trigger(DRAGENTER, e); }, _out: function(e) { this._trigger(DRAGLEAVE, e); }, _drop: function(e) { var that = this, draggable = draggables[that.options.group]; if (draggable) { draggable.dropped = !that._trigger(DROP, e); } } }); DropTarget.destroyGroup = function(groupName) { var group = dropTargets[groupName] || dropAreas[groupName], i; if (group) { for (i = 0; i < group.length; i++) { Widget.fn.destroy.call(group[i]); } group.length = 0; delete dropTargets[groupName]; delete dropAreas[groupName]; } }; DropTarget._cache = dropTargets; var DropTargetArea = DropTarget.extend({ init: function(element, options) { var that = this; Widget.fn.init.call(that, element, options); var group = that.options.group; if (!(group in dropAreas)) { dropAreas[group] = [ that ]; } else { dropAreas[group].push( that ); } }, destroy: function() { destroyDroppable(dropAreas, this); }, options: { name: "DropTargetArea", group: "default", filter: null } }); var Draggable = Widget.extend({ init: function (element, options) { var that = this; Widget.fn.init.call(that, element, options); that._activated = false; that.userEvents = new UserEvents(that.element, { global: true, allowSelection: true, filter: that.options.filter, threshold: that.options.distance, start: proxy(that._start, that), hold: proxy(that._hold, that), move: proxy(that._drag, that), end: proxy(that._end, that), cancel: proxy(that._cancel, that), select: proxy(that._select, that) }); that._afterEndHandler = proxy(that._afterEnd, that); that._captureEscape = proxy(that._captureEscape, that); }, events: [ HOLD, DRAGSTART, DRAG, DRAGEND, DRAGCANCEL, HINTDESTROYED ], options: { name: "Draggable", distance: ( kendo.support.touch ? 0 : 5), group: "default", cursorOffset: null, axis: null, container: null, filter: null, ignore: null, holdToDrag: false, dropped: false }, cancelHold: function() { this._activated = false; }, _captureEscape: function(e) { var that = this; if (e.keyCode === kendo.keys.ESC) { that._trigger(DRAGCANCEL, { event: e }); that.userEvents.cancel(); } }, _updateHint: function(e) { var that = this, coordinates, options = that.options, boundaries = that.boundaries, axis = options.axis, cursorOffset = that.options.cursorOffset; if (cursorOffset) { coordinates = { left: e.x.location + cursorOffset.left, top: e.y.location + cursorOffset.top }; } else { that.hintOffset.left += e.x.delta; that.hintOffset.top += e.y.delta; coordinates = $.extend({}, that.hintOffset); } if (boundaries) { coordinates.top = within(coordinates.top, boundaries.y); coordinates.left = within(coordinates.left, boundaries.x); } if (axis === "x") { delete coordinates.top; } else if (axis === "y") { delete coordinates.left; } that.hint.css(coordinates); }, _shouldIgnoreTarget: function(target) { var ignoreSelector = this.options.ignore; return ignoreSelector && $(target).is(ignoreSelector); }, _select: function(e) { if (!this._shouldIgnoreTarget(e.event.target)) { e.preventDefault(); } }, _start: function(e) { var that = this, options = that.options, container = options.container, hint = options.hint; if (this._shouldIgnoreTarget(e.touch.initialTouch) || (options.holdToDrag && !that._activated)) { that.userEvents.cancel(); return; } that.currentTarget = e.target; that.currentTargetOffset = getOffset(that.currentTarget); if (hint) { if (that.hint) { that.hint.stop(true, true).remove(); } that.hint = kendo.isFunction(hint) ? $(hint.call(that, that.currentTarget)) : hint; var offset = getOffset(that.currentTarget); that.hintOffset = offset; that.hint.css( { position: "absolute", zIndex: 20000, // the Window's z-index is 10000 and can be raised because of z-stacking left: offset.left, top: offset.top }) .appendTo(document.body); that.angular("compile", function(){ that.hint.removeAttr("ng-repeat"); return { elements: that.hint.get(), scopeFrom: e.target }; }); } draggables[options.group] = that; that.dropped = false; if (container) { that.boundaries = containerBoundaries(container, that.hint); } if (that._trigger(DRAGSTART, e)) { that.userEvents.cancel(); that._afterEnd(); } that.userEvents.capture(); $(document).on(KEYUP, that._captureEscape); }, _hold: function(e) { this.currentTarget = e.target; if (this._trigger(HOLD, e)) { this.userEvents.cancel(); } else { this._activated = true; } }, _drag: function(e) { var that = this; e.preventDefault(); that._withDropTarget(e, function(target, targetElement) { if (!target) { if (lastDropTarget) { lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) })); lastDropTarget = null; } return; } if (lastDropTarget) { if (targetElement === lastDropTarget.targetElement) { return; } lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) })); } target._trigger(DRAGENTER, extend(e, { dropTarget: $(targetElement) })); lastDropTarget = extend(target, { targetElement: targetElement }); }); that._trigger(DRAG, extend(e, { dropTarget: lastDropTarget })); if (that.hint) { that._updateHint(e); } }, _end: function(e) { var that = this; that._withDropTarget(e, function(target, targetElement) { if (target) { target._drop(extend({}, e, { dropTarget: $(targetElement) })); lastDropTarget = null; } }); that._trigger(DRAGEND, e); that._cancel(e.event); }, _cancel: function() { var that = this; that._activated = false; if (that.hint && !that.dropped) { setTimeout(function() { that.hint.stop(true, true).animate(that.currentTargetOffset, "fast", that._afterEndHandler); }, 0); } else { that._afterEnd(); } }, _trigger: function(eventName, e) { var that = this; return that.trigger( eventName, extend( {}, e.event, { x: e.x, y: e.y, currentTarget: that.currentTarget, dropTarget: e.dropTarget } )); }, _withDropTarget: function(e, callback) { var that = this, target, result, options = that.options, targets = dropTargets[options.group], areas = dropAreas[options.group]; if (targets && targets.length || areas && areas.length) { target = elementUnderCursor(e); if (that.hint && contains(that.hint[0], target)) { that.hint.hide(); target = elementUnderCursor(e); // IE8 does not return the element in iframe from first attempt if (!target) { target = elementUnderCursor(e); } that.hint.show(); } result = checkTarget(target, targets, areas); if (result) { callback(result.target, result.targetElement); } else { callback(); } } }, destroy: function() { var that = this; Widget.fn.destroy.call(that); that._afterEnd(); that.userEvents.destroy(); that.currentTarget = null; }, _afterEnd: function() { var that = this; if (that.hint) { that.hint.remove(); } delete draggables[that.options.group]; that.trigger("destroy"); that.trigger(HINTDESTROYED); $(document).off(KEYUP, that._captureEscape); } }); kendo.ui.plugin(DropTarget); kendo.ui.plugin(DropTargetArea); kendo.ui.plugin(Draggable); kendo.TapCapture = TapCapture; kendo.containerBoundaries = containerBoundaries; extend(kendo.ui, { Pane: Pane, PaneDimensions: PaneDimensions, Movable: Movable }); })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, mobile = kendo.mobile, fx = kendo.effects, ui = mobile.ui, proxy = $.proxy, extend = $.extend, Widget = ui.Widget, Class = kendo.Class, Movable = kendo.ui.Movable, Pane = kendo.ui.Pane, PaneDimensions = kendo.ui.PaneDimensions, Transition = fx.Transition, Animation = fx.Animation, abs = Math.abs, SNAPBACK_DURATION = 500, SCROLLBAR_OPACITY = 0.7, FRICTION = 0.96, VELOCITY_MULTIPLIER = 10, MAX_VELOCITY = 55, OUT_OF_BOUNDS_FRICTION = 0.5, ANIMATED_SCROLLER_PRECISION = 5, RELEASECLASS = "km-scroller-release", REFRESHCLASS = "km-scroller-refresh", PULL = "pull", CHANGE = "change", RESIZE = "resize", SCROLL = "scroll", MOUSE_WHEEL_ID = 2; var ZoomSnapBack = Animation.extend({ init: function(options) { var that = this; Animation.fn.init.call(that); extend(that, options); that.userEvents.bind("gestureend", proxy(that.start, that)); that.tapCapture.bind("press", proxy(that.cancel, that)); }, enabled: function() { return this.movable.scale < this.dimensions.minScale; }, done: function() { return this.dimensions.minScale - this.movable.scale < 0.01; }, tick: function() { var movable = this.movable; movable.scaleWith(1.1); this.dimensions.rescale(movable.scale); }, onEnd: function() { var movable = this.movable; movable.scaleTo(this.dimensions.minScale); this.dimensions.rescale(movable.scale); } }); var DragInertia = Animation.extend({ init: function(options) { var that = this; Animation.fn.init.call(that); extend(that, options, { transition: new Transition({ axis: options.axis, movable: options.movable, onEnd: function() { that._end(); } }) }); that.tapCapture.bind("press", function() { that.cancel(); }); that.userEvents.bind("end", proxy(that.start, that)); that.userEvents.bind("gestureend", proxy(that.start, that)); that.userEvents.bind("tap", proxy(that.onEnd, that)); }, onCancel: function() { this.transition.cancel(); }, freeze: function(location) { var that = this; that.cancel(); that._moveTo(location); }, onEnd: function() { var that = this; if (that.paneAxis.outOfBounds()) { that._snapBack(); } else { that._end(); } }, done: function() { return abs(this.velocity) < 1; }, start: function(e) { var that = this, velocity; if (!that.dimension.enabled) { return; } if (that.paneAxis.outOfBounds()) { that._snapBack(); } else { velocity = e.touch.id === MOUSE_WHEEL_ID ? 0 : e.touch[that.axis].velocity; that.velocity = Math.max(Math.min(velocity * that.velocityMultiplier, MAX_VELOCITY), -MAX_VELOCITY); that.tapCapture.captureNext(); Animation.fn.start.call(that); } }, tick: function() { var that = this, dimension = that.dimension, friction = that.paneAxis.outOfBounds() ? OUT_OF_BOUNDS_FRICTION : that.friction, delta = (that.velocity *= friction), location = that.movable[that.axis] + delta; if (!that.elastic && dimension.outOfBounds(location)) { location = Math.max(Math.min(location, dimension.max), dimension.min); that.velocity = 0; } that.movable.moveAxis(that.axis, location); }, _end: function() { this.tapCapture.cancelCapture(); this.end(); }, _snapBack: function() { var that = this, dimension = that.dimension, snapBack = that.movable[that.axis] > dimension.max ? dimension.max : dimension.min; that._moveTo(snapBack); }, _moveTo: function(location) { this.transition.moveTo({ location: location, duration: SNAPBACK_DURATION, ease: Transition.easeOutExpo }); } }); var AnimatedScroller = Animation.extend({ init: function(options) { var that = this; kendo.effects.Animation.fn.init.call(this); extend(that, options, { origin: {}, destination: {}, offset: {} }); }, tick: function() { this._updateCoordinates(); this.moveTo(this.origin); }, done: function() { return abs(this.offset.y) < ANIMATED_SCROLLER_PRECISION && abs(this.offset.x) < ANIMATED_SCROLLER_PRECISION; }, onEnd: function() { this.moveTo(this.destination); if (this.callback) { this.callback.call(); } }, setCoordinates: function(from, to) { this.offset = {}; this.origin = from; this.destination = to; }, setCallback: function(callback) { if (callback && kendo.isFunction(callback)) { this.callback = callback; } else { callback = undefined; } }, _updateCoordinates: function() { this.offset = { x: (this.destination.x - this.origin.x) / 4, y: (this.destination.y - this.origin.y) / 4 }; this.origin = { y: this.origin.y + this.offset.y, x: this.origin.x + this.offset.x }; } }); var ScrollBar = Class.extend({ init: function(options) { var that = this, horizontal = options.axis === "x", element = $('
    '); extend(that, options, { element: element, elementSize: 0, movable: new Movable(element), scrollMovable: options.movable, alwaysVisible: options.alwaysVisible, size: horizontal ? "width" : "height" }); that.scrollMovable.bind(CHANGE, proxy(that.refresh, that)); that.container.append(element); if (options.alwaysVisible) { that.show(); } }, refresh: function() { var that = this, axis = that.axis, dimension = that.dimension, paneSize = dimension.size, scrollMovable = that.scrollMovable, sizeRatio = paneSize / dimension.total, position = Math.round(-scrollMovable[axis] * sizeRatio), size = Math.round(paneSize * sizeRatio); if (sizeRatio >= 1) { this.element.css("display", "none"); } else { this.element.css("display", ""); } if (position + size > paneSize) { size = paneSize - position; } else if (position < 0) { size += position; position = 0; } if (that.elementSize != size) { that.element.css(that.size, size + "px"); that.elementSize = size; } that.movable.moveAxis(axis, position); }, show: function() { this.element.css({opacity: SCROLLBAR_OPACITY, visibility: "visible"}); }, hide: function() { if (!this.alwaysVisible) { this.element.css({opacity: 0}); } } }); var Scroller = Widget.extend({ init: function(element, options) { var that = this; Widget.fn.init.call(that, element, options); element = that.element; that._native = that.options.useNative && kendo.support.hasNativeScrolling; if (that._native) { element.addClass("km-native-scroller") .prepend('
    '); extend(that, { scrollElement: element, fixedContainer: element.children().first() }); return; } element .css("overflow", "hidden") .addClass("km-scroll-wrapper") .wrapInner('
    ') .prepend('
    '); var inner = element.children().eq(1), tapCapture = new kendo.TapCapture(element), movable = new Movable(inner), dimensions = new PaneDimensions({ element: inner, container: element, forcedEnabled: that.options.zoom }), avoidScrolling = this.options.avoidScrolling, userEvents = new kendo.UserEvents(element, { allowSelection: true, preventDragEvent: true, captureUpIfMoved: true, multiTouch: that.options.zoom, start: function(e) { dimensions.refresh(); var velocityX = abs(e.x.velocity), velocityY = abs(e.y.velocity), horizontalSwipe = velocityX * 2 >= velocityY, originatedFromFixedContainer = $.contains(that.fixedContainer[0], e.event.target), verticalSwipe = velocityY * 2 >= velocityX; if (!originatedFromFixedContainer && !avoidScrolling(e) && that.enabled && (dimensions.x.enabled && horizontalSwipe || dimensions.y.enabled && verticalSwipe)) { userEvents.capture(); } else { userEvents.cancel(); } } }), pane = new Pane({ movable: movable, dimensions: dimensions, userEvents: userEvents, elastic: that.options.elastic }), zoomSnapBack = new ZoomSnapBack({ movable: movable, dimensions: dimensions, userEvents: userEvents, tapCapture: tapCapture }), animatedScroller = new AnimatedScroller({ moveTo: function(coordinates) { that.scrollTo(coordinates.x, coordinates.y); } }); movable.bind(CHANGE, function() { that.scrollTop = - movable.y; that.scrollLeft = - movable.x; that.trigger(SCROLL, { scrollTop: that.scrollTop, scrollLeft: that.scrollLeft }); }); if (that.options.mousewheelScrolling) { element.on("DOMMouseScroll mousewheel", proxy(this, "_wheelScroll")); } extend(that, { movable: movable, dimensions: dimensions, zoomSnapBack: zoomSnapBack, animatedScroller: animatedScroller, userEvents: userEvents, pane: pane, tapCapture: tapCapture, pulled: false, enabled: true, scrollElement: inner, scrollTop: 0, scrollLeft: 0, fixedContainer: element.children().first() }); that._initAxis("x"); that._initAxis("y"); // build closure that._wheelEnd = function() { that._wheel = false; that.userEvents.end(0, that._wheelY); }; dimensions.refresh(); if (that.options.pullToRefresh) { that._initPullToRefresh(); } }, _wheelScroll: function(e) { if (!this._wheel) { this._wheel = true; this._wheelY = 0; this.userEvents.press(0, this._wheelY); } clearTimeout(this._wheelTimeout); this._wheelTimeout = setTimeout(this._wheelEnd, 50); var delta = kendo.wheelDeltaY(e); if (delta) { this._wheelY += delta; this.userEvents.move(0, this._wheelY); } e.preventDefault(); }, makeVirtual: function() { this.dimensions.y.makeVirtual(); }, virtualSize: function(min, max) { this.dimensions.y.virtualSize(min, max); }, height: function() { return this.dimensions.y.size; }, scrollHeight: function() { return this.scrollElement[0].scrollHeight; }, scrollWidth: function() { return this.scrollElement[0].scrollWidth; }, options: { name: "Scroller", zoom: false, pullOffset: 140, visibleScrollHints: false, elastic: true, useNative: false, mousewheelScrolling: true, avoidScrolling: function() { return false; }, pullToRefresh: false, messages: { pullTemplate: "Pull to refresh", releaseTemplate: "Release to refresh", refreshTemplate: "Refreshing" } }, events: [ PULL, SCROLL, RESIZE ], _resize: function() { if (!this._native) { this.contentResized(); } }, setOptions: function(options) { var that = this; Widget.fn.setOptions.call(that, options); if (options.pullToRefresh) { that._initPullToRefresh(); } }, reset: function() { if (this._native) { this.scrollElement.scrollTop(0); } else { this.movable.moveTo({x: 0, y: 0}); this._scale(1); } }, contentResized: function() { this.dimensions.refresh(); if (this.pane.x.outOfBounds()) { this.movable.moveAxis("x", this.dimensions.x.min); } if (this.pane.y.outOfBounds()) { this.movable.moveAxis("y", this.dimensions.y.min); } }, zoomOut: function() { var dimensions = this.dimensions; dimensions.refresh(); this._scale(dimensions.fitScale); this.movable.moveTo(dimensions.centerCoordinates()); }, enable: function() { this.enabled = true; }, disable: function() { this.enabled = false; }, scrollTo: function(x, y) { if (this._native) { this.scrollElement.scrollLeft(abs(x)); this.scrollElement.scrollTop(abs(y)); } else { this.dimensions.refresh(); this.movable.moveTo({x: x, y: y}); } }, animatedScrollTo: function(x, y, callback) { var from, to; if(this._native) { this.scrollTo(x, y); } else { from = { x: this.movable.x, y: this.movable.y }; to = { x: x, y: y }; this.animatedScroller.setCoordinates(from, to); this.animatedScroller.setCallback(callback); this.animatedScroller.start(); } }, pullHandled: function() { var that = this; that.refreshHint.removeClass(REFRESHCLASS); that.hintContainer.html(that.pullTemplate({})); that.yinertia.onEnd(); that.xinertia.onEnd(); that.userEvents.cancel(); }, destroy: function() { Widget.fn.destroy.call(this); if (this.userEvents) { this.userEvents.destroy(); } }, _scale: function(scale) { this.dimensions.rescale(scale); this.movable.scaleTo(scale); }, _initPullToRefresh: function() { var that = this; that.dimensions.y.forceEnabled(); that.pullTemplate = kendo.template(that.options.messages.pullTemplate); that.releaseTemplate = kendo.template(that.options.messages.releaseTemplate); that.refreshTemplate = kendo.template(that.options.messages.refreshTemplate); that.scrollElement.prepend('' + that.pullTemplate({}) + ''); that.refreshHint = that.scrollElement.children().first(); that.hintContainer = that.refreshHint.children(".km-template"); that.pane.y.bind("change", proxy(that._paneChange, that)); that.userEvents.bind("end", proxy(that._dragEnd, that)); }, _dragEnd: function() { var that = this; if(!that.pulled) { return; } that.pulled = false; that.refreshHint.removeClass(RELEASECLASS).addClass(REFRESHCLASS); that.hintContainer.html(that.refreshTemplate({})); that.yinertia.freeze(that.options.pullOffset / 2); that.trigger("pull"); }, _paneChange: function() { var that = this; if (that.movable.y / OUT_OF_BOUNDS_FRICTION > that.options.pullOffset) { if (!that.pulled) { that.pulled = true; that.refreshHint.removeClass(REFRESHCLASS).addClass(RELEASECLASS); that.hintContainer.html(that.releaseTemplate({})); } } else if (that.pulled) { that.pulled = false; that.refreshHint.removeClass(RELEASECLASS); that.hintContainer.html(that.pullTemplate({})); } }, _initAxis: function(axis) { var that = this, movable = that.movable, dimension = that.dimensions[axis], tapCapture = that.tapCapture, paneAxis = that.pane[axis], scrollBar = new ScrollBar({ axis: axis, movable: movable, dimension: dimension, container: that.element, alwaysVisible: that.options.visibleScrollHints }); dimension.bind(CHANGE, function() { scrollBar.refresh(); }); paneAxis.bind(CHANGE, function() { scrollBar.show(); }); that[axis + "inertia"] = new DragInertia({ axis: axis, paneAxis: paneAxis, movable: movable, tapCapture: tapCapture, userEvents: that.userEvents, dimension: dimension, elastic: that.options.elastic, friction: that.options.friction || FRICTION, velocityMultiplier: that.options.velocityMultiplier || VELOCITY_MULTIPLIER, end: function() { scrollBar.hide(); that.trigger("scrollEnd", { axis: axis, scrollTop: that.scrollTop, scrollLeft: that.scrollLeft }); } }); } }); ui.plugin(Scroller); })(window.kendo.jQuery); (function ($, undefined) { var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, isRtl = false, NS = ".kendoGroupable", CHANGE = "change", indicatorTmpl = kendo.template('', { useWithBlock:false }), hint = function(target) { return $('
    ') .css({ width: target.width(), paddingLeft: target.css("paddingLeft"), paddingRight: target.css("paddingRight"), lineHeight: target.height() + "px", paddingTop: target.css("paddingTop"), paddingBottom: target.css("paddingBottom") }) .html(target.attr(kendo.attr("title")) || target.attr(kendo.attr("field"))) .prepend(''); }, dropCue = $('
    '), nameSpecialCharRegExp = /("|\%|'|\[|\]|\$|\.|\,|\:|\;|\+|\*|\&|\!|\#|\(|\)|<|>|\=|\?|\@|\^|\{|\}|\~|\/|\||`)/g; function dropCueOffsetTop(element) { return element.position().top + 3; } var Groupable = Widget.extend({ init: function(element, options) { var that = this, groupContainer, group = kendo.guid(), intializePositions = proxy(that._intializePositions, that), draggable, horizontalCuePosition, dropCuePositions = that._dropCuePositions = []; Widget.fn.init.call(that, element, options); isRtl = kendo.support.isRtl(element); horizontalCuePosition = isRtl ? "right" : "left"; that.draggable = draggable = that.options.draggable || new kendo.ui.Draggable(that.element, { filter: that.options.draggableElements, hint: hint, group: group }); that.groupContainer = $(that.options.groupContainer, that.element) .kendoDropTarget({ group: draggable.options.group, dragenter: function(e) { if (that._canDrag(e.draggable.currentTarget)) { e.draggable.hint.find(".k-drag-status").removeClass("k-denied").addClass("k-add"); dropCue.css("top", dropCueOffsetTop(that.groupContainer)).css(horizontalCuePosition, 0).appendTo(that.groupContainer); } }, dragleave: function(e) { e.draggable.hint.find(".k-drag-status").removeClass("k-add").addClass("k-denied"); dropCue.remove(); }, drop: function(e) { var targetElement = e.draggable.currentTarget, field = targetElement.attr(kendo.attr("field")), title = targetElement.attr(kendo.attr("title")), sourceIndicator = that.indicator(field), dropCuePositions = that._dropCuePositions, lastCuePosition = dropCuePositions[dropCuePositions.length - 1], position; if (!targetElement.hasClass("k-group-indicator") && !that._canDrag(targetElement)) { return; } if(lastCuePosition) { position = that._dropCuePosition(kendo.getOffset(dropCue).left + parseInt(lastCuePosition.element.css("marginLeft"), 10) * (isRtl ? -1 : 1) + parseInt(lastCuePosition.element.css("marginRight"), 10)); if(position && that._canDrop($(sourceIndicator), position.element, position.left)) { if(position.before) { position.element.before(sourceIndicator || that.buildIndicator(field, title)); } else { position.element.after(sourceIndicator || that.buildIndicator(field, title)); } that._change(); } } else { that.groupContainer.append(that.buildIndicator(field, title)); that._change(); } } }) .kendoDraggable({ filter: "div.k-group-indicator", hint: hint, group: draggable.options.group, dragcancel: proxy(that._dragCancel, that), dragstart: function(e) { var element = e.currentTarget, marginLeft = parseInt(element.css("marginLeft"), 10), elementPosition = element.position(), left = isRtl ? elementPosition.left - marginLeft : elementPosition.left + element.outerWidth(); intializePositions(); dropCue.css({top: dropCueOffsetTop(that.groupContainer), left: left}).appendTo(that.groupContainer); this.hint.find(".k-drag-status").removeClass("k-denied").addClass("k-add"); }, dragend: function() { that._dragEnd(this); }, drag: proxy(that._drag, that) }) .on("click" + NS, ".k-button", function(e) { e.preventDefault(); that._removeIndicator($(this).parent()); }) .on("click" + NS,".k-link", function(e) { var current = $(this).parent(), newIndicator = that.buildIndicator(current.attr(kendo.attr("field")), current.attr(kendo.attr("title")), current.attr(kendo.attr("dir")) == "asc" ? "desc" : "asc"); current.before(newIndicator).remove(); that._change(); e.preventDefault(); }); draggable.bind([ "dragend", "dragcancel", "dragstart", "drag" ], { dragend: function() { that._dragEnd(this); }, dragcancel: proxy(that._dragCancel, that), dragstart: function(e) { var element, marginRight, left; if (!that.options.allowDrag && !that._canDrag(e.currentTarget)) { e.preventDefault(); return; } intializePositions(); if(dropCuePositions.length) { element = dropCuePositions[dropCuePositions.length - 1].element; marginRight = parseInt(element.css("marginRight"), 10); left = element.position().left + element.outerWidth() + marginRight; } else { left = 0; } }, drag: proxy(that._drag, that) }); that.dataSource = that.options.dataSource; if (that.dataSource && that._refreshHandler) { that.dataSource.unbind(CHANGE, that._refreshHandler); } else { that._refreshHandler = proxy(that.refresh, that); } if(that.dataSource) { that.dataSource.bind("change", that._refreshHandler); that.refresh(); } }, refresh: function() { var that = this, dataSource = that.dataSource; if (that.groupContainer) { that.groupContainer.empty().append( $.map(dataSource.group() || [], function(item) { var fieldName = item.field; var attr = kendo.attr("field"); var element = that.element.find(that.options.filter) .filter(function() { return $(this).attr(attr) === fieldName; }); return that.buildIndicator(item.field, element.attr(kendo.attr("title")), item.dir); }).join("") ); } that._invalidateGroupContainer(); }, destroy: function() { var that = this; Widget.fn.destroy.call(that); that.groupContainer.off(NS); if (that.groupContainer.data("kendoDropTarget")) { that.groupContainer.data("kendoDropTarget").destroy(); } if (that.groupContainer.data("kendoDraggable")) { that.groupContainer.data("kendoDraggable").destroy(); } if (!that.options.draggable) { that.draggable.destroy(); } if (that.dataSource && that._refreshHandler) { that.dataSource.unbind("change", that._refreshHandler); that._refreshHandler = null; } that.groupContainer = that.element = that.draggable = null; }, options: { name: "Groupable", filter: "th", draggableElements: "th", messages: { empty: "Drag a column header and drop it here to group by that column" } }, indicator: function(field) { var indicators = $(".k-group-indicator", this.groupContainer); return $.grep(indicators, function (item) { return $(item).attr(kendo.attr("field")) === field; })[0]; }, buildIndicator: function(field, title, dir) { return indicatorTmpl({ field: field.replace(/"/g, "'"), dir: dir, title: title, ns: kendo.ns }); }, descriptors: function() { var that = this, indicators = $(".k-group-indicator", that.groupContainer), aggregates, names, field, idx, length; aggregates = that.element.find(that.options.filter).map(function() { var cell = $(this), aggregate = cell.attr(kendo.attr("aggregates")), member = cell.attr(kendo.attr("field")); if (aggregate && aggregate !== "") { names = aggregate.split(","); aggregate = []; for (idx = 0, length = names.length; idx < length; idx++) { aggregate.push({ field: member, aggregate: names[idx] }); } } return aggregate; }).toArray(); return $.map(indicators, function(item) { item = $(item); field = item.attr(kendo.attr("field")); return { field: field, dir: item.attr(kendo.attr("dir")), aggregates: aggregates || [] }; }); }, _removeIndicator: function(indicator) { var that = this; indicator.remove(); that._invalidateGroupContainer(); that._change(); }, _change: function() { var that = this; if(that.dataSource) { that.dataSource.group(that.descriptors()); } }, _dropCuePosition: function(position) { var dropCuePositions = this._dropCuePositions; if(!dropCue.is(":visible") || dropCuePositions.length === 0) { return; } position = Math.ceil(position); var lastCuePosition = dropCuePositions[dropCuePositions.length - 1], left = lastCuePosition.left, right = lastCuePosition.right, marginLeft = parseInt(lastCuePosition.element.css("marginLeft"), 10), marginRight = parseInt(lastCuePosition.element.css("marginRight"), 10); if(position >= right && !isRtl || position < left && isRtl) { position = { left: lastCuePosition.element.position().left + (!isRtl ? lastCuePosition.element.outerWidth() + marginRight : - marginLeft), element: lastCuePosition.element, before: false }; } else { position = $.grep(dropCuePositions, function(item) { return (item.left <= position && position <= item.right) || (isRtl && position > item.right); })[0]; if(position) { position = { left: isRtl ? position.element.position().left + position.element.outerWidth() + marginRight : position.element.position().left - marginLeft, element: position.element, before: true }; } } return position; }, _drag: function(event) { var position = this._dropCuePosition(event.x.location); if (position) { dropCue.css({ left: position.left, right: "auto" }); } }, _canDrag: function(element) { var field = element.attr(kendo.attr("field")); return element.attr(kendo.attr("groupable")) != "false" && field && (element.hasClass("k-group-indicator") || !this.indicator(field)); }, _canDrop: function(source, target, position) { var next = source.next(), result = source[0] !== target[0] && (!next[0] || target[0] !== next[0] || (!isRtl && position > next.position().left || isRtl && position < next.position().left)); return result; }, _dragEnd: function(draggable) { var that = this, field = draggable.currentTarget.attr(kendo.attr("field")), sourceIndicator = that.indicator(field); if (draggable !== that.options.draggable && !draggable.dropped && sourceIndicator) { that._removeIndicator($(sourceIndicator)); } that._dragCancel(); }, _dragCancel: function() { dropCue.remove(); this._dropCuePositions = []; }, _intializePositions: function() { var that = this, indicators = $(".k-group-indicator", that.groupContainer), left; that._dropCuePositions = $.map(indicators, function(item) { item = $(item); left = kendo.getOffset(item).left; return { left: parseInt(left, 10), right: parseInt(left + item.outerWidth(), 10), element: item }; }); }, _invalidateGroupContainer: function() { var groupContainer = this.groupContainer; if(groupContainer && groupContainer.is(":empty")) { groupContainer.html(this.options.messages.empty); } } }); kendo.ui.plugin(Groupable); })(window.kendo.jQuery); (function ($, undefined) { var kendo = window.kendo, getOffset = kendo.getOffset, Widget = kendo.ui.Widget, CHANGE = "change", KREORDERABLE = "k-reorderable"; function toggleHintClass(hint, denied) { hint = $(hint); if (denied) { hint.find(".k-drag-status").removeClass("k-add").addClass("k-denied"); } else { hint.find(".k-drag-status").removeClass("k-denied").addClass("k-add"); } } var Reorderable = Widget.extend({ init: function(element, options) { var that = this, draggable, group = kendo.guid() + "-reorderable"; Widget.fn.init.call(that, element, options); element = that.element.addClass(KREORDERABLE); options = that.options; that.draggable = draggable = options.draggable || new kendo.ui.Draggable(element, { group: group, filter: options.filter, hint: options.hint }); that.reorderDropCue = $('
    '); element.find(draggable.options.filter).kendoDropTarget({ group: draggable.options.group, dragenter: function(e) { if (!that._draggable) { return; } var dropTarget = this.element, offset; var denied = !that._dropTargetAllowed(dropTarget) || that._isLastDraggable(); toggleHintClass(e.draggable.hint, denied); if (!denied) { offset = getOffset(dropTarget); var left = offset.left; if (options.inSameContainer && !options.inSameContainer({ source: dropTarget, target: that._draggable, sourceIndex: that._index(dropTarget), targetIndex: that._index(that._draggable) })) { that._dropTarget = dropTarget; } else { if (that._index(dropTarget) > that._index(that._draggable)) { left += dropTarget.outerWidth(); } } that.reorderDropCue.css({ height: dropTarget.outerHeight(), top: offset.top, left: left }) .appendTo(document.body); } }, dragleave: function(e) { toggleHintClass(e.draggable.hint, true); that.reorderDropCue.remove(); that._dropTarget = null; }, drop: function() { that._dropTarget = null; if (!that._draggable) { return; } var dropTarget = this.element; var draggable = that._draggable; var containerChange = false; if (that._dropTargetAllowed(dropTarget) && !that._isLastDraggable()) { that.trigger(CHANGE, { element: that._draggable, target: dropTarget, oldIndex: that._index(draggable), newIndex: that._index(dropTarget), position: getOffset(that.reorderDropCue).left > getOffset(dropTarget).left ? "after" : "before" }); } } }); draggable.bind([ "dragcancel", "dragend", "dragstart", "drag" ], { dragcancel: function() { that.reorderDropCue.remove(); that._draggable = null; that._elements = null; }, dragend: function() { that.reorderDropCue.remove(); that._draggable = null; that._elements = null; }, dragstart: function(e) { that._draggable = e.currentTarget; that._elements = that.element.find(that.draggable.options.filter); }, drag: function(e) { if (!that._dropTarget || this.hint.find(".k-drag-status").hasClass("k-denied")) { return; } var dropStartOffset = getOffset(that._dropTarget).left; var width = that._dropTarget.outerWidth(); if (e.pageX > dropStartOffset + width / 2) { that.reorderDropCue.css({ left: dropStartOffset + width }); } else { that.reorderDropCue.css({ left: dropStartOffset }); } } } ); }, options: { name: "Reorderable", filter: "*" }, events: [ CHANGE ], _isLastDraggable: function() { var inSameContainer = this.options.inSameContainer, draggable = this._draggable[0], elements = this._elements.get(), found = false, item; if (!inSameContainer) { return false; } while (!found && elements.length > 0) { item = elements.pop(); found = draggable !== item && inSameContainer({ source: draggable, target: item, sourceIndex: this._index(draggable), targetIndex: this._index(item) }); } return !found; }, _dropTargetAllowed: function(dropTarget) { var inSameContainer = this.options.inSameContainer, dragOverContainers = this.options.dragOverContainers, draggable = this._draggable; if (draggable[0] === dropTarget[0]) { return false; } if (!inSameContainer || !dragOverContainers) { return true; } if (inSameContainer({ source: draggable, target: dropTarget, sourceIndex: this._index(draggable), targetIndex: this._index(dropTarget) })) { return true; } return dragOverContainers(this._index(draggable), this._index(dropTarget)); }, _index: function(element) { return this._elements.index(element); }, destroy: function() { var that = this; Widget.fn.destroy.call(that); that.element.find(that.draggable.options.filter).each(function() { var item = $(this); if (item.data("kendoDropTarget")) { item.data("kendoDropTarget").destroy(); } }); if (that.draggable) { that.draggable.destroy(); that.draggable.element = that.draggable = null; } that.elements = that.reorderDropCue = that._elements = that._draggable = null; } }); kendo.ui.plugin(Reorderable); })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, proxy = $.proxy, isFunction = kendo.isFunction, extend = $.extend, HORIZONTAL = "horizontal", VERTICAL = "vertical", START = "start", RESIZE = "resize", RESIZEEND = "resizeend"; var Resizable = Widget.extend({ init: function(element, options) { var that = this; Widget.fn.init.call(that, element, options); that.orientation = that.options.orientation.toLowerCase() != VERTICAL ? HORIZONTAL : VERTICAL; that._positionMouse = that.orientation == HORIZONTAL ? "x" : "y"; that._position = that.orientation == HORIZONTAL ? "left" : "top"; that._sizingDom = that.orientation == HORIZONTAL ? "outerWidth" : "outerHeight"; that.draggable = new ui.Draggable(element, { distance: 0, filter: options.handle, drag: proxy(that._resize, that), dragcancel: proxy(that._cancel, that), dragstart: proxy(that._start, that), dragend: proxy(that._stop, that) }); that.userEvents = that.draggable.userEvents; }, events: [ RESIZE, RESIZEEND, START ], options: { name: "Resizable", orientation: HORIZONTAL }, resize: function() { // Overrides base widget resize }, _max: function(e) { var that = this, hintSize = that.hint ? that.hint[that._sizingDom]() : 0, size = that.options.max; return isFunction(size) ? size(e) : size !== undefined ? (that._initialElementPosition + size) - hintSize : size; }, _min: function(e) { var that = this, size = that.options.min; return isFunction(size) ? size(e) : size !== undefined ? that._initialElementPosition + size : size; }, _start: function(e) { var that = this, hint = that.options.hint, el = $(e.currentTarget); that._initialElementPosition = el.position()[that._position]; that._initialMousePosition = e[that._positionMouse].startLocation; if (hint) { that.hint = isFunction(hint) ? $(hint(el)) : hint; that.hint.css({ position: "absolute" }) .css(that._position, that._initialElementPosition) .appendTo(that.element); } that.trigger(START, e); that._maxPosition = that._max(e); that._minPosition = that._min(e); $(document.body).css("cursor", el.css("cursor")); }, _resize: function(e) { var that = this, maxPosition = that._maxPosition, minPosition = that._minPosition, currentPosition = that._initialElementPosition + (e[that._positionMouse].location - that._initialMousePosition), position; position = minPosition !== undefined ? Math.max(minPosition, currentPosition) : currentPosition; that.position = position = maxPosition !== undefined ? Math.min(maxPosition, position) : position; if(that.hint) { that.hint.toggleClass(that.options.invalidClass || "", position == maxPosition || position == minPosition) .css(that._position, position); } that.resizing = true; that.trigger(RESIZE, extend(e, { position: position })); }, _stop: function(e) { var that = this; if(that.hint) { that.hint.remove(); } that.resizing = false; that.trigger(RESIZEEND, extend(e, { position: that.position })); $(document.body).css("cursor", ""); }, _cancel: function(e) { var that = this; if (that.hint) { that.position = undefined; that.hint.css(that._position, that._initialElementPosition); that._stop(e); } }, destroy: function() { var that = this; Widget.fn.destroy.call(that); if (that.draggable) { that.draggable.destroy(); } }, press: function(target) { if (!target) { return; } var position = target.position(), that = this; that.userEvents.press(position.left, position.top, target[0]); that.targetPosition = position; that.target = target; }, move: function(delta) { var that = this, orientation = that._position, position = that.targetPosition, current = that.position; if (current === undefined) { current = position[orientation]; } position[orientation] = current + delta; that.userEvents.move(position.left, position.top); }, end: function() { this.userEvents.end(); this.target = this.position = undefined; } }); kendo.ui.plugin(Resizable); })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, Widget = kendo.ui.Widget, START = "start", BEFORE_MOVE = "beforeMove", MOVE = "move", END = "end", CHANGE = "change", CANCEL = "cancel", ACTION_SORT = "sort", ACTION_REMOVE = "remove", ACTION_RECEIVE = "receive", DEFAULT_FILTER = ">*", MISSING_INDEX = -1; function containsOrEqualTo(parent, child) { try { return $.contains(parent, child) || parent == child; } catch (e) { return false; } } function defaultHint(element) { return element.clone(); } function defaultPlaceholder(element) { return element.clone().removeAttr("id").css("visibility", "hidden"); } var Sortable = Widget.extend({ init: function(element, options) { var that = this; Widget.fn.init.call(that, element, options); if(!that.options.placeholder) { that.options.placeholder = defaultPlaceholder; } if(!that.options.hint) { that.options.hint = defaultHint; } that._draggable = that._createDraggable(); }, events: [ START, BEFORE_MOVE, MOVE, END, CHANGE, CANCEL ], options: { name: "Sortable", hint: null, placeholder: null, filter: DEFAULT_FILTER, holdToDrag: false, disabled: null, container: null, connectWith: null, handler: null, cursorOffset: null, axis: null, ignore: null, cursor: "auto" }, destroy: function() { this._draggable.destroy(); Widget.fn.destroy.call(this); }, _createDraggable: function() { var that = this, element = that.element, options = that.options; return new kendo.ui.Draggable(element, { filter: options.filter, hint: kendo.isFunction(options.hint) ? options.hint : $(options.hint), holdToDrag: options.holdToDrag, container: options.container ? $(options.container) : null, cursorOffset: options.cursorOffset, axis: options.axis, ignore: options.ignore, dragstart: $.proxy(that._dragstart, that), dragcancel: $.proxy(that._dragcancel, that), drag: $.proxy(that._drag, that), dragend: $.proxy(that._dragend, that) }); }, _dragstart: function(e) { var draggedElement = this.draggedElement = e.currentTarget, target = e.target || kendo.elementUnderCursor(e), disabled = this.options.disabled, handler = this.options.handler, _placeholder = this.options.placeholder, placeholder = this.placeholder = kendo.isFunction(_placeholder) ? $(_placeholder.call(this, draggedElement)) : $(_placeholder); if(disabled && draggedElement.is(disabled)) { e.preventDefault(); } else if(handler && !$(target).is(handler)) { e.preventDefault(); } else { if(this.trigger(START, { item: draggedElement, draggableEvent: e })) { e.preventDefault(); } else { draggedElement.css("display", "none"); draggedElement.before(placeholder); this._setCursor(); } } }, _dragcancel: function(e) { this._cancel(); this.trigger(CANCEL, { item: this.draggedElement }); this._resetCursor(); }, _drag: function(e) { var draggedElement = this.draggedElement, target = this._findTarget(e), targetCenter, cursorOffset = { left: e.x.location, top: e.y.location }, offsetDelta, axisDelta = { x: e.x.delta, y: e.y.delta }, direction, sibling, getSibling, axis = this.options.axis, eventData = { item: draggedElement, list: this, draggableEvent: e }; if(axis === "x" || axis === "y") { this._movementByAxis(axis, cursorOffset, axisDelta[axis], eventData); return; } if(target) { targetCenter = this._getElementCenter(target.element); offsetDelta = { left: Math.round(cursorOffset.left - targetCenter.left), top: Math.round(cursorOffset.top - targetCenter.top) }; $.extend(eventData, { target: target.element }); if(target.appendToBottom) { this._movePlaceholder(target, null, eventData); return; } if(target.appendAfterHidden) { this._movePlaceholder(target, "next", eventData); } if(this._isFloating(target.element)) { //horizontal if(axisDelta.x < 0 && offsetDelta.left < 0) { direction = "prev"; } else if(axisDelta.x > 0 && offsetDelta.left > 0) { direction = "next"; } } else { //vertical if(axisDelta.y < 0 && offsetDelta.top < 0) { direction = "prev"; } else if(axisDelta.y > 0 && offsetDelta.top > 0) { direction = "next"; } } if(direction) { getSibling = (direction === "prev") ? jQuery.fn.prev : jQuery.fn.next; sibling = getSibling.call(target.element); //find the prev/next visible sibling while(sibling.length && !sibling.is(":visible")) { sibling = getSibling.call(sibling); } if(sibling[0] != this.placeholder[0]) { this._movePlaceholder(target, direction, eventData); } } } }, _dragend: function(e) { var placeholder = this.placeholder, draggedElement = this.draggedElement, draggedIndex = this.indexOf(draggedElement), placeholderIndex = this.indexOf(placeholder), connectWith = this.options.connectWith, connectedList, isDefaultPrevented, eventData, connectedListEventData; this._resetCursor(); eventData = { action: ACTION_SORT, item: draggedElement, oldIndex: draggedIndex, newIndex: placeholderIndex, draggableEvent: e }; if(placeholderIndex >= 0) { isDefaultPrevented = this.trigger(END, eventData); } else { connectedList = placeholder.parents(connectWith).getKendoSortable(); eventData.action = ACTION_REMOVE; connectedListEventData = $.extend({}, eventData, { action: ACTION_RECEIVE, oldIndex: MISSING_INDEX, newIndex: connectedList.indexOf(placeholder) }); isDefaultPrevented = !(!this.trigger(END, eventData) && !connectedList.trigger(END, connectedListEventData)); } if(isDefaultPrevented || placeholderIndex === draggedIndex) { this._cancel(); return; } placeholder.replaceWith(draggedElement); draggedElement.show(); this._draggable.dropped = true; eventData = { action: this.indexOf(draggedElement) != MISSING_INDEX ? ACTION_SORT : ACTION_REMOVE, item: draggedElement, oldIndex: draggedIndex, newIndex: this.indexOf(draggedElement), draggableEvent: e }; this.trigger(CHANGE, eventData); if(connectedList) { connectedListEventData = $.extend({}, eventData, { action: ACTION_RECEIVE, oldIndex: MISSING_INDEX, newIndex: connectedList.indexOf(draggedElement) }); connectedList.trigger(CHANGE, connectedListEventData); } }, _findTarget: function(e) { var element = this._findElementUnderCursor(e), items, connectWith = this.options.connectWith, node; if($.contains(this.element[0], element)) { //the element is part of the sortable container items = this.items(); node = items.filter(element)[0] || items.has(element)[0]; return node ? { element: $(node), sortable: this } : null; } else if (this.element[0] == element && this._isEmpty()) { return { element: this.element, sortable: this, appendToBottom: true }; } else if (this.element[0] == element && this._isLastHidden()) { node = this.items().eq(0); return { element: node , sortable: this, appendAfterHidden: true }; } else if (connectWith) { //connected lists are present return this._searchConnectedTargets(element, e); } }, _findElementUnderCursor: function(e) { var elementUnderCursor = kendo.elementUnderCursor(e), draggable = e.sender, disabled = this.options.disabled, filter = this.options.filter, items = this.items(); if(containsOrEqualTo(draggable.hint[0], elementUnderCursor)) { draggable.hint.hide(); elementUnderCursor = kendo.elementUnderCursor(e); // IE8 does not return the element in iframe from first attempt if (!elementUnderCursor) { elementUnderCursor = kendo.elementUnderCursor(e); } draggable.hint.show(); } return elementUnderCursor; }, _searchConnectedTargets: function(element, e) { var connected = $(this.options.connectWith), sortableInstance, items, node; for (var i = 0; i < connected.length; i++) { sortableInstance = connected.eq(i).getKendoSortable(); if($.contains(connected[i], element)) { if(sortableInstance) { items = sortableInstance.items(); node = items.filter(element)[0] || items.has(element)[0]; if(node) { sortableInstance.placeholder = this.placeholder; return { element: $(node), sortable: sortableInstance }; } else { return null; } } } else if(connected[i] == element) { if(sortableInstance && sortableInstance._isEmpty()) { return { element: connected.eq(i), sortable: sortableInstance, appendToBottom: true }; } else if (this._isCursorAfterLast(sortableInstance, e)) { node = sortableInstance.items().last(); return { element: node, sortable: sortableInstance }; } } } }, _isCursorAfterLast: function(sortable, e) { var lastItem = sortable.items().last(), cursorOffset = { left: e.x.location, top: e.y.location }, lastItemOffset, delta; lastItemOffset = kendo.getOffset(lastItem); lastItemOffset.top += lastItem.outerHeight(); lastItemOffset.left += lastItem.outerWidth(); if(this._isFloating(lastItem)) { //horizontal delta = lastItemOffset.left - cursorOffset.left; } else { //vertical delta = lastItemOffset.top - cursorOffset.top; } return delta < 0 ? true : false; }, _movementByAxis: function(axis, cursorOffset, delta, eventData) { var cursorPosition = (axis === "x") ? cursorOffset.left : cursorOffset.top, target = (delta < 0) ? this.placeholder.prev() : this.placeholder.next(), targetCenter; if (target.length && !target.is(":visible")) { target = (delta <0) ? target.prev() : target.next(); } $.extend(eventData, { target: target }); targetCenter = this._getElementCenter(target); if (targetCenter) { targetCenter = (axis === "x") ? targetCenter.left : targetCenter.top; } if (target.length && delta < 0 && cursorPosition - targetCenter < 0) { //prev this._movePlaceholder({ element: target, sortable: this }, "prev", eventData); } else if (target.length && delta > 0 && cursorPosition - targetCenter > 0) { //next this._movePlaceholder({ element: target, sortable: this }, "next", eventData); } }, _movePlaceholder: function(target, direction, eventData) { var placeholder = this.placeholder; if (!target.sortable.trigger(BEFORE_MOVE, eventData)) { if (!direction) { target.element.append(placeholder); } else if (direction === "prev") { target.element.before(placeholder); } else if (direction === "next") { target.element.after(placeholder); } target.sortable.trigger(MOVE, eventData); } }, _setCursor: function() { var cursor = this.options.cursor, body; if(cursor && cursor !== "auto") { body = $(document.body); this._originalCursorType = body.css("cursor"); body.css({ "cursor": cursor }); if(!this._cursorStylesheet) { this._cursorStylesheet = $(""); } this._cursorStylesheet.appendTo(body); } }, _resetCursor: function() { if(this._originalCursorType) { $(document.body).css("cursor", this._originalCursorType); this._originalCursorType = null; this._cursorStylesheet.remove(); } }, _getElementCenter: function(element) { var center = element.length ? kendo.getOffset(element) : null; if(center) { center.top += element.outerHeight() / 2; center.left += element.outerWidth() / 2; } return center; }, _isFloating: function(item) { return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display")); }, _cancel: function() { this.draggedElement.show(); this.placeholder.remove(); }, _items: function() { var filter = this.options.filter, items; if(filter) { items = this.element.find(filter); } else { items = this.element.children(); } return items; }, indexOf: function(element) { var items = this._items(), placeholder = this.placeholder, draggedElement = this.draggedElement; if(placeholder && element[0] == placeholder[0]) { return items.not(draggedElement).index(element); } else { return items.not(placeholder).index(element); } }, items: function() { var placeholder = this.placeholder, items = this._items(); if(placeholder) { items = items.not(placeholder); } return items; }, _isEmpty: function() { return !this.items().length; }, _isLastHidden: function() { return this.items().length === 1 && this.items().is(":hidden"); } }); kendo.ui.plugin(Sortable); })(window.kendo.jQuery); (function ($, undefined) { var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, abs = Math.abs, shift = Array.prototype.shift, ARIASELECTED = "aria-selected", SELECTED = "k-state-selected", ACTIVE = "k-state-selecting", SELECTABLE = "k-selectable", CHANGE = "change", NS = ".kendoSelectable", UNSELECTING = "k-state-unselecting", INPUTSELECTOR = "input,a,textarea,.k-multiselect-wrap,select,button,a.k-button>.k-icon,span.k-icon.k-i-expand,span.k-icon.k-i-collapse", msie = kendo.support.browser.msie, supportEventDelegation = false; (function($) { (function() { $('
    ') .on("click", ">*", function() { supportEventDelegation = true; }) .find("span") .click() .end() .off(); })(); })($); var Selectable = Widget.extend({ init: function(element, options) { var that = this, multiple; Widget.fn.init.call(that, element, options); that._marquee = $("
    "); that._lastActive = null; that.element.addClass(SELECTABLE); that.relatedTarget = that.options.relatedTarget; multiple = that.options.multiple; if (this.options.aria && multiple) { that.element.attr("aria-multiselectable", true); } that.userEvents = new kendo.UserEvents(that.element, { global: true, allowSelection: true, filter: (!supportEventDelegation ? "." + SELECTABLE + " " : "") + that.options.filter, tap: proxy(that._tap, that) }); if (multiple) { that.userEvents .bind("start", proxy(that._start, that)) .bind("move", proxy(that._move, that)) .bind("end", proxy(that._end, that)) .bind("select", proxy(that._select, that)); } }, events: [CHANGE], options: { name: "Selectable", filter: ">*", multiple: false, relatedTarget: $.noop }, _isElement: function(target) { var elements = this.element; var idx, length = elements.length, result = false; target = target[0]; for (idx = 0; idx < length; idx ++) { if (elements[idx] === target) { result = true; break; } } return result; }, _tap: function(e) { var target = $(e.target), that = this, ctrlKey = e.event.ctrlKey || e.event.metaKey, multiple = that.options.multiple, shiftKey = multiple && e.event.shiftKey, selected, whichCode = e.event.which, buttonCode = e.event.button; //in case of hierarchy or right-click if (!that._isElement(target.closest("." + SELECTABLE)) || whichCode && whichCode == 3 || buttonCode && buttonCode == 2) { return; } if (!this._allowSelection(e.event.target)) { return; } selected = target.hasClass(SELECTED); if (!multiple || !ctrlKey) { that.clear(); } target = target.add(that.relatedTarget(target)); if (shiftKey) { that.selectRange(that._firstSelectee(), target); } else { if (selected && ctrlKey) { that._unselect(target); that._notify(CHANGE); } else { that.value(target); } that._lastActive = that._downTarget = target; } }, _start: function(e) { var that = this, target = $(e.target), selected = target.hasClass(SELECTED), currentElement, ctrlKey = e.event.ctrlKey || e.event.metaKey; if (!this._allowSelection(e.event.target)) { return; } that._downTarget = target; //in case of hierarchy if (!that._isElement(target.closest("." + SELECTABLE))) { that.userEvents.cancel(); return; } if (that.options.useAllItems) { that._items = that.element.find(that.options.filter); } else { currentElement = target.closest(that.element); that._items = currentElement.find(that.options.filter); } e.sender.capture(); that._marquee .appendTo(document.body) .css({ left: e.x.client + 1, top: e.y.client + 1, width: 0, height: 0 }); if (!ctrlKey) { that.clear(); } target = target.add(that.relatedTarget(target)); if (selected) { that._selectElement(target, true); if (ctrlKey) { target.addClass(UNSELECTING); } } }, _move: function(e) { var that = this, position = { left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation, top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation, width: abs(e.x.initialDelta), height: abs(e.y.initialDelta) }; that._marquee.css(position); that._invalidateSelectables(position, (e.event.ctrlKey || e.event.metaKey)); e.preventDefault(); }, _end: function() { var that = this; that._marquee.remove(); that._unselect(that.element .find(that.options.filter + "." + UNSELECTING)) .removeClass(UNSELECTING); var target = that.element.find(that.options.filter + "." + ACTIVE); target = target.add(that.relatedTarget(target)); that.value(target); that._lastActive = that._downTarget; that._items = null; }, _invalidateSelectables: function(position, ctrlKey) { var idx, length, target = this._downTarget[0], items = this._items, related, toSelect; for (idx = 0, length = items.length; idx < length; idx ++) { toSelect = items.eq(idx); related = toSelect.add(this.relatedTarget(toSelect)); if (collision(toSelect, position)) { if(toSelect.hasClass(SELECTED)) { if(ctrlKey && target !== toSelect[0]) { related.removeClass(SELECTED).addClass(UNSELECTING); } } else if (!toSelect.hasClass(ACTIVE) && !toSelect.hasClass(UNSELECTING)) { related.addClass(ACTIVE); } } else { if (toSelect.hasClass(ACTIVE)) { related.removeClass(ACTIVE); } else if(ctrlKey && toSelect.hasClass(UNSELECTING)) { related.removeClass(UNSELECTING).addClass(SELECTED); } } } }, value: function(val) { var that = this, selectElement = proxy(that._selectElement, that); if(val) { val.each(function() { selectElement(this); }); that._notify(CHANGE); return; } return that.element.find(that.options.filter + "." + SELECTED); }, _firstSelectee: function() { var that = this, selected; if(that._lastActive !== null) { return that._lastActive; } selected = that.value(); return selected.length > 0 ? selected[0] : that.element.find(that.options.filter)[0]; }, _selectElement: function(element, preventNotify) { var toSelect = $(element), isPrevented = !preventNotify && this._notify("select", { element: element }); toSelect.removeClass(ACTIVE); if(!isPrevented) { toSelect.addClass(SELECTED); if (this.options.aria) { toSelect.attr(ARIASELECTED, true); } } }, _notify: function(name, args) { args = args || { }; return this.trigger(name, args); }, _unselect: function(element) { element.removeClass(SELECTED); if (this.options.aria) { element.attr(ARIASELECTED, false); } return element; }, _select: function(e) { if (this._allowSelection(e.event.target)) { if (!msie || (msie && !$(kendo._activeElement()).is(INPUTSELECTOR))) { e.preventDefault(); } } }, _allowSelection: function(target) { if ($(target).is(INPUTSELECTOR)) { this.userEvents.cancel(); this._downTarget = null; return false; } return true; }, resetTouchEvents: function() { this.userEvents.cancel(); }, clear: function() { var items = this.element.find(this.options.filter + "." + SELECTED); this._unselect(items); }, selectRange: function(start, end) { var that = this, idx, tmp, items; that.clear(); if (that.element.length > 1) { items = that.options.continuousItems(); } if (!items || !items.length) { items = that.element.find(that.options.filter); } start = $.inArray($(start)[0], items); end = $.inArray($(end)[0], items); if (start > end) { tmp = start; start = end; end = tmp; } if (!that.options.useAllItems) { end += that.element.length - 1; } for (idx = start; idx <= end; idx ++ ) { that._selectElement(items[idx]); } that._notify(CHANGE); }, destroy: function() { var that = this; Widget.fn.destroy.call(that); that.element.off(NS); that.userEvents.destroy(); that._marquee = that._lastActive = that.element = that.userEvents = null; } }); Selectable.parseOptions = function(selectable) { var asLowerString = typeof selectable === "string" && selectable.toLowerCase(); return { multiple: asLowerString && asLowerString.indexOf("multiple") > -1, cell: asLowerString && asLowerString.indexOf("cell") > -1 }; }; function collision(element, position) { if (!element.is(":visible")) { return false; } var elementPosition = kendo.getOffset(element), right = position.left + position.width, bottom = position.top + position.height; elementPosition.right = elementPosition.left + element.outerWidth(); elementPosition.bottom = elementPosition.top + element.outerHeight(); return !(elementPosition.left > right|| elementPosition.right < position.left || elementPosition.top > bottom || elementPosition.bottom < position.top); } kendo.ui.plugin(Selectable); })(window.kendo.jQuery); (function ($, undefined) { var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, keys = kendo.keys, CLICK = "click", KBUTTON = "k-button", KBUTTONICON = "k-button-icon", KBUTTONICONTEXT = "k-button-icontext", NS = ".kendoButton", DISABLED = "disabled", DISABLEDSTATE = "k-state-disabled", FOCUSEDSTATE = "k-state-focused", SELECTEDSTATE = "k-state-selected"; var Button = Widget.extend({ init: function(element, options) { var that = this; Widget.fn.init.call(that, element, options); element = that.wrapper = that.element; options = that.options; element.addClass(KBUTTON).attr("role", "button"); options.enable = options.enable && !element.attr(DISABLED); that.enable(options.enable); that._tabindex(); that._graphics(); element .on(CLICK + NS, proxy(that._click, that)) .on("focus" + NS, proxy(that._focus, that)) .on("blur" + NS, proxy(that._blur, that)) .on("keydown" + NS, proxy(that._keydown, that)) .on("keyup" + NS, proxy(that._keyup, that)); kendo.notify(that); }, destroy: function() { var that = this; that.wrapper.off(NS); Widget.fn.destroy.call(that); }, events: [ CLICK ], options: { name: "Button", icon: "", spriteCssClass: "", imageUrl: "", enable: true }, _isNativeButton: function() { return this.element.prop("tagName").toLowerCase() == "button"; }, _click: function(e) { if (this.options.enable) { if (this.trigger(CLICK, { event: e })) { e.preventDefault(); } } }, _focus: function() { if (this.options.enable) { this.element.addClass(FOCUSEDSTATE); } }, _blur: function() { this.element.removeClass(FOCUSEDSTATE); }, _keydown: function(e) { var that = this; if (!that._isNativeButton()) { if (e.keyCode == keys.ENTER || e.keyCode == keys.SPACEBAR) { if (e.keyCode == keys.SPACEBAR) { e.preventDefault(); if (that.options.enable) { that.element.addClass(SELECTEDSTATE); } } that._click(e); } } }, _keyup: function() { this.element.removeClass(SELECTEDSTATE); }, _graphics: function() { var that = this, element = that.element, options = that.options, icon = options.icon, spriteCssClass = options.spriteCssClass, imageUrl = options.imageUrl, span, img, isEmpty; if (spriteCssClass || imageUrl || icon) { isEmpty = true; element.contents().not("span.k-sprite").not("span.k-icon").not("img.k-image").each(function(idx, el){ if (el.nodeType == 1 || el.nodeType == 3 && $.trim(el.nodeValue).length > 0) { isEmpty = false; } }); if (isEmpty) { element.addClass(KBUTTONICON); } else { element.addClass(KBUTTONICONTEXT); } } if (icon) { span = element.children("span.k-icon").first(); if (!span[0]) { span = $('').prependTo(element); } span.addClass("k-i-" + icon); } else if (spriteCssClass) { span = element.children("span.k-sprite").first(); if (!span[0]) { span = $('').prependTo(element); } span.addClass(spriteCssClass); } else if (imageUrl) { img = element.children("img.k-image").first(); if (!img[0]) { img = $('icon').prependTo(element); } img.attr("src", imageUrl); } }, enable: function(enable) { var that = this, element = that.element; if (enable === undefined) { enable = true; } enable = !!enable; that.options.enable = enable; element.toggleClass(DISABLEDSTATE, !enable) .attr("aria-disabled", !enable) .attr(DISABLED, !enable); // prevent 'Unspecified error' in IE when inside iframe try { element.blur(); } catch (err) { } } }); kendo.ui.plugin(Button); })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, proxy = $.proxy, FIRST = ".k-i-seek-w", LAST = ".k-i-seek-e", PREV = ".k-i-arrow-w", NEXT = ".k-i-arrow-e", CHANGE = "change", NS = ".kendoPager", CLICK = "click", KEYDOWN = "keydown", DISABLED = "disabled", iconTemplate = kendo.template('#=text#'); function button(template, idx, text, numeric, title) { return template( { idx: idx, text: text, ns: kendo.ns, numeric: numeric, title: title || "" }); } function icon(className, text, wrapClassName) { return iconTemplate({ className: className.substring(1), text: text, wrapClassName: wrapClassName || "" }); } function update(element, selector, page, disabled) { element.find(selector) .parent() .attr(kendo.attr("page"), page) .attr("tabindex", -1) .toggleClass("k-state-disabled", disabled); } function first(element, page) { update(element, FIRST, 1, page <= 1); } function prev(element, page) { update(element, PREV, Math.max(1, page - 1), page <= 1); } function next(element, page, totalPages) { update(element, NEXT, Math.min(totalPages, page + 1), page >= totalPages); } function last(element, page, totalPages) { update(element, LAST, totalPages, page >= totalPages); } var Pager = Widget.extend( { init: function(element, options) { var that = this, page, totalPages; Widget.fn.init.call(that, element, options); options = that.options; that.dataSource = kendo.data.DataSource.create(options.dataSource); that.linkTemplate = kendo.template(that.options.linkTemplate); that.selectTemplate = kendo.template(that.options.selectTemplate); page = that.page(); totalPages = that.totalPages(); that._refreshHandler = proxy(that.refresh, that); that.dataSource.bind(CHANGE, that._refreshHandler); if (options.previousNext) { if (!that.element.find(FIRST).length) { that.element.append(icon(FIRST, options.messages.first, "k-pager-first")); first(that.element, page, totalPages); } if (!that.element.find(PREV).length) { that.element.append(icon(PREV, options.messages.previous)); prev(that.element, page, totalPages); } } if (options.numeric) { that.list = that.element.find(".k-pager-numbers"); if (!that.list.length) { that.list = $('
      ').appendTo(that.element); } } if (options.input) { if (!that.element.find(".k-pager-input").length) { that.element.append(''+ options.messages.page + '' + kendo.format(options.messages.of, totalPages) + ''); } that.element.on(KEYDOWN + NS, ".k-pager-input input", proxy(that._keydown, that)); } if (options.previousNext) { if (!that.element.find(NEXT).length) { that.element.append(icon(NEXT, options.messages.next)); next(that.element, page, totalPages); } if (!that.element.find(LAST).length) { that.element.append(icon(LAST, options.messages.last, "k-pager-last")); last(that.element, page, totalPages); } } if (options.pageSizes){ if (!that.element.find(".k-pager-sizes").length){ $('' + kendo.format(options.messages.of, totalPages)) .find("input") .val(page) .attr(DISABLED, total < 1) .toggleClass("k-state-disabled", total < 1); } if (options.previousNext) { first(that.element, page, totalPages); prev(that.element, page, totalPages); next(that.element, page, totalPages); last(that.element, page, totalPages); } if (options.pageSizes) { that.element .find(".k-pager-sizes select") .val(pageSize) .filter("[" + kendo.attr("role") + "=dropdownlist]") .kendoDropDownList("value", pageSize) .kendoDropDownList("text", pageSize); // handles custom values } }, _keydown: function(e) { if (e.keyCode === kendo.keys.ENTER) { var input = this.element.find(".k-pager-input").find("input"), page = parseInt(input.val(), 10); if (isNaN(page) || page < 1 || page > this.totalPages()) { page = this.page(); } input.val(page); this.page(page); } }, _refreshClick: function(e) { e.preventDefault(); this.dataSource.read(); }, _change: function(e) { var pageSize = parseInt(e.currentTarget.value, 10); if (!isNaN(pageSize)){ this.dataSource.pageSize(pageSize); } }, _click: function(e) { var target = $(e.currentTarget); e.preventDefault(); if (!target.is(".k-state-disabled")) { this.page(target.attr(kendo.attr("page"))); } }, totalPages: function() { return Math.ceil((this.dataSource.total() || 0) / this.pageSize()); }, pageSize: function() { return this.dataSource.pageSize() || this.dataSource.total(); }, page: function(page) { if (page !== undefined) { this.dataSource.page(page); this.trigger(CHANGE, { index: page }); } else { if (this.dataSource.total() > 0) { return this.dataSource.page(); } else { return 0; } } } }); ui.plugin(Pager); })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, support = kendo.support, getOffset = kendo.getOffset, activeElement = kendo._activeElement, OPEN = "open", CLOSE = "close", DEACTIVATE = "deactivate", ACTIVATE = "activate", CENTER = "center", LEFT = "left", RIGHT = "right", TOP = "top", BOTTOM = "bottom", ABSOLUTE = "absolute", HIDDEN = "hidden", BODY = "body", LOCATION = "location", POSITION = "position", VISIBLE = "visible", EFFECTS = "effects", ACTIVE = "k-state-active", ACTIVEBORDER = "k-state-border", ACTIVEBORDERREGEXP = /k-state-border-(\w+)/, ACTIVECHILDREN = ".k-picker-wrap, .k-dropdown-wrap, .k-link", MOUSEDOWN = "down", DOCUMENT_ELEMENT = $(document.documentElement), WINDOW = $(window), SCROLL = "scroll", RESIZE_SCROLL = "resize scroll", cssPrefix = support.transitions.css, TRANSFORM = cssPrefix + "transform", extend = $.extend, NS = ".kendoPopup", styles = ["font-size", "font-family", "font-stretch", "font-style", "font-weight", "line-height"]; function contains(container, target) { return container === target || $.contains(container, target); } var Popup = Widget.extend({ init: function(element, options) { var that = this, parentPopup; options = options || {}; if (options.isRtl) { options.origin = options.origin || BOTTOM + " " + RIGHT; options.position = options.position || TOP + " " + RIGHT; } Widget.fn.init.call(that, element, options); element = that.element; options = that.options; that.collisions = options.collision ? options.collision.split(" ") : []; that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid()); if (that.collisions.length === 1) { that.collisions.push(that.collisions[0]); } parentPopup = $(that.options.anchor).closest(".k-popup,.k-group").filter(":not([class^=km-])"); // When popup is in another popup, make it relative. options.appendTo = $($(options.appendTo)[0] || parentPopup[0] || BODY); that.element.hide() .addClass("k-popup k-group k-reset") .toggleClass("k-rtl", !!options.isRtl) .css({ position : ABSOLUTE }) .appendTo(options.appendTo) .on("mouseenter" + NS, function() { that._hovered = true; }) .on("mouseleave" + NS, function() { that._hovered = false; }); that.wrapper = $(); if (options.animation === false) { options.animation = { open: { effects: {} }, close: { hide: true, effects: {} } }; } extend(options.animation.open, { complete: function() { that.wrapper.css({ overflow: VISIBLE }); // Forcing refresh causes flickering in mobile. that._activated = true; that._trigger(ACTIVATE); } }); extend(options.animation.close, { complete: function() { that._animationClose(); } }); that._mousedownProxy = function(e) { that._mousedown(e); }; that._resizeProxy = function(e) { that._resize(e); }; if (options.toggleTarget) { $(options.toggleTarget).on(options.toggleEvent + NS, $.proxy(that.toggle, that)); } }, events: [ OPEN, ACTIVATE, CLOSE, DEACTIVATE ], options: { name: "Popup", toggleEvent: "click", origin: BOTTOM + " " + LEFT, position: TOP + " " + LEFT, anchor: BODY, appendTo: null, collision: "flip fit", viewport: window, copyAnchorStyles: true, autosize: false, modal: false, adjustSize: { width: 0, height: 0 }, animation: { open: { effects: "slideIn:down", transition: true, duration: 200 }, close: { // if close animation effects are defined, they will be used instead of open.reverse duration: 100, hide: true } } }, _animationClose: function() { var that = this, options = that.options; that.wrapper.hide(); var location = that.wrapper.data(LOCATION), anchor = $(options.anchor), direction, dirClass; if (location) { that.wrapper.css(location); } if (options.anchor != BODY) { direction = ((anchor.attr("class") || "").match(ACTIVEBORDERREGEXP) || ["", "down"])[1]; dirClass = ACTIVEBORDER + "-" + direction; anchor .removeClass(dirClass) .children(ACTIVECHILDREN) .removeClass(ACTIVE) .removeClass(dirClass); that.element.removeClass(ACTIVEBORDER + "-" + kendo.directions[direction].reverse); } that._closing = false; that._trigger(DEACTIVATE); }, destroy: function() { var that = this, options = that.options, element = that.element.off(NS), parent; Widget.fn.destroy.call(that); if (options.toggleTarget) { $(options.toggleTarget).off(NS); } if (!options.modal) { DOCUMENT_ELEMENT.unbind(that.downEvent, that._mousedownProxy); that._scrollableParents().unbind(SCROLL, that._resizeProxy); WINDOW.unbind(RESIZE_SCROLL, that._resizeProxy); } kendo.destroy(that.element.children()); element.removeData(); if (options.appendTo[0] === document.body) { parent = element.parent(".k-animation-container"); if (parent[0]) { parent.remove(); } else { element.remove(); } } }, open: function(x, y) { var that = this, fixed = { isFixed: !isNaN(parseInt(y,10)), x: x, y: y }, element = that.element, options = that.options, direction = "down", animation, wrapper, anchor = $(options.anchor), mobile = element[0] && element.hasClass("km-widget"); if (!that.visible()) { if (options.copyAnchorStyles) { if (mobile && styles[0] == "font-size") { styles.shift(); } element.css(kendo.getComputedStyles(anchor[0], styles)); } if (element.data("animating") || that._trigger(OPEN)) { return; } that._activated = false; if (!options.modal) { DOCUMENT_ELEMENT.unbind(that.downEvent, that._mousedownProxy) .bind(that.downEvent, that._mousedownProxy); // this binding hangs iOS in editor if (!(support.mobileOS.ios || support.mobileOS.android)) { // all elements in IE7/8 fire resize event, causing mayhem that._scrollableParents() .unbind(SCROLL, that._resizeProxy) .bind(SCROLL, that._resizeProxy); WINDOW.unbind(RESIZE_SCROLL, that._resizeProxy) .bind(RESIZE_SCROLL, that._resizeProxy); } } that.wrapper = wrapper = kendo.wrap(element, options.autosize) .css({ overflow: HIDDEN, display: "block", position: ABSOLUTE }); if (support.mobileOS.android) { wrapper.css(TRANSFORM, "translatez(0)"); // Android is VERY slow otherwise. Should be tested in other droids as well since it may cause blur. } wrapper.css(POSITION); if ($(options.appendTo)[0] == document.body) { wrapper.css(TOP, "-10000px"); } animation = extend(true, {}, options.animation.open); that.flipped = that._position(fixed); animation.effects = kendo.parseEffects(animation.effects, that.flipped); direction = animation.effects.slideIn ? animation.effects.slideIn.direction : direction; if (options.anchor != BODY) { var dirClass = ACTIVEBORDER + "-" + direction; element.addClass(ACTIVEBORDER + "-" + kendo.directions[direction].reverse); anchor .addClass(dirClass) .children(ACTIVECHILDREN) .addClass(ACTIVE) .addClass(dirClass); } element.data(EFFECTS, animation.effects) .kendoStop(true) .kendoAnimate(animation); } }, toggle: function() { var that = this; that[that.visible() ? CLOSE : OPEN](); }, visible: function() { return this.element.is(":" + VISIBLE); }, close: function(skipEffects) { var that = this, options = that.options, wrap, animation, openEffects, closeEffects; if (that.visible()) { wrap = (that.wrapper[0] ? that.wrapper : kendo.wrap(that.element).hide()); if (that._closing || that._trigger(CLOSE)) { return; } // Close all inclusive popups. that.element.find(".k-popup").each(function () { var that = $(this), popup = that.data("kendoPopup"); if (popup) { popup.close(skipEffects); } }); DOCUMENT_ELEMENT.unbind(that.downEvent, that._mousedownProxy); that._scrollableParents().unbind(SCROLL, that._resizeProxy); WINDOW.unbind(RESIZE_SCROLL, that._resizeProxy); if (skipEffects) { animation = { hide: true, effects: {} }; } else { animation = extend(true, {}, options.animation.close); openEffects = that.element.data(EFFECTS); closeEffects = animation.effects; if (!closeEffects && !kendo.size(closeEffects) && openEffects && kendo.size(openEffects)) { animation.effects = openEffects; animation.reverse = true; } that._closing = true; } that.element.kendoStop(true); wrap.css({ overflow: HIDDEN }); // stop callback will remove hidden overflow that.element.kendoAnimate(animation); } }, _trigger: function(ev) { return this.trigger(ev, { type: ev }); }, _resize: function(e) { var that = this; if (e.type === "resize") { clearTimeout(that._resizeTimeout); that._resizeTimeout = setTimeout(function() { that._position(); that._resizeTimeout = null; }, 50); } else { if (!that._hovered || (that._activated && that.element.hasClass("k-list-container"))) { that.close(); } } }, _mousedown: function(e) { var that = this, container = that.element[0], options = that.options, anchor = $(options.anchor)[0], toggleTarget = options.toggleTarget, target = kendo.eventTarget(e), popup = $(target).closest(".k-popup"), mobile = popup.parent().parent(".km-shim").length; popup = popup[0]; if (!mobile && popup && popup !== that.element[0]){ return; } // This MAY result in popup not closing in certain cases. if ($(e.target).closest("a").data("rel") === "popover") { return; } if (!contains(container, target) && !contains(anchor, target) && !(toggleTarget && contains($(toggleTarget)[0], target))) { that.close(); } }, _fit: function(position, size, viewPortSize) { var output = 0; if (position + size > viewPortSize) { output = viewPortSize - (position + size); } if (position < 0) { output = -position; } return output; }, _flip: function(offset, size, anchorSize, viewPortSize, origin, position, boxSize) { var output = 0; boxSize = boxSize || size; if (position !== origin && position !== CENTER && origin !== CENTER) { if (offset + boxSize > viewPortSize) { output += -(anchorSize + size); } if (offset + output < 0) { output += anchorSize + size; } } return output; }, _scrollableParents: function() { return $(this.options.anchor) .parentsUntil("body") .filter(function(index, element) { var computedStyle = kendo.getComputedStyles(element, ["overflow"]); return computedStyle.overflow != "visible"; }); }, _position: function(fixed) { var that = this, element = that.element.css(POSITION, ""), wrapper = that.wrapper, options = that.options, viewport = $(options.viewport), viewportOffset = viewport.offset(), anchor = $(options.anchor), origins = options.origin.toLowerCase().split(" "), positions = options.position.toLowerCase().split(" "), collisions = that.collisions, zoomLevel = support.zoomLevel(), siblingContainer, parents, parentZIndex, zIndex = 10002, isWindow = !!((viewport[0] == window) && window.innerWidth && (zoomLevel <= 1.02)), idx = 0, length, viewportWidth, viewportHeight; // $(window).height() uses documentElement to get the height viewportWidth = isWindow ? window.innerWidth : viewport.width(); viewportHeight = isWindow ? window.innerHeight : viewport.height(); siblingContainer = anchor.parents().filter(wrapper.siblings()); if (siblingContainer[0]) { parentZIndex = Math.max(Number(siblingContainer.css("zIndex")), 0); // set z-index to be more than that of the container/sibling // compensate with more units for window z-stack if (parentZIndex) { zIndex = parentZIndex + 10; } else { parents = anchor.parentsUntil(siblingContainer); for (length = parents.length; idx < length; idx++) { parentZIndex = Number($(parents[idx]).css("zIndex")); if (parentZIndex && zIndex < parentZIndex) { zIndex = parentZIndex + 10; } } } } wrapper.css("zIndex", zIndex); if (fixed && fixed.isFixed) { wrapper.css({ left: fixed.x, top: fixed.y }); } else { wrapper.css(that._align(origins, positions)); } var pos = getOffset(wrapper, POSITION, anchor[0] === wrapper.offsetParent()[0]), offset = getOffset(wrapper), anchorParent = anchor.offsetParent().parent(".k-animation-container,.k-popup,.k-group"); // If the parent is positioned, get the current positions if (anchorParent.length) { pos = getOffset(wrapper, POSITION, true); offset = getOffset(wrapper); } if (viewport[0] === window) { offset.top -= (window.pageYOffset || document.documentElement.scrollTop || 0); offset.left -= (window.pageXOffset || document.documentElement.scrollLeft || 0); } else { offset.top -= viewportOffset.top; offset.left -= viewportOffset.left; } if (!that.wrapper.data(LOCATION)) { // Needed to reset the popup location after every closure - fixes the resize bugs. wrapper.data(LOCATION, extend({}, pos)); } var offsets = extend({}, offset), location = extend({}, pos), adjustSize = options.adjustSize; if (collisions[0] === "fit") { location.top += that._fit(offsets.top, wrapper.outerHeight() + adjustSize.height, viewportHeight / zoomLevel); } if (collisions[1] === "fit") { location.left += that._fit(offsets.left, wrapper.outerWidth() + adjustSize.width, viewportWidth / zoomLevel); } var flipPos = extend({}, location); if (collisions[0] === "flip") { location.top += that._flip(offsets.top, element.outerHeight(), anchor.outerHeight(), viewportHeight / zoomLevel, origins[0], positions[0], wrapper.outerHeight()); } if (collisions[1] === "flip") { location.left += that._flip(offsets.left, element.outerWidth(), anchor.outerWidth(), viewportWidth / zoomLevel, origins[1], positions[1], wrapper.outerWidth()); } element.css(POSITION, ABSOLUTE); wrapper.css(location); return (location.left != flipPos.left || location.top != flipPos.top); }, _align: function(origin, position) { var that = this, element = that.wrapper, anchor = $(that.options.anchor), verticalOrigin = origin[0], horizontalOrigin = origin[1], verticalPosition = position[0], horizontalPosition = position[1], anchorOffset = getOffset(anchor), appendTo = $(that.options.appendTo), appendToOffset, width = element.outerWidth(), height = element.outerHeight(), anchorWidth = anchor.outerWidth(), anchorHeight = anchor.outerHeight(), top = anchorOffset.top, left = anchorOffset.left, round = Math.round; if (appendTo[0] != document.body) { appendToOffset = getOffset(appendTo); top -= appendToOffset.top; left -= appendToOffset.left; } if (verticalOrigin === BOTTOM) { top += anchorHeight; } if (verticalOrigin === CENTER) { top += round(anchorHeight / 2); } if (verticalPosition === BOTTOM) { top -= height; } if (verticalPosition === CENTER) { top -= round(height / 2); } if (horizontalOrigin === RIGHT) { left += anchorWidth; } if (horizontalOrigin === CENTER) { left += round(anchorWidth / 2); } if (horizontalPosition === RIGHT) { left -= width; } if (horizontalPosition === CENTER) { left -= round(width / 2); } return { top: top, left: left }; } }); ui.plugin(Popup); })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, extend = $.extend, setTimeout = window.setTimeout, CLICK = "click", SHOW = "show", HIDE = "hide", KNOTIFICATION = "k-notification", KICLOSE = ".k-notification-wrap .k-i-close", INFO = "info", SUCCESS = "success", WARNING = "warning", ERROR = "error", TOP = "top", LEFT = "left", BOTTOM = "bottom", RIGHT = "right", UP = "up", NS = ".kendoNotification", WRAPPER = '
      ', TEMPLATE = '
      ' + '#=typeIcon#' + '#=content#' + 'Hide' + '
      '; var Notification = Widget.extend({ init: function(element, options) { var that = this; Widget.fn.init.call(that, element, options); options = that.options; if (!options.appendTo || !$(options.appendTo).is(element)) { that.element.hide(); } that._compileTemplates(options.templates); that._guid = "_" + kendo.guid(); that._isRtl = kendo.support.isRtl(element); that._compileStacking(options.stacking, options.position.top); kendo.notify(that); }, events: [ SHOW, HIDE ], options: { name: "Notification", position: { pinned: true, top: null, left: null, bottom: 20, right: 20 }, stacking: "default", hideOnClick: true, button: false, allowHideAfter: 0, autoHideAfter: 5000, appendTo: null, width: null, height: null, templates: [], animation: { open: { effects: "fade:in", duration: 300 }, close: { effects: "fade:out", duration: 600, hide: true } } }, _compileTemplates: function(templates) { var that = this; var kendoTemplate = kendo.template; that._compiled = {}; $.each(templates, function(key, value) { that._compiled[value.type] = kendoTemplate(value.template || $("#" + value.templateId).html()); }); that._defaultCompiled = kendoTemplate(TEMPLATE); }, _getCompiled: function(type) { var that = this; var defaultCompiled = that._defaultCompiled; return type ? that._compiled[type] || defaultCompiled : defaultCompiled; }, _compileStacking: function(stacking, top) { var that = this, paddings = { paddingTop: 0, paddingRight: 0, paddingBottom: 0, paddingLeft: 0 }, origin, position; switch (stacking) { case "down": origin = BOTTOM + " " + LEFT; position = TOP + " " + LEFT; delete paddings.paddingBottom; break; case RIGHT: origin = TOP + " " + RIGHT; position = TOP + " " + LEFT; delete paddings.paddingRight; break; case LEFT: origin = TOP + " " + LEFT; position = TOP + " " + RIGHT; delete paddings.paddingLeft; break; case UP: origin = TOP + " " + LEFT; position = BOTTOM + " " + LEFT; delete paddings.paddingTop; break; default: if (top !== null) { origin = BOTTOM + " " + LEFT; position = TOP + " " + LEFT; delete paddings.paddingBottom; } else { origin = TOP + " " + LEFT; position = BOTTOM + " " + LEFT; delete paddings.paddingTop; } break; } that._popupOrigin = origin; that._popupPosition = position; that._popupPaddings = paddings; }, _attachPopupEvents: function(options, popup) { var that = this, allowHideAfter = options.allowHideAfter, attachDelay = !isNaN(allowHideAfter) && allowHideAfter > 0, closeIcon; function attachClick(target) { target.on(CLICK + NS, function() { popup.close(); }); } if (options.hideOnClick) { popup.bind("activate", function(e) { if (attachDelay) { setTimeout(function(){ attachClick(popup.element); }, allowHideAfter); } else { attachClick(popup.element); } }); } else if (options.button) { closeIcon = popup.element.find(KICLOSE); if (attachDelay) { setTimeout(function(){ attachClick(closeIcon); }, allowHideAfter); } else { attachClick(closeIcon); } } }, _showPopup: function(wrapper, options) { var that = this, autoHideAfter = options.autoHideAfter, x = options.position.left, y = options.position.top, allowHideAfter = options.allowHideAfter, popup, openPopup, attachClick, closeIcon; openPopup = $("." + that._guid).last(); popup = new kendo.ui.Popup(wrapper, { anchor: openPopup[0] ? openPopup : document.body, origin: that._popupOrigin, position: that._popupPosition, animation: options.animation, modal: true, collision: "", isRtl: that._isRtl, close: function(e) { that._triggerHide(this.element); }, deactivate: function(e) { e.sender.element.off(NS); e.sender.element.find(KICLOSE).off(NS); e.sender.destroy(); } }); that._attachPopupEvents(options, popup); if (openPopup[0]) { popup.open(); } else { if (x === null) { x = $(window).width() - wrapper.width() - options.position.right; } if (y === null) { y = $(window).height() - wrapper.height() - options.position.bottom; } popup.open(x, y); } popup.wrapper.addClass(that._guid).css(extend({margin:0}, that._popupPaddings)); if (options.position.pinned) { popup.wrapper.css("position", "fixed"); if (openPopup[0]) { that._togglePin(popup.wrapper, true); } } else if (!openPopup[0]) { that._togglePin(popup.wrapper, false); } if (autoHideAfter > 0) { setTimeout(function(){ popup.close(); }, autoHideAfter); } }, _togglePin: function(wrapper, pin) { var win = $(window), sign = pin ? -1 : 1; wrapper.css({ top: parseInt(wrapper.css(TOP), 10) + sign * win.scrollTop(), left: parseInt(wrapper.css(LEFT), 10) + sign * win.scrollLeft() }); }, _attachStaticEvents: function(options, wrapper) { var that = this, allowHideAfter = options.allowHideAfter, attachDelay = !isNaN(allowHideAfter) && allowHideAfter > 0; function attachClick(target) { target.on(CLICK + NS, proxy(that._hideStatic, that, wrapper)); } if (options.hideOnClick) { if (attachDelay) { setTimeout(function(){ attachClick(wrapper); }, allowHideAfter); } else { attachClick(wrapper); } } else if (options.button) { if (attachDelay) { setTimeout(function(){ attachClick(wrapper.find(KICLOSE)); }, allowHideAfter); } else { attachClick(wrapper.find(KICLOSE)); } } }, _showStatic: function(wrapper, options) { var that = this, autoHideAfter = options.autoHideAfter, animation = options.animation, insertionMethod = options.stacking == UP || options.stacking == LEFT ? "prependTo" : "appendTo", attachClick; wrapper .addClass(that._guid) [insertionMethod](options.appendTo) .hide() .kendoAnimate(animation.open || false); that._attachStaticEvents(options, wrapper); if (autoHideAfter > 0) { setTimeout(function(){ that._hideStatic(wrapper); }, autoHideAfter); } }, _hideStatic: function(wrapper) { wrapper.kendoAnimate(extend(this.options.animation.close || false, { complete: function() { wrapper.off(NS).find(KICLOSE).off(NS); wrapper.remove(); }})); this._triggerHide(wrapper); }, _triggerHide: function(element) { this.trigger(HIDE, { element: element }); this.angular("cleanup", function(){ return { elements: element }; }); }, show: function(content, type) { var that = this, options = that.options, wrapper = $(WRAPPER), args, defaultArgs, popup; if (!type) { type = INFO; } if (content !== null && content !== undefined && content !== "") { if (kendo.isFunction(content)) { content = content(); } defaultArgs = {typeIcon: type, content: ""}; if ($.isPlainObject(content)) { args = extend(defaultArgs, content); } else { args = extend(defaultArgs, {content: content}); } wrapper .addClass(KNOTIFICATION + "-" + type) .toggleClass(KNOTIFICATION + "-button", options.button) .attr("data-role", "alert") .css({width: options.width, height: options.height}) .append(that._getCompiled(type)(args)); that.angular("compile", function(){ return { elements: wrapper, data: [{ dataItem: args }] }; }); if ($(options.appendTo)[0]) { that._showStatic(wrapper, options); } else { that._showPopup(wrapper, options); } that.trigger(SHOW, {element: wrapper}); } return that; }, info: function(content) { return this.show(content, INFO); }, success: function(content) { return this.show(content, SUCCESS); }, warning: function(content) { return this.show(content, WARNING); }, error: function(content) { return this.show(content, ERROR); }, hide: function() { var that = this, openedNotifications = that.getNotifications(); if (that.options.appendTo) { openedNotifications.each(function(idx, element){ that._hideStatic($(element)); }); } else { openedNotifications.each(function(idx, element){ var popup = $(element).data("kendoPopup"); if (popup) { popup.close(); } }); } return that; }, getNotifications: function() { var that = this, guidElements = $("." + that._guid); if (that.options.appendTo) { return guidElements; } else { return guidElements.children("." + KNOTIFICATION); } }, setOptions: function(newOptions) { var that = this, options; Widget.fn.setOptions.call(that, newOptions); options = that.options; if (newOptions.templates !== undefined) { that._compileTemplates(options.templates); } if (newOptions.stacking !== undefined || newOptions.position !== undefined) { that._compileStacking(options.stacking, options.position.top); } }, destroy: function() { Widget.fn.destroy.call(this); this.getNotifications().off(NS).find(KICLOSE).off(NS); } }); kendo.ui.plugin(Notification); })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, Widget = kendo.ui.Widget, Popup = kendo.ui.Popup, isFunction = kendo.isFunction, isPlainObject = $.isPlainObject, extend = $.extend, proxy = $.proxy, DOCUMENT = $(document), isLocalUrl = kendo.isLocalUrl, ARIAIDSUFFIX = "_tt_active", DESCRIBEDBY = "aria-describedby", SHOW = "show", HIDE = "hide", ERROR = "error", CONTENTLOAD = "contentLoad", REQUESTSTART = "requestStart", KCONTENTFRAME = "k-content-frame", TEMPLATE = '', IFRAMETEMPLATE = kendo.template( ""), NS = ".kendoTooltip", POSITIONS = { bottom: { origin: "bottom center", position: "top center" }, top: { origin: "top center", position: "bottom center" }, left: { origin: "center left", position: "center right", collision: "fit flip" }, right: { origin: "center right", position: "center left", collision: "fit flip" }, center: { position: "center center", origin: "center center" } }, REVERSE = { "top": "bottom", "bottom": "top", "left": "right", "right": "left", "center": "center" }, DIRCLASSES = { bottom: "n", top: "s", left: "e", right: "w", center: "n" }, DIMENSIONS = { "horizontal": { offset: "top", size: "outerHeight" }, "vertical": { offset: "left", size: "outerWidth" } }, DEFAULTCONTENT = function(e) { return e.target.data(kendo.ns + "title"); }; function restoreTitle(element) { while(element.length) { restoreTitleAttributeForElement(element); element = element.parent(); } } function restoreTitleAttributeForElement(element) { var title = element.data(kendo.ns + "title"); if (title) { element.attr("title", title); element.removeData(kendo.ns + "title"); } } function saveTitleAttributeForElement(element) { var title = element.attr("title"); if (title) { element.data(kendo.ns + "title", title); element.attr("title", ""); } } function saveTitleAttributes(element) { while(element.length && !element.is("body")) { saveTitleAttributeForElement(element); element = element.parent(); } } var Tooltip = Widget.extend({ init: function(element, options) { var that = this, axis; Widget.fn.init.call(that, element, options); axis = that.options.position.match(/left|right/) ? "horizontal" : "vertical"; that.dimensions = DIMENSIONS[axis]; that._documentKeyDownHandler = proxy(that._documentKeyDown, that); that.element .on(that.options.showOn + NS, that.options.filter, proxy(that._showOn, that)) .on("mouseenter" + NS, that.options.filter, proxy(that._mouseenter, that)); if (this.options.autoHide) { that.element.on("mouseleave" + NS, that.options.filter, proxy(that._mouseleave, that)); } }, options: { name: "Tooltip", filter: "", content: DEFAULTCONTENT, showAfter: 100, callout: true, position: "bottom", showOn: "mouseenter", autoHide: true, width: null, height: null, animation: { open: { effects: "fade:in", duration: 0 }, close: { effects: "fade:out", duration: 40, hide: true } } }, events: [ SHOW, HIDE, CONTENTLOAD, ERROR, REQUESTSTART ], _mouseenter: function(e) { saveTitleAttributes($(e.currentTarget)); }, _showOn: function(e) { var that = this; var currentTarget = $(e.currentTarget); if (that.options.showOn && that.options.showOn.match(/click|focus/)) { that._show(currentTarget); } else { clearTimeout(that.timeout); that.timeout = setTimeout(function() { that._show(currentTarget); }, that.options.showAfter); } }, _appendContent: function(target) { var that = this, contentOptions = that.options.content, element = that.content, showIframe = that.options.iframe, iframe; if (isPlainObject(contentOptions) && contentOptions.url) { if (!("iframe" in that.options)) { showIframe = !isLocalUrl(contentOptions.url); } that.trigger(REQUESTSTART, { options: contentOptions, target: target }); if (!showIframe) { element.empty(); kendo.ui.progress(element, true); // perform AJAX request that._ajaxRequest(contentOptions); } else { element.hide(); iframe = element.find("." + KCONTENTFRAME)[0]; if (iframe) { // refresh existing iframe iframe.src = contentOptions.url || iframe.src; } else { element.html(IFRAMETEMPLATE({ content: contentOptions })); } element.find("." + KCONTENTFRAME) .off("load" + NS) .on("load" + NS, function(){ that.trigger(CONTENTLOAD); element.show(); }); } } else if (contentOptions && isFunction(contentOptions)) { contentOptions = contentOptions({ sender: this, target: target }); element.html(contentOptions || ""); } else { element.html(contentOptions); } that.angular("compile", function(){ return { elements: element }; }); }, _ajaxRequest: function(options) { var that = this; jQuery.ajax(extend({ type: "GET", dataType: "html", cache: false, error: function (xhr, status) { kendo.ui.progress(that.content, false); that.trigger(ERROR, { status: status, xhr: xhr }); }, success: proxy(function (data) { kendo.ui.progress(that.content, false); that.content.html(data); that.trigger(CONTENTLOAD); }, that) }, options)); }, _documentKeyDown: function(e) { if (e.keyCode === kendo.keys.ESC) { this.hide(); } }, refresh: function() { var that = this, popup = that.popup; if (popup && popup.options.anchor) { that._appendContent(popup.options.anchor); } }, hide: function() { if (this.popup) { this.popup.close(); } }, show: function(target) { target = target || this.element; saveTitleAttributes(target); this._show(target); }, _show: function(target) { var that = this, current = that.target(); if (!that.popup) { that._initPopup(); } if (current && current[0] != target[0]) { that.popup.close(); that.popup.element.kendoStop(true, true);// animation can be too long to hide the element before it is shown again } if (!current || current[0] != target[0]) { that._appendContent(target); that.popup.options.anchor = target; } that.popup.one("deactivate", function() { restoreTitle(target); target.removeAttr(DESCRIBEDBY); this.element .removeAttr("id") .attr("aria-hidden", true); DOCUMENT.off("keydown" + NS, that._documentKeyDownHandler); }); that.popup.open(); }, _initPopup: function() { var that = this, options = that.options, wrapper = $(kendo.template(TEMPLATE)({ callout: options.callout && options.position !== "center", dir: DIRCLASSES[options.position], autoHide: options.autoHide })); that.popup = new Popup(wrapper, extend({ activate: function() { var anchor = this.options.anchor, ariaId = anchor[0].id || that.element[0].id; if (ariaId) { anchor.attr(DESCRIBEDBY, ariaId + ARIAIDSUFFIX); this.element.attr("id", ariaId + ARIAIDSUFFIX); } if (options.callout) { that._positionCallout(); } this.element.removeAttr("aria-hidden"); DOCUMENT.on("keydown" + NS, that._documentKeyDownHandler); that.trigger(SHOW); }, close: function() { that.trigger(HIDE); }, copyAnchorStyles: false, animation: options.animation }, POSITIONS[options.position])); wrapper.css({ width: options.width, height: options.height }); that.content = wrapper.find(".k-tooltip-content"); that.arrow = wrapper.find(".k-callout"); if (options.autoHide) { wrapper.on("mouseleave" + NS, proxy(that._mouseleave, that)); } else { wrapper.on("click" + NS, ".k-tooltip-button", proxy(that._closeButtonClick, that)); } }, _closeButtonClick: function(e) { e.preventDefault(); this.hide(); }, _mouseleave: function(e) { if (this.popup) { var element = $(e.currentTarget), offset = element.offset(), pageX = e.pageX, pageY = e.pageY; offset.right = offset.left + element.outerWidth(); offset.bottom = offset.top + element.outerHeight(); if (pageX > offset.left && pageX < offset.right && pageY > offset.top && pageY < offset.bottom) { return; } this.popup.close(); } else { restoreTitle($(e.currentTarget)); } clearTimeout(this.timeout); }, _positionCallout: function() { var that = this, position = that.options.position, dimensions = that.dimensions, offset = dimensions.offset, popup = that.popup, anchor = popup.options.anchor, anchorOffset = $(anchor).offset(), arrowBorder = parseInt(that.arrow.css("border-top-width"), 10), elementOffset = $(popup.element).offset(), cssClass = DIRCLASSES[popup.flipped ? REVERSE[position] : position], offsetAmount = anchorOffset[offset] - elementOffset[offset] + ($(anchor)[dimensions.size]() / 2) - arrowBorder; that.arrow .removeClass("k-callout-n k-callout-s k-callout-w k-callout-e") .addClass("k-callout-" + cssClass) .css(offset, offsetAmount); }, target: function() { if (this.popup) { return this.popup.options.anchor; } return null; }, destroy: function() { var popup = this.popup; if (popup) { popup.element.off(NS); popup.destroy(); } this.element.off(NS); DOCUMENT.off("keydown" + NS, this._documentKeyDownHandler); Widget.fn.destroy.call(this); } }); kendo.ui.plugin(Tooltip); })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, keys = kendo.keys, support = kendo.support, htmlEncode = kendo.htmlEncode, activeElement = kendo._activeElement, ID = "id", LI = "li", CHANGE = "change", CHARACTER = "character", FOCUSED = "k-state-focused", HOVER = "k-state-hover", LOADING = "k-loading", OPEN = "open", CLOSE = "close", SELECT = "select", SELECTED = "selected", PROGRESS = "progress", REQUESTEND = "requestEnd", WIDTH = "width", extend = $.extend, proxy = $.proxy, browser = support.browser, isIE8 = browser.msie && browser.version < 9, quotRegExp = /"/g, alternativeNames = { "ComboBox": "DropDownList", "DropDownList": "ComboBox" }; var List = kendo.ui.DataBoundWidget.extend({ init: function(element, options) { var that = this, ns = that.ns, id; Widget.fn.init.call(that, element, options); element = that.element; that._isSelect = element.is(SELECT); that._template(); that.ul = $('
        ') .css({ overflow: support.kineticScrollNeeded ? "": "auto" }) .on("mouseenter" + ns, LI, function() { $(this).addClass(HOVER); }) .on("mouseleave" + ns, LI, function() { $(this).removeClass(HOVER); }) .on("click" + ns, LI, proxy(that._click, that)) .attr({ tabIndex: -1, role: "listbox", "aria-hidden": true }); that.list = $("
        ") .append(that.ul) .on("mousedown" + ns, proxy(that._listMousedown, that)); id = element.attr(ID); if (id) { that.list.attr(ID, id + "-list"); that.ul.attr(ID, id + "_listbox"); that._optionID = id + "_option_selected"; } that._header(); that._accessors(); that._initValue(); }, options: { valuePrimitive: false, headerTemplate: "" }, setOptions: function(options) { Widget.fn.setOptions.call(this, options); if (options && options.enable !== undefined) { options.enabled = options.enable; } }, focus: function() { this._focused.focus(); }, readonly: function(readonly) { this._editable({ readonly: readonly === undefined ? true : readonly, disable: false }); }, enable: function(enable) { this._editable({ readonly: false, disable: !(enable = enable === undefined ? true : enable) }); }, _listMousedown: function(e) { if (!this.filterInput || this.filterInput[0] !== e.target) { e.preventDefault(); } }, _filterSource: function(filter, force) { var that = this; var options = that.options; var dataSource = that.dataSource; var expression = extend({}, dataSource.filter() || {}); var removed = removeFiltersForField(expression, options.dataTextField); if ((filter || removed) && that.trigger("filtering", { filter: filter })) { return; } if (filter) { expression = expression.filters || []; expression.push(filter); } if (!force) { dataSource.filter(expression); } else { dataSource.read(expression); } }, _header: function() { var that = this; var template = that.options.headerTemplate; var header; if ($.isFunction(template)) { template = template({}); } if (template) { that.list.prepend(template); header = that.ul.prev(); that.header = header[0] ? header : null; if (that.header) { that.angular("compile", function(){ return { elements: that.header }; }); } } }, _initValue: function() { var that = this, value = that.options.value; if (value !== null) { that.element.val(value); } else { value = that._accessor(); that.options.value = value; } that._old = value; }, _ignoreCase: function() { var that = this, model = that.dataSource.reader.model, field; if (model && model.fields) { field = model.fields[that.options.dataTextField]; if (field && field.type && field.type !== "string") { that.options.ignoreCase = false; } } }, items: function() { return this.ul[0].children; }, current: function(candidate) { var that = this; var focused = that._focused.add(that.filterInput); var id = that._optionID; if (candidate !== undefined) { if (that._current) { that._current .removeClass(FOCUSED) .removeAttr("aria-selected") .removeAttr(ID); focused.removeAttr("aria-activedescendant"); } if (candidate) { candidate.addClass(FOCUSED); that._scroll(candidate); if (id) { candidate.attr("id", id); focused.attr("aria-activedescendant", id); } } that._current = candidate; } else { return that._current; } }, destroy: function() { var that = this, ns = that.ns; Widget.fn.destroy.call(that); that._unbindDataSource(); that.ul.off(ns); that.list.off(ns); if (that._touchScroller) { that._touchScroller.destroy(); } that.popup.destroy(); if (that._form) { that._form.off("reset", that._resetHandler); } }, dataItem: function(index) { var that = this; if (index === undefined) { index = that.selectedIndex; } else if (typeof index !== "number") { index = $(that.items()).index(index); } return that._data()[index]; }, _accessors: function() { var that = this; var element = that.element; var options = that.options; var getter = kendo.getter; var textField = element.attr(kendo.attr("text-field")); var valueField = element.attr(kendo.attr("value-field")); if (!options.dataTextField && textField) { options.dataTextField = textField; } if (!options.dataValueField && valueField) { options.dataValueField = valueField; } that._text = getter(options.dataTextField); that._value = getter(options.dataValueField); }, _aria: function(id) { var that = this, options = that.options, element = that._focused.add(that.filterInput); if (options.suggest !== undefined) { element.attr("aria-autocomplete", options.suggest ? "both" : "list"); } id = id ? id + " " + that.ul[0].id : that.ul[0].id; element.attr("aria-owns", id); that.ul.attr("aria-live", !options.filter || options.filter === "none" ? "off" : "polite"); }, _blur: function() { var that = this; that._change(); that.close(); }, _change: function() { var that = this, index = that.selectedIndex, optionValue = that.options.value, value = that.value(), trigger; if (that._isSelect && !that._bound && optionValue) { value = optionValue; } if (value !== that._old) { trigger = true; } else if (index !== undefined && index !== that._oldIndex) { trigger = true; } if (trigger) { that._old = value; that._oldIndex = index; // trigger the DOM change event so any subscriber gets notified that.element.trigger(CHANGE); that.trigger(CHANGE); } }, _click: function(e) { if (!e.isDefaultPrevented()) { this._accept($(e.currentTarget)); } }, _data: function() { return this.dataSource.view(); }, _enable: function() { var that = this, options = that.options, disabled = that.element.is("[disabled]"); if (options.enable !== undefined) { options.enabled = options.enable; } if (!options.enabled || disabled) { that.enable(false); } else { that.readonly(that.element.is("[readonly]")); } }, _focus: function(li) { var that = this; var userTriggered = true; if (that.popup.visible() && li && that.trigger(SELECT, {item: li})) { that.close(); return; } that._select(li); that._triggerCascade(userTriggered); that._blur(); }, _index: function(value) { var that = this, idx, length, data = that._data(); for (idx = 0, length = data.length; idx < length; idx++) { if (that._dataValue(data[idx]) == value) { return idx; } } return -1; }, _dataValue: function(dataItem) { var value = this._value(dataItem); if (value === undefined) { value = this._text(dataItem); } return value; }, _height: function(length) { if (length) { var that = this, list = that.list, height = that.options.height, visible = that.popup.visible(), offsetTop, popups; popups = list.add(list.parent(".k-animation-container")).show(); height = that.ul[0].scrollHeight > height ? height : "auto"; popups.height(height); if (height !== "auto") { offsetTop = that.ul[0].offsetTop; if (offsetTop) { height = list.height() - offsetTop; } } that.ul.height(height); if (!visible) { popups.hide(); } } }, _adjustListWidth: function() { var list = this.list, width = list[0].style.width, wrapper = this.wrapper, computedStyle, computedWidth; if (!list.data(WIDTH) && width) { return; } computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0; computedWidth = computedStyle ? parseFloat(computedStyle.width) : wrapper.outerWidth(); if (computedStyle && browser.msie) { // getComputedStyle returns different box in IE. computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth); } if (list.css("box-sizing") !== "border-box") { width = computedWidth - (list.outerWidth() - list.width()); } else { width = computedWidth; } list.css({ fontFamily: wrapper.css("font-family"), width: width }) .data(WIDTH, width); return true; }, _openHandler: function(e) { this._adjustListWidth(); if (this.trigger(OPEN)) { e.preventDefault(); } else { this._focused.attr("aria-expanded", true); this.ul.attr("aria-hidden", false); } }, _closeHandler: function(e) { if (this.trigger(CLOSE)) { e.preventDefault(); } else { this._focused.attr("aria-expanded", false); this.ul.attr("aria-hidden", true); } }, _firstOpen: function() { this._height(this._data().length); }, _popup: function() { var that = this; that.popup = new ui.Popup(that.list, extend({}, that.options.popup, { anchor: that.wrapper, open: proxy(that._openHandler, that), close: proxy(that._closeHandler, that), animation: that.options.animation, isRtl: support.isRtl(that.wrapper) })); that.popup.one(OPEN, proxy(that._firstOpen, that)); that._touchScroller = kendo.touchScroller(that.popup.element); }, _makeUnselectable: function() { if (isIE8) { this.list.find("*").not(".k-textbox").attr("unselectable", "on"); } }, _toggleHover: function(e) { $(e.currentTarget).toggleClass(HOVER, e.type === "mouseenter"); }, _toggle: function(open, preventFocus) { var that = this; var touchEnabled = support.touch || support.MSPointers || support.pointers; open = open !== undefined? open : !that.popup.visible(); if (!preventFocus && !touchEnabled && that._focused[0] !== activeElement()) { that._focused.focus(); } that[open ? OPEN : CLOSE](); }, _scroll: function (item) { if (!item) { return; } if (item[0]) { item = item[0]; } var ul = this.ul[0], itemOffsetTop = item.offsetTop, itemOffsetHeight = item.offsetHeight, ulScrollTop = ul.scrollTop, ulOffsetHeight = ul.clientHeight, bottomDistance = itemOffsetTop + itemOffsetHeight, touchScroller = this._touchScroller, yDimension, offsetHeight; if (touchScroller) { yDimension = touchScroller.dimensions.y; if (yDimension.enabled && itemOffsetTop > yDimension.size) { itemOffsetTop = itemOffsetTop - yDimension.size + itemOffsetHeight + 4; touchScroller.scrollTo(0, -itemOffsetTop); } } else { offsetHeight = this.header ? this.header.outerHeight() : 0; offsetHeight += this.filterInput ? this.filterInput.outerHeight() : 0; ul.scrollTop = ulScrollTop > itemOffsetTop ? (itemOffsetTop - offsetHeight) : bottomDistance > (ulScrollTop + ulOffsetHeight) ? (bottomDistance - ulOffsetHeight - offsetHeight) : ulScrollTop; } }, _template: function() { var that = this, options = that.options, template = options.template, hasDataSource = options.dataSource; if (that._isSelect && that.element[0].length) { if (!hasDataSource) { options.dataTextField = options.dataTextField || "text"; options.dataValueField = options.dataValueField || "value"; } } if (!template) { that.template = kendo.template('
      • ${' + kendo.expr(options.dataTextField, "data") + "}
      • ", { useWithBlock: false }); } else { template = kendo.template(template); that.template = function(data) { return '
      • ' + template(data) + "
      • "; }; } }, _triggerCascade: function(userTriggered) { var that = this, value = that.value(); if ((!that._bound && value) || that._old !== value) { that.trigger("cascade", { userTriggered: userTriggered }); } }, _unbindDataSource: function() { var that = this; that.dataSource.unbind(CHANGE, that._refreshHandler) .unbind(PROGRESS, that._progressHandler) .unbind(REQUESTEND, that._requestEndHandler) .unbind("error", that._errorHandler); } }); extend(List, { inArray: function(node, parentNode) { var idx, length, siblings = parentNode.children; if (!node || node.parentNode !== parentNode) { return -1; } for (idx = 0, length = siblings.length; idx < length; idx++) { if (node === siblings[idx]) { return idx; } } return -1; } }); kendo.ui.List = List; ui.Select = List.extend({ init: function(element, options) { List.fn.init.call(this, element, options); this._initial = this.element.val(); }, setDataSource: function(dataSource) { this.options.dataSource = dataSource; this._dataSource(); this._bound = false; if (this.options.autoBind) { this.dataSource.fetch(); } }, close: function() { this.popup.close(); }, select: function(li) { var that = this; if (li === undefined) { return that.selectedIndex; } else { that._select(li); that._triggerCascade(); that._old = that._accessor(); that._oldIndex = that.selectedIndex; } }, search: function(word) { word = typeof word === "string" ? word : this.text(); var that = this; var length = word.length; var options = that.options; var ignoreCase = options.ignoreCase; var filter = options.filter; var field = options.dataTextField; clearTimeout(that._typing); if (!length || length >= options.minLength) { that._state = "filter"; if (filter === "none") { that._filter(word); } else { that._open = true; that._filterSource({ value: ignoreCase ? word.toLowerCase() : word, field: field, operator: filter, ignoreCase: ignoreCase }); } } }, _accessor: function(value, idx) { var element = this.element[0], isSelect = this._isSelect, selectedIndex = element.selectedIndex, option; if (value === undefined) { if (isSelect) { if (selectedIndex > -1) { option = element.options[selectedIndex]; if (option) { value = option.value; } } } else { value = element.value; } return value; } else { if (isSelect) { if (selectedIndex > -1) { element.options[selectedIndex].removeAttribute(SELECTED); } element.selectedIndex = idx; option = element.options[idx]; if (option) { option.setAttribute(SELECTED, SELECTED); } } else { element.value = value; } } }, _hideBusy: function () { var that = this; clearTimeout(that._busy); that._arrow.removeClass(LOADING); that._focused.attr("aria-busy", false); that._busy = null; }, _showBusy: function () { var that = this; that._request = true; if (that._busy) { return; } that._busy = setTimeout(function () { if (that._arrow) { //destroyed after request start that._focused.attr("aria-busy", true); that._arrow.addClass(LOADING); } }, 100); }, _requestEnd: function() { this._request = false; }, _dataSource: function() { var that = this, element = that.element, options = that.options, dataSource = options.dataSource || {}, idx; dataSource = $.isArray(dataSource) ? {data: dataSource} : dataSource; if (that._isSelect) { idx = element[0].selectedIndex; if (idx > -1) { options.index = idx; } dataSource.select = element; dataSource.fields = [{ field: options.dataTextField }, { field: options.dataValueField }]; } if (that.dataSource && that._refreshHandler) { that._unbindDataSource(); } else { that._refreshHandler = proxy(that.refresh, that); that._progressHandler = proxy(that._showBusy, that); that._requestEndHandler = proxy(that._requestEnd, that); that._errorHandler = proxy(that._hideBusy, that); } that.dataSource = kendo.data.DataSource.create(dataSource) .bind(CHANGE, that._refreshHandler) .bind(PROGRESS, that._progressHandler) .bind(REQUESTEND, that._requestEndHandler) .bind("error", that._errorHandler); }, _get: function(li) { var that = this, data = that._data(), idx, length; if (typeof li === "function") { for (idx = 0, length = data.length; idx < length; idx++) { if (li(data[idx])) { li = idx; break; } } } if (typeof li === "number") { if (li < 0) { return $(); } li = $(that.ul[0].children[li]); } if (li && li.nodeType) { li = $(li); } return li; }, _move: function(e) { var that = this, key = e.keyCode, ul = that.ul[0], methodName = that.popup.visible() ? "_select" : "_accept", current = that._current, down = key === keys.DOWN, firstChild, pressed; if (key === keys.UP || down) { if (e.altKey) { that.toggle(down); } else { firstChild = ul.firstChild; if (!firstChild && !that._accessor() && that._state !== "filter") { if (!that._fetch) { that.dataSource.one(CHANGE, function() { that._move(e); that._fetch = false; }); that._fetch = true; that._filterSource(); } e.preventDefault(); return true; //pressed } if (down) { if (!current || (that.selectedIndex === -1 && !that.value() && current[0] === firstChild)) { current = firstChild; } else { current = current[0].nextSibling; if (!current && firstChild === ul.lastChild) { current = firstChild; } } that[methodName](current); } else { current = current ? current[0].previousSibling : ul.lastChild; if (!current && firstChild === ul.lastChild) { current = firstChild; } that[methodName](current); } } e.preventDefault(); pressed = true; } else if (key === keys.ENTER || key === keys.TAB) { if (that.popup.visible()) { e.preventDefault(); } if (!that.popup.visible() && (!current || !current.hasClass("k-state-selected"))) { current = null; } that._accept(current, key); pressed = true; } else if (key === keys.ESC) { if (that.popup.visible()) { e.preventDefault(); } that.close(); pressed = true; } return pressed; }, _selectItem: function() { var that = this, notBound = that._bound === undefined, options = that.options, useOptionIndex, value; useOptionIndex = that._isSelect && !that._initial && !options.value && options.index && !that._bound; if (!useOptionIndex) { value = that._selectedValue || (notBound && options.value) || that._accessor(); } if (value) { that.value(value); } else if (notBound) { that.select(options.index); } }, _fetchItems: function(value) { var that = this, hasItems = that.ul[0].firstChild; //if request is started avoid datasource.fetch if (that._request) { return true; } if (!that._bound && !that._fetch && !hasItems) { if (that.options.cascadeFrom) { return !hasItems; } that.dataSource.one(CHANGE, function() { that._old = undefined; that.value(value); that._fetch = false; }); that._fetch = true; that.dataSource.fetch(); return true; } }, _options: function(data, optionLabel) { var that = this, element = that.element, length = data.length, options = "", option, dataItem, dataText, dataValue, idx = 0; if (optionLabel) { idx = 1; options = optionLabel; } for (; idx < length; idx++) { option = "#=data.value#', { useWithBlock: false }), emptyCellTemplate = template(' ', { useWithBlock: false }), browser = kendo.support.browser, isIE8 = browser.msie && browser.version < 9, ns = ".kendoCalendar", CLICK = "click" + ns, KEYDOWN_NS = "keydown" + ns, ID = "id", MIN = "min", LEFT = "left", SLIDE = "slideIn", MONTH = "month", CENTURY = "century", CHANGE = "change", NAVIGATE = "navigate", VALUE = "value", HOVER = "k-state-hover", DISABLED = "k-state-disabled", FOCUSED = "k-state-focused", OTHERMONTH = "k-other-month", OTHERMONTHCLASS = ' class="' + OTHERMONTH + '"', TODAY = "k-nav-today", CELLSELECTOR = "td:has(.k-link)", BLUR = "blur" + ns, FOCUS = "focus", FOCUS_WITH_NS = FOCUS + ns, MOUSEENTER = support.touch ? "touchstart" : "mouseenter", MOUSEENTER_WITH_NS = support.touch ? "touchstart" + ns : "mouseenter" + ns, MOUSELEAVE = support.touch ? "touchend" + ns + " touchmove" + ns : "mouseleave" + ns, MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000, PREVARROW = "_prevArrow", NEXTARROW = "_nextArrow", ARIA_DISABLED = "aria-disabled", ARIA_SELECTED = "aria-selected", proxy = $.proxy, extend = $.extend, DATE = Date, views = { month: 0, year: 1, decade: 2, century: 3 }; var Calendar = Widget.extend({ init: function(element, options) { var that = this, value, id; Widget.fn.init.call(that, element, options); element = that.wrapper = that.element; options = that.options; options.url = window.unescape(options.url); that._templates(); that._header(); that._footer(that.footer); id = element .addClass("k-widget k-calendar") .on(MOUSEENTER_WITH_NS + " " + MOUSELEAVE, CELLSELECTOR, mousetoggle) .on(KEYDOWN_NS, "table.k-content", proxy(that._move, that)) .on(CLICK, CELLSELECTOR, function(e) { var link = e.currentTarget.firstChild; if (link.href.indexOf("#") != -1) { e.preventDefault(); } that._click($(link)); }) .on("mouseup" + ns, "table.k-content, .k-footer", function() { that._focusView(that.options.focusOnNav !== false); }) .attr(ID); if (id) { that._cellID = id + "_cell_selected"; } normalize(options); value = parse(options.value, options.format, options.culture); that._index = views[options.start]; that._current = new DATE(+restrictValue(value, options.min, options.max)); that._addClassProxy = function() { that._active = true; that._cell.addClass(FOCUSED); }; that._removeClassProxy = function() { that._active = false; that._cell.removeClass(FOCUSED); }; that.value(value); kendo.notify(that); }, options: { name: "Calendar", value: null, min: new DATE(1900, 0, 1), max: new DATE(2099, 11, 31), dates: [], url: "", culture: "", footer : "", format : "", month : {}, start: MONTH, depth: MONTH, animation: { horizontal: { effects: SLIDE, reverse: true, duration: 500, divisor: 2 }, vertical: { effects: "zoomIn", duration: 400 } } }, events: [ CHANGE, NAVIGATE ], setOptions: function(options) { var that = this; normalize(options); if (!options.dates[0]) { options.dates = that.options.dates; } Widget.fn.setOptions.call(that, options); that._templates(); that._footer(that.footer); that._index = views[that.options.start]; that.navigate(); }, destroy: function() { var that = this, today = that._today; that.element.off(ns); that._title.off(ns); that[PREVARROW].off(ns); that[NEXTARROW].off(ns); kendo.destroy(that._table); if (today) { kendo.destroy(today.off(ns)); } Widget.fn.destroy.call(that); }, current: function() { return this._current; }, view: function() { return this._view; }, focus: function(table) { table = table || this._table; this._bindTable(table); table.focus(); }, min: function(value) { return this._option(MIN, value); }, max: function(value) { return this._option("max", value); }, navigateToPast: function() { this._navigate(PREVARROW, -1); }, navigateToFuture: function() { this._navigate(NEXTARROW, 1); }, navigateUp: function() { var that = this, index = that._index; if (that._title.hasClass(DISABLED)) { return; } that.navigate(that._current, ++index); }, navigateDown: function(value) { var that = this, index = that._index, depth = that.options.depth; if (!value) { return; } if (index === views[depth]) { if (+that._value != +value) { that.value(value); that.trigger(CHANGE); } return; } that.navigate(value, --index); }, navigate: function(value, view) { view = isNaN(view) ? views[view] : view; var that = this, options = that.options, culture = options.culture, min = options.min, max = options.max, title = that._title, from = that._table, old = that._oldTable, selectedValue = that._value, currentValue = that._current, future = value && +value > +currentValue, vertical = view !== undefined && view !== that._index, to, currentView, compare, disabled; if (!value) { value = currentValue; } that._current = value = new DATE(+restrictValue(value, min, max)); if (view === undefined) { view = that._index; } else { that._index = view; } that._view = currentView = calendar.views[view]; compare = currentView.compare; disabled = view === views[CENTURY]; title.toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled); disabled = compare(value, min) < 1; that[PREVARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled); disabled = compare(value, max) > -1; that[NEXTARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled); if (from && old && old.data("animating")) { old.kendoStop(true, true); from.kendoStop(true, true); } that._oldTable = from; if (!from || that._changeView) { title.html(currentView.title(value, min, max, culture)); that._table = to = $(currentView.content(extend({ min: min, max: max, date: value, url: options.url, dates: options.dates, format: options.format, culture: culture }, that[currentView.name]))); makeUnselectable(to); that._animate({ from: from, to: to, vertical: vertical, future: future }); that._focus(value); that.trigger(NAVIGATE); } if (view === views[options.depth] && selectedValue) { that._class("k-state-selected", currentView.toDateString(selectedValue)); } that._class(FOCUSED, currentView.toDateString(value)); if (!from && that._cell) { that._cell.removeClass(FOCUSED); } that._changeView = true; }, value: function(value) { var that = this, view = that._view, options = that.options, old = that._view, min = options.min, max = options.max; if (value === undefined) { return that._value; } value = parse(value, options.format, options.culture); if (value !== null) { value = new DATE(+value); if (!isInRange(value, min, max)) { value = null; } } that._value = value; if (old && value === null && that._cell) { that._cell.removeClass("k-state-selected"); } else { that._changeView = !value || view && view.compare(value, that._current) !== 0; that.navigate(value); } }, _move: function(e) { var that = this, options = that.options, key = e.keyCode, view = that._view, index = that._index, currentValue = new DATE(+that._current), isRtl = kendo.support.isRtl(that.wrapper), value, prevent, method, temp; if (e.target === that._table[0]) { that._active = true; } if (e.ctrlKey) { if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) { that.navigateToFuture(); prevent = true; } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) { that.navigateToPast(); prevent = true; } else if (key == keys.UP) { that.navigateUp(); prevent = true; } else if (key == keys.DOWN) { that._click($(that._cell[0].firstChild)); prevent = true; } } else { if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) { value = 1; prevent = true; } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) { value = -1; prevent = true; } else if (key == keys.UP) { value = index === 0 ? -7 : -4; prevent = true; } else if (key == keys.DOWN) { value = index === 0 ? 7 : 4; prevent = true; } else if (key == keys.ENTER) { that._click($(that._cell[0].firstChild)); prevent = true; } else if (key == keys.HOME || key == keys.END) { method = key == keys.HOME ? "first" : "last"; temp = view[method](currentValue); currentValue = new DATE(temp.getFullYear(), temp.getMonth(), temp.getDate(), currentValue.getHours(), currentValue.getMinutes(), currentValue.getSeconds(), currentValue.getMilliseconds()); prevent = true; } else if (key == keys.PAGEUP) { prevent = true; that.navigateToPast(); } else if (key == keys.PAGEDOWN) { prevent = true; that.navigateToFuture(); } if (value || method) { if (!method) { view.setDate(currentValue, value); } that._focus(restrictValue(currentValue, options.min, options.max)); } } if (prevent) { e.preventDefault(); } return that._current; }, _animate: function(options) { var that = this, from = options.from, to = options.to, active = that._active; if (!from) { to.insertAfter(that.element[0].firstChild); that._bindTable(to); } else if (from.parent().data("animating")) { from.off(ns); from.parent().kendoStop(true, true).remove(); from.remove(); to.insertAfter(that.element[0].firstChild); that._focusView(active); } else if (!from.is(":visible") || that.options.animation === false) { to.insertAfter(from); from.off(ns).remove(); that._focusView(active); } else { that[options.vertical ? "_vertical" : "_horizontal"](from, to, options.future); } }, _horizontal: function(from, to, future) { var that = this, active = that._active, horizontal = that.options.animation.horizontal, effects = horizontal.effects, viewWidth = from.outerWidth(); if (effects && effects.indexOf(SLIDE) != -1) { from.add(to).css({ width: viewWidth }); from.wrap("
        "); that._focusView(active, from); from.parent() .css({ position: "relative", width: viewWidth * 2, "float": LEFT, "margin-left": future ? 0 : -viewWidth }); to[future ? "insertAfter" : "insertBefore"](from); extend(horizontal, { effects: SLIDE + ":" + (future ? "right" : LEFT), complete: function() { from.off(ns).remove(); that._oldTable = null; to.unwrap(); that._focusView(active); } }); from.parent().kendoStop(true, true).kendoAnimate(horizontal); } }, _vertical: function(from, to) { var that = this, vertical = that.options.animation.vertical, effects = vertical.effects, active = that._active, //active state before from's blur cell, position; if (effects && effects.indexOf("zoom") != -1) { to.css({ position: "absolute", top: from.prev().outerHeight(), left: 0 }).insertBefore(from); if (transitionOrigin) { cell = that._cellByDate(that._view.toDateString(that._current)); position = cell.position(); position = (position.left + parseInt(cell.width() / 2, 10)) + "px" + " " + (position.top + parseInt(cell.height() / 2, 10) + "px"); to.css(transitionOrigin, position); } from.kendoStop(true, true).kendoAnimate({ effects: "fadeOut", duration: 600, complete: function() { from.off(ns).remove(); that._oldTable = null; to.css({ position: "static", top: 0, left: 0 }); that._focusView(active); } }); to.kendoStop(true, true).kendoAnimate(vertical); } }, _cellByDate: function(value) { return this._table.find("td:not(." + OTHERMONTH + ")") .filter(function() { return $(this.firstChild).attr(kendo.attr(VALUE)) === value; }); }, _class: function(className, value) { var that = this, id = that._cellID, cell = that._cell; if (cell) { cell.removeAttr(ARIA_SELECTED) .removeAttr("aria-label") .removeAttr(ID); } cell = that._table .find("td:not(." + OTHERMONTH + ")") .removeClass(className) .filter(function() { return $(this.firstChild).attr(kendo.attr(VALUE)) === value; }) .attr(ARIA_SELECTED, true); if (className === FOCUSED && !that._active && that.options.focusOnNav !== false) { className = ""; } cell.addClass(className); if (cell[0]) { that._cell = cell; } if (id) { cell.attr(ID, id); that._table.removeAttr("aria-activedescendant").attr("aria-activedescendant", id); } }, _bindTable: function (table) { table .on(FOCUS_WITH_NS, this._addClassProxy) .on(BLUR, this._removeClassProxy); }, _click: function(link) { var that = this, options = that.options, currentValue = new Date(+that._current), value = link.attr(kendo.attr(VALUE)).split("/"); //Safari cannot create correctly date from "1/1/2090" value = new DATE(value[0], value[1], value[2]); adjustDST(value, 0); that._view.setDate(currentValue, value); that.navigateDown(restrictValue(currentValue, options.min, options.max)); }, _focus: function(value) { var that = this, view = that._view; if (view.compare(value, that._current) !== 0) { that.navigate(value); } else { that._current = value; that._class(FOCUSED, view.toDateString(value)); } }, _focusView: function(active, table) { if (active) { this.focus(table); } }, _footer: function(template) { var that = this, today = getToday(), element = that.element, footer = element.find(".k-footer"); if (!template) { that._toggle(false); footer.hide(); return; } if (!footer[0]) { footer = $('').appendTo(element); } that._today = footer.show() .find(".k-link") .html(template(today)) .attr("title", kendo.toString(today, "D", that.options.culture)); that._toggle(); }, _header: function() { var that = this, element = that.element, links; if (!element.find(".k-header")[0]) { element.html('
        ' + '' + '' + '' + '
        '); } links = element.find(".k-link") .on(MOUSEENTER_WITH_NS + " " + MOUSELEAVE + " " + FOCUS_WITH_NS + " " + BLUR, mousetoggle) .click(false); that._title = links.eq(1).on(CLICK, function() { that._active = that.options.focusOnNav !== false; that.navigateUp(); }); that[PREVARROW] = links.eq(0).on(CLICK, function() { that._active = that.options.focusOnNav !== false; that.navigateToPast(); }); that[NEXTARROW] = links.eq(2).on(CLICK, function() { that._active = that.options.focusOnNav !== false; that.navigateToFuture(); }); }, _navigate: function(arrow, modifier) { var that = this, index = that._index + 1, currentValue = new DATE(+that._current); arrow = that[arrow]; if (!arrow.hasClass(DISABLED)) { if (index > 3) { currentValue.setFullYear(currentValue.getFullYear() + 100 * modifier); } else { calendar.views[index].setDate(currentValue, modifier); } that.navigate(currentValue); } }, _option: function(option, value) { var that = this, options = that.options, currentValue = that._value || that._current, isBigger; if (value === undefined) { return options[option]; } value = parse(value, options.format, options.culture); if (!value) { return; } options[option] = new DATE(+value); if (option === MIN) { isBigger = value > currentValue; } else { isBigger = currentValue > value; } if (isBigger || isEqualMonth(currentValue, value)) { if (isBigger) { that._value = null; } that._changeView = true; } if (!that._changeView) { that._changeView = !!(options.month.content || options.month.empty); } that.navigate(that._value); that._toggle(); }, _toggle: function(toggle) { var that = this, options = that.options, link = that._today; if (toggle === undefined) { toggle = isInRange(getToday(), options.min, options.max); } if (link) { link.off(CLICK); if (toggle) { link.addClass(TODAY) .removeClass(DISABLED) .on(CLICK, proxy(that._todayClick, that)); } else { link.removeClass(TODAY) .addClass(DISABLED) .on(CLICK, prevent); } } }, _todayClick: function(e) { var that = this, depth = views[that.options.depth], today = getToday(); e.preventDefault(); if (that._view.compare(that._current, today) === 0 && that._index == depth) { that._changeView = false; } that._value = today; that.navigate(today, depth); that.trigger(CHANGE); }, _templates: function() { var that = this, options = that.options, footer = options.footer, month = options.month, content = month.content, empty = month.empty; that.month = { content: template('' + (content || "#=data.value#") + '', { useWithBlock: !!content }), empty: template('' + (empty || " ") + "", { useWithBlock: !!empty }) }; that.footer = footer !== false ? template(footer || '#= kendo.toString(data,"D","' + options.culture +'") #', { useWithBlock: false }) : null; } }); ui.plugin(Calendar); var calendar = { firstDayOfMonth: function (date) { return new DATE( date.getFullYear(), date.getMonth(), 1 ); }, firstVisibleDay: function (date, calendarInfo) { calendarInfo = calendarInfo || kendo.culture().calendar; var firstDay = calendarInfo.firstDay, firstVisibleDay = new DATE(date.getFullYear(), date.getMonth(), 0, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()); while (firstVisibleDay.getDay() != firstDay) { calendar.setTime(firstVisibleDay, -1 * MS_PER_DAY); } return firstVisibleDay; }, setTime: function (date, time) { var tzOffsetBefore = date.getTimezoneOffset(), resultDATE = new DATE(date.getTime() + time), tzOffsetDiff = resultDATE.getTimezoneOffset() - tzOffsetBefore; date.setTime(resultDATE.getTime() + tzOffsetDiff * MS_PER_MINUTE); }, views: [{ name: MONTH, title: function(date, min, max, culture) { return getCalendarInfo(culture).months.names[date.getMonth()] + " " + date.getFullYear(); }, content: function(options) { var that = this, idx = 0, min = options.min, max = options.max, date = options.date, dates = options.dates, format = options.format, culture = options.culture, navigateUrl = options.url, hasUrl = navigateUrl && dates[0], currentCalendar = getCalendarInfo(culture), firstDayIdx = currentCalendar.firstDay, days = currentCalendar.days, names = shiftArray(days.names, firstDayIdx), shortNames = shiftArray(days.namesShort, firstDayIdx), start = calendar.firstVisibleDay(date, currentCalendar), firstDayOfMonth = that.first(date), lastDayOfMonth = that.last(date), toDateString = that.toDateString, today = new DATE(), html = ''; for (; idx < 7; idx++) { html += ''; } today = new DATE(today.getFullYear(), today.getMonth(), today.getDate()); adjustDST(today, 0); today = +today; return view({ cells: 42, perRow: 7, html: html += '', start: new DATE(start.getFullYear(), start.getMonth(), start.getDate()), min: new DATE(min.getFullYear(), min.getMonth(), min.getDate()), max: new DATE(max.getFullYear(), max.getMonth(), max.getDate()), content: options.content, empty: options.empty, setter: that.setDate, build: function(date) { var cssClass = [], day = date.getDay(), linkClass = "", url = "#"; if (date < firstDayOfMonth || date > lastDayOfMonth) { cssClass.push(OTHERMONTH); } if (+date === today) { cssClass.push("k-today"); } if (day === 0 || day === 6) { cssClass.push("k-weekend"); } if (hasUrl && inArray(+date, dates)) { url = navigateUrl.replace("{0}", kendo.toString(date, format, culture)); linkClass = " k-action-link"; } return { date: date, dates: dates, ns: kendo.ns, title: kendo.toString(date, "D", culture), value: date.getDate(), dateString: toDateString(date), cssClass: cssClass[0] ? ' class="' + cssClass.join(" ") + '"' : "", linkClass: linkClass, url: url }; } }); }, first: function(date) { return calendar.firstDayOfMonth(date); }, last: function(date) { var last = new DATE(date.getFullYear(), date.getMonth() + 1, 0), first = calendar.firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset()); if (timeOffset) { last.setHours(first.getHours() + (timeOffset / 60)); } return last; }, compare: function(date1, date2) { var result, month1 = date1.getMonth(), year1 = date1.getFullYear(), month2 = date2.getMonth(), year2 = date2.getFullYear(); if (year1 > year2) { result = 1; } else if (year1 < year2) { result = -1; } else { result = month1 == month2 ? 0 : month1 > month2 ? 1 : -1; } return result; }, setDate: function(date, value) { var hours = date.getHours(); if (value instanceof DATE) { date.setFullYear(value.getFullYear(), value.getMonth(), value.getDate()); } else { calendar.setTime(date, value * MS_PER_DAY); } adjustDST(date, hours); }, toDateString: function(date) { return date.getFullYear() + "/" + date.getMonth() + "/" + date.getDate(); } }, { name: "year", title: function(date) { return date.getFullYear(); }, content: function(options) { var namesAbbr = getCalendarInfo(options.culture).months.namesAbbr, toDateString = this.toDateString, min = options.min, max = options.max; return view({ min: new DATE(min.getFullYear(), min.getMonth(), 1), max: new DATE(max.getFullYear(), max.getMonth(), 1), start: new DATE(options.date.getFullYear(), 0, 1), setter: this.setDate, build: function(date) { return { value: namesAbbr[date.getMonth()], ns: kendo.ns, dateString: toDateString(date), cssClass: "" }; } }); }, first: function(date) { return new DATE(date.getFullYear(), 0, date.getDate()); }, last: function(date) { return new DATE(date.getFullYear(), 11, date.getDate()); }, compare: function(date1, date2){ return compare(date1, date2); }, setDate: function(date, value) { var month, hours = date.getHours(); if (value instanceof DATE) { month = value.getMonth(); date.setFullYear(value.getFullYear(), month, date.getDate()); if (month !== date.getMonth()) { date.setDate(0); } } else { month = date.getMonth() + value; date.setMonth(month); if (month > 11) { month -= 12; } if (month > 0 && date.getMonth() != month) { date.setDate(0); } } adjustDST(date, hours); }, toDateString: function(date) { return date.getFullYear() + "/" + date.getMonth() + "/1"; } }, { name: "decade", title: function(date, min, max) { return title(date, min, max, 10); }, content: function(options) { var year = options.date.getFullYear(), toDateString = this.toDateString; return view({ start: new DATE(year - year % 10 - 1, 0, 1), min: new DATE(options.min.getFullYear(), 0, 1), max: new DATE(options.max.getFullYear(), 0, 1), setter: this.setDate, build: function(date, idx) { return { value: date.getFullYear(), ns: kendo.ns, dateString: toDateString(date), cssClass: idx === 0 || idx == 11 ? OTHERMONTHCLASS : "" }; } }); }, first: function(date) { var year = date.getFullYear(); return new DATE(year - year % 10, date.getMonth(), date.getDate()); }, last: function(date) { var year = date.getFullYear(); return new DATE(year - year % 10 + 9, date.getMonth(), date.getDate()); }, compare: function(date1, date2) { return compare(date1, date2, 10); }, setDate: function(date, value) { setDate(date, value, 1); }, toDateString: function(date) { return date.getFullYear() + "/0/1"; } }, { name: CENTURY, title: function(date, min, max) { return title(date, min, max, 100); }, content: function(options) { var year = options.date.getFullYear(), min = options.min.getFullYear(), max = options.max.getFullYear(), toDateString = this.toDateString, minYear = min, maxYear = max; minYear = minYear - minYear % 10; maxYear = maxYear - maxYear % 10; if (maxYear - minYear < 10) { maxYear = minYear + 9; } return view({ start: new DATE(year - year % 100 - 10, 0, 1), min: new DATE(minYear, 0, 1), max: new DATE(maxYear, 0, 1), setter: this.setDate, build: function(date, idx) { var start = date.getFullYear(), end = start + 9; if (start < min) { start = min; } if (end > max) { end = max; } return { ns: kendo.ns, value: start + " - " + end, dateString: toDateString(date), cssClass: idx === 0 || idx == 11 ? OTHERMONTHCLASS : "" }; } }); }, first: function(date) { var year = date.getFullYear(); return new DATE(year - year % 100, date.getMonth(), date.getDate()); }, last: function(date) { var year = date.getFullYear(); return new DATE(year - year % 100 + 99, date.getMonth(), date.getDate()); }, compare: function(date1, date2) { return compare(date1, date2, 100); }, setDate: function(date, value) { setDate(date, value, 10); }, toDateString: function(date) { var year = date.getFullYear(); return (year - year % 10) + "/0/1"; } }] }; function title(date, min, max, modular) { var start = date.getFullYear(), minYear = min.getFullYear(), maxYear = max.getFullYear(), end; start = start - start % modular; end = start + (modular - 1); if (start < minYear) { start = minYear; } if (end > maxYear) { end = maxYear; } return start + "-" + end; } function view(options) { var idx = 0, data, min = options.min, max = options.max, start = options.start, setter = options.setter, build = options.build, length = options.cells || 12, cellsPerRow = options.perRow || 4, content = options.content || cellTemplate, empty = options.empty || emptyCellTemplate, html = options.html || '
        ' + shortNames[idx] + '
        '; for(; idx < length; idx++) { if (idx > 0 && idx % cellsPerRow === 0) { html += ''; } data = build(start, idx); html += isInRange(start, min, max) ? content(data) : empty(data); setter(start, 1); } return html + "
        "; } function compare(date1, date2, modifier) { var year1 = date1.getFullYear(), start = date2.getFullYear(), end = start, result = 0; if (modifier) { start = start - start % modifier; end = start - start % modifier + modifier - 1; } if (year1 > end) { result = 1; } else if (year1 < start) { result = -1; } return result; } function getToday() { var today = new DATE(); return new DATE(today.getFullYear(), today.getMonth(), today.getDate()); } function restrictValue (value, min, max) { var today = getToday(); if (value) { today = new DATE(+value); } if (min > today) { today = new DATE(+min); } else if (max < today) { today = new DATE(+max); } return today; } function isInRange(date, min, max) { return +date >= +min && +date <= +max; } function shiftArray(array, idx) { return array.slice(idx).concat(array.slice(0, idx)); } function setDate(date, value, multiplier) { value = value instanceof DATE ? value.getFullYear() : date.getFullYear() + multiplier * value; date.setFullYear(value); } function mousetoggle(e) { $(this).toggleClass(HOVER, MOUSEENTER.indexOf(e.type) > -1 || e.type == FOCUS); } function prevent (e) { e.preventDefault(); } function getCalendarInfo(culture) { return getCulture(culture).calendars.standard; } function normalize(options) { var start = views[options.start], depth = views[options.depth], culture = getCulture(options.culture); options.format = extractFormat(options.format || culture.calendars.standard.patterns.d); if (isNaN(start)) { start = 0; options.start = MONTH; } if (depth === undefined || depth > start) { options.depth = MONTH; } if (!options.dates) { options.dates = []; } } function makeUnselectable(element) { if (isIE8) { element.find("*").attr("unselectable", "on"); } } function inArray(date, dates) { for(var i = 0, length = dates.length; i < length; i++) { if (date === +dates[i]) { return true; } } return false; } function isEqualDatePart(value1, value2) { if (value1) { return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth() && value1.getDate() === value2.getDate(); } return false; } function isEqualMonth(value1, value2) { if (value1) { return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth(); } return false; } calendar.isEqualDatePart = isEqualDatePart; calendar.makeUnselectable = makeUnselectable; calendar.restrictValue = restrictValue; calendar.isInRange = isInRange; calendar.normalize = normalize; calendar.viewsEnum = views; kendo.calendar = calendar; })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, parse = kendo.parseDate, keys = kendo.keys, template = kendo.template, activeElement = kendo._activeElement, DIV = "
        ", SPAN = "", ns = ".kendoDatePicker", CLICK = "click" + ns, OPEN = "open", CLOSE = "close", CHANGE = "change", DATEVIEW = "dateView", DISABLED = "disabled", READONLY = "readonly", DEFAULT = "k-state-default", FOCUSED = "k-state-focused", SELECTED = "k-state-selected", STATEDISABLED = "k-state-disabled", HOVER = "k-state-hover", KEYDOWN = "keydown" + ns, HOVEREVENTS = "mouseenter" + ns + " mouseleave" + ns, MOUSEDOWN = "mousedown" + ns, ID = "id", MIN = "min", MAX = "max", MONTH = "month", ARIA_DISABLED = "aria-disabled", ARIA_EXPANDED = "aria-expanded", ARIA_HIDDEN = "aria-hidden", ARIA_READONLY = "aria-readonly", calendar = kendo.calendar, isInRange = calendar.isInRange, restrictValue = calendar.restrictValue, isEqualDatePart = calendar.isEqualDatePart, extend = $.extend, proxy = $.proxy, DATE = Date; function normalize(options) { var parseFormats = options.parseFormats, format = options.format; calendar.normalize(options); parseFormats = $.isArray(parseFormats) ? parseFormats : [parseFormats]; if ($.inArray(format, parseFormats) === -1) { parseFormats.splice(0, 0, options.format); } options.parseFormats = parseFormats; } function preventDefault(e) { e.preventDefault(); } var DateView = function(options) { var that = this, id, body = document.body, div = $(DIV).attr(ARIA_HIDDEN, "true") .addClass("k-calendar-container") .appendTo(body); that.options = options = options || {}; id = options.id; if (id) { id += "_dateview"; div.attr(ID, id); that._dateViewID = id; } that.popup = new ui.Popup(div, extend(options.popup, options, { name: "Popup", isRtl: kendo.support.isRtl(options.anchor) })); that.div = div; that.value(options.value); }; DateView.prototype = { _calendar: function() { var that = this; var calendar = that.calendar; var options = that.options; var div; if (!calendar) { div = $(DIV).attr(ID, kendo.guid()) .appendTo(that.popup.element) .on(MOUSEDOWN, preventDefault) .on(CLICK, "td:has(.k-link)", proxy(that._click, that)); that.calendar = calendar = new ui.Calendar(div); that._setOptions(options); kendo.calendar.makeUnselectable(calendar.element); calendar.navigate(that._value || that._current, options.start); that.value(that._value); } }, _setOptions: function(options) { this.calendar.setOptions({ focusOnNav: false, change: options.change, culture: options.culture, dates: options.dates, depth: options.depth, footer: options.footer, format: options.format, max: options.max, min: options.min, month: options.month, start: options.start }); }, setOptions: function(options) { var old = this.options; this.options = extend(old, options, { change: old.change, close: old.close, open: old.open }); if (this.calendar) { this._setOptions(this.options); } }, destroy: function() { this.popup.destroy(); }, open: function() { var that = this; that._calendar(); that.popup.open(); }, close: function() { this.popup.close(); }, min: function(value) { this._option(MIN, value); }, max: function(value) { this._option(MAX, value); }, toggle: function() { var that = this; that[that.popup.visible() ? CLOSE : OPEN](); }, move: function(e) { var that = this, key = e.keyCode, calendar = that.calendar, selectIsClicked = e.ctrlKey && key == keys.DOWN || key == keys.ENTER; if (key == keys.ESC) { that.close(); return; } if (e.altKey) { if (key == keys.DOWN) { that.open(); e.preventDefault(); } else if (key == keys.UP) { that.close(); e.preventDefault(); } return; } if (!that.popup.visible()){ return; } if (selectIsClicked && calendar._cell.hasClass(SELECTED)) { that.close(); e.preventDefault(); return; } that._current = calendar._move(e); }, current: function(date) { this._current = date; this.calendar._focus(date); }, value: function(value) { var that = this, calendar = that.calendar, options = that.options; that._value = value; that._current = new DATE(+restrictValue(value, options.min, options.max)); if (calendar) { calendar.value(value); } }, _click: function(e) { if (e.currentTarget.className.indexOf(SELECTED) !== -1) { this.close(); } }, _option: function(option, value) { var that = this; var calendar = that.calendar; that.options[option] = value; if (calendar) { calendar[option](value); } } }; DateView.normalize = normalize; kendo.DateView = DateView; var DatePicker = Widget.extend({ init: function(element, options) { var that = this, disabled, div; Widget.fn.init.call(that, element, options); element = that.element; options = that.options; options.min = parse(element.attr("min")) || parse(options.min); options.max = parse(element.attr("max")) || parse(options.max); normalize(options); that._wrapper(); that.dateView = new DateView(extend({}, options, { id: element.attr(ID), anchor: that.wrapper, change: function() { // calendar is the current scope that._change(this.value()); that.close(); }, close: function(e) { if (that.trigger(CLOSE)) { e.preventDefault(); } else { element.attr(ARIA_EXPANDED, false); div.attr(ARIA_HIDDEN, true); } }, open: function(e) { var options = that.options, date; if (that.trigger(OPEN)) { e.preventDefault(); } else { if (that.element.val() !== that._oldText) { date = parse(element.val(), options.parseFormats, options.culture); that.dateView[date ? "current" : "value"](date); } element.attr(ARIA_EXPANDED, true); div.attr(ARIA_HIDDEN, false); that._updateARIA(date); } } })); div = that.dateView.div; that._icon(); try { element[0].setAttribute("type", "text"); } catch(e) { element[0].type = "text"; } element .addClass("k-input") .attr({ role: "combobox", "aria-expanded": false, "aria-owns": that.dateView._dateViewID }); that._reset(); that._template(); disabled = element.is("[disabled]"); if (disabled) { that.enable(false); } else { that.readonly(element.is("[readonly]")); } that._old = that._update(options.value || that.element.val()); that._oldText = element.val(); kendo.notify(that); }, events: [ OPEN, CLOSE, CHANGE], options: { name: "DatePicker", value: null, footer: "", format: "", culture: "", parseFormats: [], min: new Date(1900, 0, 1), max: new Date(2099, 11, 31), start: MONTH, depth: MONTH, animation: {}, month : {}, dates: [], ARIATemplate: 'Current focused date is #=kendo.toString(data.current, "D")#' }, setOptions: function(options) { var that = this; var value = that._value; Widget.fn.setOptions.call(that, options); options = that.options; options.min = parse(options.min); options.max = parse(options.max); normalize(options); that.dateView.setOptions(options); if (value) { that.element.val(kendo.toString(value, options.format, options.culture)); that._updateARIA(value); } }, _editable: function(options) { var that = this, icon = that._dateIcon.off(ns), element = that.element.off(ns), wrapper = that._inputWrapper.off(ns), readonly = options.readonly, disable = options.disable; if (!readonly && !disable) { wrapper .addClass(DEFAULT) .removeClass(STATEDISABLED) .on(HOVEREVENTS, that._toggleHover); element.removeAttr(DISABLED) .removeAttr(READONLY) .attr(ARIA_DISABLED, false) .attr(ARIA_READONLY, false) .on("keydown" + ns, proxy(that._keydown, that)) .on("focusout" + ns, proxy(that._blur, that)) .on("focus" + ns, function() { that._inputWrapper.addClass(FOCUSED); }); icon.on(CLICK, proxy(that._click, that)) .on(MOUSEDOWN, preventDefault); } else { wrapper .addClass(disable ? STATEDISABLED : DEFAULT) .removeClass(disable ? DEFAULT : STATEDISABLED); element.attr(DISABLED, disable) .attr(READONLY, readonly) .attr(ARIA_DISABLED, disable) .attr(ARIA_READONLY, readonly); } }, readonly: function(readonly) { this._editable({ readonly: readonly === undefined ? true : readonly, disable: false }); }, enable: function(enable) { this._editable({ readonly: false, disable: !(enable = enable === undefined ? true : enable) }); }, destroy: function() { var that = this; Widget.fn.destroy.call(that); that.dateView.destroy(); that.element.off(ns); that._dateIcon.off(ns); that._inputWrapper.off(ns); if (that._form) { that._form.off("reset", that._resetHandler); } }, open: function() { this.dateView.open(); }, close: function() { this.dateView.close(); }, min: function(value) { return this._option(MIN, value); }, max: function(value) { return this._option(MAX, value); }, value: function(value) { var that = this; if (value === undefined) { return that._value; } that._old = that._update(value); if (that._old === null) { that.element.val(""); } that._oldText = that.element.val(); }, _toggleHover: function(e) { $(e.currentTarget).toggleClass(HOVER, e.type === "mouseenter"); }, _blur: function() { var that = this, value = that.element.val(); that.close(); if (value !== that._oldText) { that._change(value); } that._inputWrapper.removeClass(FOCUSED); }, _click: function() { var that = this, element = that.element; that.dateView.toggle(); if (!kendo.support.touch && element[0] !== activeElement()) { element.focus(); } }, _change: function(value) { var that = this; value = that._update(value); if (+that._old != +value) { that._old = value; that._oldText = that.element.val(); // trigger the DOM change event so any subscriber gets notified that.element.trigger(CHANGE); that.trigger(CHANGE); } }, _keydown: function(e) { var that = this, dateView = that.dateView, value = that.element.val(); if (!dateView.popup.visible() && e.keyCode == keys.ENTER && value !== that._oldText) { that._change(value); } else { dateView.move(e); that._updateARIA(dateView._current); } }, _icon: function() { var that = this, element = that.element, icon; icon = element.next("span.k-select"); if (!icon[0]) { icon = $('select').insertAfter(element); } that._dateIcon = icon.attr({ "role": "button", "aria-controls": that.dateView._dateViewID }); }, _option: function(option, value) { var that = this, options = that.options; if (value === undefined) { return options[option]; } value = parse(value, options.parseFormats, options.culture); if (!value) { return; } options[option] = new DATE(+value); that.dateView[option](value); }, _update: function(value) { var that = this, options = that.options, min = options.min, max = options.max, current = that._value, date = parse(value, options.parseFormats, options.culture), isSameType = (date === null && current === null) || (date instanceof Date && current instanceof Date), formattedValue; if (+date === +current && isSameType) { formattedValue = kendo.toString(date, options.format, options.culture); if (formattedValue !== value) { that.element.val(date === null ? value : formattedValue); } return date; } if (date !== null && isEqualDatePart(date, min)) { date = restrictValue(date, min, max); } else if (!isInRange(date, min, max)) { date = null; } that._value = date; that.dateView.value(date); that.element.val(date ? kendo.toString(date, options.format, options.culture) : value); that._updateARIA(date); return date; }, _wrapper: function() { var that = this, element = that.element, wrapper; wrapper = element.parents(".k-datepicker"); if (!wrapper[0]) { wrapper = element.wrap(SPAN).parent().addClass("k-picker-wrap k-state-default"); wrapper = wrapper.wrap(SPAN).parent(); } wrapper[0].style.cssText = element[0].style.cssText; element.css({ width: "100%", height: element[0].style.height }); that.wrapper = wrapper.addClass("k-widget k-datepicker k-header") .addClass(element[0].className); that._inputWrapper = $(wrapper[0].firstChild); }, _reset: function() { var that = this, element = that.element, formId = element.attr("form"), form = formId ? $("#" + formId) : element.closest("form"); if (form[0]) { that._resetHandler = function() { that.value(element[0].defaultValue); }; that._form = form.on("reset", that._resetHandler); } }, _template: function() { this._ariaTemplate = template(this.options.ARIATemplate); }, _updateARIA: function(date) { var cell; var that = this; var calendar = that.dateView.calendar; that.element.removeAttr("aria-activedescendant"); if (calendar) { cell = calendar._cell; cell.attr("aria-label", that._ariaTemplate({ current: date || calendar.current() })); that.element.attr("aria-activedescendant", cell.attr("id")); } } }); ui.plugin(DatePicker); })(window.kendo.jQuery); (function ($, undefined) { var kendo = window.kendo, support = kendo.support, caret = kendo.caret, activeElement = kendo._activeElement, placeholderSupported = support.placeholder, ui = kendo.ui, List = ui.List, keys = kendo.keys, DataSource = kendo.data.DataSource, ARIA_DISABLED = "aria-disabled", ARIA_READONLY = "aria-readonly", DEFAULT = "k-state-default", DISABLED = "disabled", READONLY = "readonly", FOCUSED = "k-state-focused", SELECTED = "k-state-selected", STATEDISABLED = "k-state-disabled", HOVER = "k-state-hover", ns = ".kendoAutoComplete", HOVEREVENTS = "mouseenter" + ns + " mouseleave" + ns, proxy = $.proxy; function indexOfWordAtCaret(caretIdx, text, separator) { return separator ? text.substring(0, caretIdx).split(separator).length - 1 : 0; } function wordAtCaret(caretIdx, text, separator) { return text.split(separator)[indexOfWordAtCaret(caretIdx, text, separator)]; } function replaceWordAtCaret(caretIdx, text, word, separator) { var words = text.split(separator); words.splice(indexOfWordAtCaret(caretIdx, text, separator), 1, word); if (separator && words[words.length - 1] !== "") { words.push(""); } return words.join(separator); } var AutoComplete = List.extend({ init: function (element, options) { var that = this, wrapper; that.ns = ns; options = $.isArray(options) ? { dataSource: options} : options; List.fn.init.call(that, element, options); element = that.element; options = that.options; options.placeholder = options.placeholder || element.attr("placeholder"); if (placeholderSupported) { element.attr("placeholder", options.placeholder); } that._wrapper(); that._loader(); that._dataSource(); that._ignoreCase(); element[0].type = "text"; wrapper = that.wrapper; that._popup(); element .addClass("k-input") .on("keydown" + ns, proxy(that._keydown, that)) .on("paste" + ns, proxy(that._search, that)) .on("focus" + ns, function () { that._prev = that._accessor(); that._placeholder(false); wrapper.addClass(FOCUSED); }) .on("focusout" + ns, function () { that._change(); that._placeholder(); wrapper.removeClass(FOCUSED); }) .attr({ autocomplete: "off", role: "textbox", "aria-haspopup": true }); that._enable(); that._old = that._accessor(); if (element[0].id) { element.attr("aria-owns", that.ul[0].id); } that._aria(); that._placeholder(); kendo.notify(that); }, options: { name: "AutoComplete", enabled: true, suggest: false, template: "", dataTextField: "", minLength: 1, delay: 200, height: 200, filter: "startswith", ignoreCase: true, highlightFirst: false, separator: null, placeholder: "", animation: {}, value: null }, _dataSource: function() { var that = this; if (that.dataSource && that._refreshHandler) { that._unbindDataSource(); } else { that._refreshHandler = proxy(that.refresh, that); that._progressHandler = proxy(that._showBusy, that); } that.dataSource = DataSource.create(that.options.dataSource) .bind("change", that._refreshHandler) .bind("progress", that._progressHandler); }, setDataSource: function(dataSource) { this.options.dataSource = dataSource; this._dataSource(); }, events: [ "open", "close", "change", "select", "filtering", "dataBinding", "dataBound" ], setOptions: function(options) { List.fn.setOptions.call(this, options); this._template(); this._accessors(); this._aria(); }, _editable: function(options) { var that = this, element = that.element, wrapper = that.wrapper.off(ns), readonly = options.readonly, disable = options.disable; if (!readonly && !disable) { wrapper .addClass(DEFAULT) .removeClass(STATEDISABLED) .on(HOVEREVENTS, that._toggleHover); element.removeAttr(DISABLED) .removeAttr(READONLY) .attr(ARIA_DISABLED, false) .attr(ARIA_READONLY, false); } else { wrapper .addClass(disable ? STATEDISABLED : DEFAULT) .removeClass(disable ? DEFAULT : STATEDISABLED); element.attr(DISABLED, disable) .attr(READONLY, readonly) .attr(ARIA_DISABLED, disable) .attr(ARIA_READONLY, readonly); } }, close: function () { var that = this, current = that._current; if (current) { current.removeClass(SELECTED); } that.current(null); that.popup.close(); }, destroy: function() { var that = this; that.element.off(ns); that.wrapper.off(ns); List.fn.destroy.call(that); }, refresh: function () { var that = this, ul = that.ul[0], popup = that.popup, options = that.options, data = that._data(), length = data.length, isActive = that.element[0] === activeElement(), action; that._angularItems("cleanup"); that.trigger("dataBinding"); ul.innerHTML = kendo.render(that.template, data); that._height(length); if (popup.visible()) { popup._position(); } if (length) { if (options.highlightFirst) { that.current($(ul.firstChild)); } if (options.suggest && isActive) { that.suggest($(ul.firstChild)); } } if (that._open) { that._open = false; action = length ? "open" : "close"; if (that._typing && !isActive) { action = "close"; } popup[action](); that._typing = undefined; } if (that._touchScroller) { that._touchScroller.reset(); } that._makeUnselectable(); that._hideBusy(); that._angularItems("compile"); that.trigger("dataBound"); }, select: function (li) { this._select(li); }, search: function (word) { var that = this, options = that.options, ignoreCase = options.ignoreCase, separator = options.separator, length; word = word || that._accessor(); that._current = null; clearTimeout(that._typing); if (separator) { word = wordAtCaret(caret(that.element)[0], word, separator); } length = word.length; if (!length || length >= options.minLength) { that._open = true; that._filterSource({ value: ignoreCase ? word.toLowerCase() : word, operator: options.filter, field: options.dataTextField, ignoreCase: ignoreCase }); } }, suggest: function (word) { var that = this, key = that._last, value = that._accessor(), element = that.element[0], caretIdx = caret(element)[0], separator = that.options.separator, words = value.split(separator), wordIndex = indexOfWordAtCaret(caretIdx, value, separator), selectionEnd = caretIdx, idx; if (key == keys.BACKSPACE || key == keys.DELETE) { that._last = undefined; return; } word = word || ""; if (typeof word !== "string") { idx = List.inArray(word[0], that.ul[0]); if (idx > -1) { word = that._text(that._data()[idx]); } else { word = ""; } } if (caretIdx <= 0) { caretIdx = value.toLowerCase().indexOf(word.toLowerCase()) + 1; } idx = value.substring(0, caretIdx).lastIndexOf(separator); idx = idx > -1 ? caretIdx - (idx + separator.length) : caretIdx; value = words[wordIndex].substring(0, idx); if (word) { idx = word.toLowerCase().indexOf(value.toLowerCase()); if (idx > -1) { word = word.substring(idx + value.length); selectionEnd = caretIdx + word.length; value += word; } if (separator && words[words.length - 1] !== "") { words.push(""); } } words[wordIndex] = value; that._accessor(words.join(separator || "")); if (element === activeElement()) { caret(element, caretIdx, selectionEnd); } }, value: function (value) { if (value !== undefined) { this._accessor(value); this._old = this._accessor(); } else { return this._accessor(); } }, _accessor: function (value) { var that = this, element = that.element[0]; if (value !== undefined) { element.value = value === null ? "" : value; that._placeholder(); } else { value = element.value; if (element.className.indexOf("k-readonly") > -1) { if (value === that.options.placeholder) { return ""; } else { return value; } } return value; } }, _accept: function (li) { var element = this.element; this._focus(li); caret(element, element.val().length); }, _keydown: function (e) { var that = this, ul = that.ul[0], key = e.keyCode, current = that._current, visible = that.popup.visible(); that._last = key; if (key === keys.DOWN) { if (visible) { that._move(current ? current.next() : $(ul.firstChild)); } e.preventDefault(); } else if (key === keys.UP) { if (visible) { that._move(current ? current.prev() : $(ul.lastChild)); } e.preventDefault(); } else if (key === keys.ENTER || key === keys.TAB) { if (key === keys.ENTER && that.popup.visible()) { e.preventDefault(); } that._accept(current); } else if (key === keys.ESC) { if (that.popup.visible()) { e.preventDefault(); } that.close(); } else { that._search(); } }, _move: function (li) { var that = this; li = li[0] ? li : null; that.current(li); if (that.options.suggest) { that.suggest(li); } }, _hideBusy: function () { var that = this; clearTimeout(that._busy); that._loading.hide(); that.element.attr("aria-busy", false); that._busy = null; }, _showBusy: function () { var that = this; if (that._busy) { return; } that._busy = setTimeout(function () { that.element.attr("aria-busy", true); that._loading.show(); }, 100); }, _placeholder: function(show) { if (placeholderSupported) { return; } var that = this, element = that.element, placeholder = that.options.placeholder, value; if (placeholder) { value = element.val(); if (show === undefined) { show = !value; } if (!show) { if (value !== placeholder) { placeholder = value; } else { placeholder = ""; } } if (value === that._old && !show) { return; } element.toggleClass("k-readonly", show) .val(placeholder); if (!placeholder && element[0] === document.activeElement) { caret(element[0], 0, 0); } } }, _search: function () { var that = this; clearTimeout(that._typing); that._typing = setTimeout(function () { if (that._prev !== that._accessor()) { that._prev = that._accessor(); that.search(); } }, that.options.delay); }, _select: function (li) { var that = this, separator = that.options.separator, data = that._data(), text, idx; li = $(li); if (li[0] && !li.hasClass(SELECTED)) { idx = List.inArray(li[0], that.ul[0]); if (idx > -1) { data = data[idx]; text = that._text(data); if (separator) { text = replaceWordAtCaret(caret(that.element)[0], that._accessor(), text, separator); } that._accessor(text); that._prev = that._accessor(); that.current(li.addClass(SELECTED)); } } }, _loader: function() { this._loading = $('').insertAfter(this.element); }, _toggleHover: function(e) { $(e.currentTarget).toggleClass(HOVER, e.type === "mouseenter"); }, _wrapper: function () { var that = this, element = that.element, DOMelement = element[0], wrapper; wrapper = element.parent(); if (!wrapper.is("span.k-widget")) { wrapper = element.wrap("").parent(); } //aria wrapper.attr("tabindex", -1); wrapper.attr("role", "presentation"); //end wrapper[0].style.cssText = DOMelement.style.cssText; element.css({ width: "100%", height: DOMelement.style.height }); that._focused = that.element; that.wrapper = wrapper .addClass("k-widget k-autocomplete k-header") .addClass(DOMelement.className); } }); ui.plugin(AutoComplete); })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, ui = kendo.ui, Select = ui.Select, os = kendo.support.mobileOS, activeElement = kendo._activeElement, keys = kendo.keys, ns = ".kendoDropDownList", DISABLED = "disabled", READONLY = "readonly", CHANGE = "change", FOCUSED = "k-state-focused", DEFAULT = "k-state-default", STATEDISABLED = "k-state-disabled", ARIA_DISABLED = "aria-disabled", ARIA_READONLY = "aria-readonly", SELECTED = "k-state-selected", HOVEREVENTS = "mouseenter" + ns + " mouseleave" + ns, TABINDEX = "tabindex", STATE_FILTER = "filter", STATE_ACCEPT = "accept", proxy = $.proxy; var DropDownList = Select.extend( { init: function(element, options) { var that = this, index = options && options.index, optionLabel, useOptionLabel, text; that.ns = ns; options = $.isArray(options) ? { dataSource: options } : options; Select.fn.init.call(that, element, options); options = that.options; element = that.element.on("focus" + ns, proxy(that._focusHandler, that)); that._inputTemplate(); that._reset(); that._prev = ""; that._word = ""; that._wrapper(); that._tabindex(); that.wrapper.data(TABINDEX, that.wrapper.attr(TABINDEX)); that._span(); that._popup(); that._mobile(); that._dataSource(); that._ignoreCase(); that._filterHeader(); that._aria(); that._enable(); that._oldIndex = that.selectedIndex = -1; that._cascade(); if (index !== undefined) { options.index = index; } if (options.autoBind) { that.dataSource.fetch(); } else if (that.selectedIndex === -1) { text = options.text || ""; if (!text) { optionLabel = options.optionLabel; useOptionLabel = optionLabel && options.index === 0; if (that._isSelect) { if (useOptionLabel) { text = optionLabel; } else { text = element.children(":selected").text(); } } else if (!element[0].value && useOptionLabel) { text = optionLabel; } } that._textAccessor(text); } kendo.notify(that); }, options: { name: "DropDownList", enabled: true, autoBind: true, index: 0, text: null, value: null, template: "", valueTemplate: "", delay: 500, height: 200, dataTextField: "", dataValueField: "", optionLabel: "", cascadeFrom: "", cascadeFromField: "", ignoreCase: true, animation: {}, filter: "none", minLength: 1 }, events: [ "open", "close", CHANGE, "select", "filtering", "dataBinding", "dataBound", "cascade" ], setOptions: function(options) { Select.fn.setOptions.call(this, options); this._template(); this._inputTemplate(); this._accessors(); this._filterHeader(); this._enable(); this._aria(); }, destroy: function() { var that = this; that.wrapper.off(ns); that.element.off(ns); that._inputWrapper.off(ns); that._arrow.off(); that._arrow = null; Select.fn.destroy.call(that); }, open: function() { var that = this; if (that.popup.visible()) { return; } if (!that.ul[0].firstChild || that._state === STATE_ACCEPT) { that._open = true; that._state = "rebind"; if (that.filterInput) { that.filterInput.val(""); } that._filterSource(); } else { that.popup.open(); that._focusElement(that.filterInput); that._scroll(that._current); } }, toggle: function(toggle) { this._toggle(toggle, true); }, refresh: function() { var that = this, data = that._data(), length = data.length, optionLabel = that.options.optionLabel, filtered = that._state === STATE_FILTER, element = that.element[0], selectedIndex, value; that.trigger("dataBinding"); if (that._current) { that.current(null); } that._angularItems("cleanup"); that.ul[0].innerHTML = kendo.render(that.template, data); that._angularItems("compile"); that._height(filtered ? (length || 1) : length); if (that.popup.visible()) { that.popup._position(); } if (that._isSelect) { selectedIndex = element.selectedIndex; value = that.value(); if (length) { if (optionLabel) { optionLabel = that._option("", that._optionLabelText(optionLabel)); } } else if (value) { selectedIndex = 0; optionLabel = that._option(value, that.text()); } that._options(data, optionLabel); element.selectedIndex = selectedIndex === -1 ? 0 : selectedIndex; } that._hideBusy(); that._makeUnselectable(); if (!filtered) { if (that._open) { that.toggle(!!length); } that._open = false; if (!that._fetch) { if (length) { that._selectItem(); } else if (that._textAccessor() !== optionLabel) { that.element.val(""); that._textAccessor(""); } } } else { that.current($(that.ul[0].firstChild)); } that._bound = !!length; that.trigger("dataBound"); }, text: function (text) { var that = this; var dataItem, loweredText; var ignoreCase = that.options.ignoreCase; text = text === null ? "" : text; if (text !== undefined) { if (typeof text === "string") { loweredText = ignoreCase ? text.toLowerCase() : text; dataItem = that._select(function(data) { data = that._text(data); if (ignoreCase) { data = (data + "").toLowerCase(); } return data === loweredText; }); if (dataItem) { text = dataItem; } } that._textAccessor(text); } else { return that._textAccessor(); } }, value: function(value) { var that = this, idx, hasValue; if (value !== undefined) { if (value !== null) { value = value.toString(); } that._selectedValue = value; hasValue = value || (that.options.optionLabel && !that.element[0].disabled && value === ""); if (hasValue && that._fetchItems(value)) { return; } idx = that._index(value); that.select(idx > -1 ? idx : 0); } else { return that._accessor(); } }, _focusHandler: function() { this.wrapper.focus(); }, _focusinHandler: function() { this._inputWrapper.addClass(FOCUSED); this._prevent = false; }, _focusoutHandler: function() { var that = this; var filtered = that._state === STATE_FILTER; var isIFrame = window.self !== window.top; if (!that._prevent) { if (filtered) { that._select(that._current); } if (!filtered || that.dataItem()) { that._triggerCascade(); } if (kendo.support.mobileOS.ios && isIFrame) { that._change(); } else { that._blur(); } that._inputWrapper.removeClass(FOCUSED); that._prevent = true; that._open = false; that.element.blur(); } }, _wrapperMousedown: function() { this._prevent = !!this.filterInput; }, _wrapperClick: function(e) { e.preventDefault(); this._focused = this.wrapper; this._toggle(); }, _editable: function(options) { var that = this, element = that.element, disable = options.disable, readonly = options.readonly, wrapper = that.wrapper.add(that.filterInput).off(ns), dropDownWrapper = that._inputWrapper.off(HOVEREVENTS); if (!readonly && !disable) { element.removeAttr(DISABLED).removeAttr(READONLY); dropDownWrapper .addClass(DEFAULT) .removeClass(STATEDISABLED) .on(HOVEREVENTS, that._toggleHover); wrapper .attr(TABINDEX, wrapper.data(TABINDEX)) .attr(ARIA_DISABLED, false) .attr(ARIA_READONLY, false) .on("keydown" + ns, proxy(that._keydown, that)) .on("focusin" + ns, proxy(that._focusinHandler, that)) .on("focusout" + ns, proxy(that._focusoutHandler, that)) .on("mousedown" + ns, proxy(that._wrapperMousedown, that)); that.wrapper.on("click" + ns, proxy(that._wrapperClick, that)); if (!that.filterInput) { wrapper.on("keypress" + ns, proxy(that._keypress, that)); } } else if (disable) { wrapper.removeAttr(TABINDEX); dropDownWrapper .addClass(STATEDISABLED) .removeClass(DEFAULT); } else { dropDownWrapper .addClass(DEFAULT) .removeClass(STATEDISABLED); wrapper .on("focusin" + ns, proxy(that._focusinHandler, that)) .on("focusout" + ns, proxy(that._focusoutHandler, that)); } element.attr(DISABLED, disable) .attr(READONLY, readonly); wrapper.attr(ARIA_DISABLED, disable) .attr(ARIA_READONLY, readonly); }, _accept: function(li, key) { var that = this; var activeFilter = that.filterInput && that.filterInput[0] === activeElement(); that._focus(li); that._focusElement(that.wrapper); if (activeFilter && key === keys.TAB) { that.wrapper.focusout(); } }, _option: function(value, text) { return '"; }, _optionLabelText: function() { var options = this.options, dataTextField = options.dataTextField, optionLabel = options.optionLabel; if (optionLabel && dataTextField && typeof optionLabel === "object") { return this._text(optionLabel); } return optionLabel; }, _data: function() { var that = this, options = that.options, optionLabel = options.optionLabel, textField = options.dataTextField, valueField = options.dataValueField, data = that.dataSource.view(), length = data.length, first = optionLabel, idx = 0; if (optionLabel && length) { if (typeof optionLabel === "object") { first = optionLabel; } else if (textField) { first = {}; textField = textField.split("."); valueField = valueField.split("."); assign(first, valueField, ""); assign(first, textField, optionLabel); } first = new kendo.data.ObservableArray([first]); for (; idx < length; idx++) { first.push(data[idx]); } data = first; } return data; }, _selectItem: function() { Select.fn._selectItem.call(this); if (!this.current()) { this.select(0); } }, _keydown: function(e) { var that = this; var key = e.keyCode; var altKey = e.altKey; var ul = that.ul[0]; var handled; if (key === keys.LEFT) { key = keys.UP; } else if (key === keys.RIGHT) { key = keys.DOWN; } e.keyCode = key; handled = that._move(e); if (!that.popup.visible() || !that.filterInput) { if (key === keys.HOME) { handled = true; e.preventDefault(); that._select(ul.firstChild); } else if (key === keys.END) { handled = true; e.preventDefault(); that._select(ul.lastChild); } } if (altKey && key === keys.UP) { that._focusElement(that.wrapper); } if (!altKey && !handled && that.filterInput) { that._search(); } }, _selectNext: function(word, index) { var that = this, text, startIndex = index, data = that._data(), length = data.length, ignoreCase = that.options.ignoreCase, action = function(text, index) { text = text + ""; if (ignoreCase) { text = text.toLowerCase(); } if (text.indexOf(word) === 0) { that._select(index); that._triggerEvents(); return true; } }; for (; index < length; index++) { text = that._text(data[index]); if (text && action(text, index)) { return true; } } if (startIndex > 0 && startIndex < length) { index = 0; for (; index <= startIndex; index++) { text = that._text(data[index]); if (text && action(text, index)) { return true; } } } return false; }, _keypress: function(e) { var that = this; if (e.which === 0 || e.keyCode === kendo.keys.ENTER) { return; } var character = String.fromCharCode(e.charCode || e.keyCode); var index = that.selectedIndex; var word = that._word; if (that.options.ignoreCase) { character = character.toLowerCase(); } if (character === " ") { e.preventDefault(); } if (that._last === character && word.length <= 1 && index > -1) { if (!word) { word = character; } if (that._selectNext(word, index + 1)) { return; } } that._word = word + character; that._last = character; that._search(); }, _popupOpen: function() { var popup = this.popup; popup.wrapper = kendo.wrap(popup.element); if (popup.element.closest(".km-root")[0]) { popup.wrapper.addClass("km-popup km-widget"); this.wrapper.addClass("km-widget"); } }, _popup: function() { Select.fn._popup.call(this); this.popup.one("open", proxy(this._popupOpen, this)); }, _focusElement: function(element) { var active = activeElement(); var wrapper = this.wrapper; var filterInput = this.filterInput; var compareElement = element === filterInput ? wrapper : filterInput; if (filterInput && compareElement[0] === active) { this._prevent = true; this._focused = element.focus(); } }, _filter: function(word) { if (word) { var that = this; var ignoreCase = that.options.ignoreCase; if (ignoreCase) { word = word.toLowerCase(); } that._select(function(dataItem) { var text = that._text(dataItem); if (text !== undefined) { text = (text + ""); if (ignoreCase) { text = text.toLowerCase(); } return text.indexOf(word) === 0; } }); } }, _search: function() { var that = this, dataSource = that.dataSource, index = that.selectedIndex, word = that._word; clearTimeout(that._typing); if (that.options.filter !== "none") { that._typing = setTimeout(function() { var value = that.filterInput.val(); if (that._prev !== value) { that._prev = value; that.search(value); } that._typing = null; }, that.options.delay); } else { that._typing = setTimeout(function() { that._word = ""; }, that.options.delay); if (index === -1) { index = 0; } if (!that.ul[0].firstChild) { dataSource.one(CHANGE, function () { if (dataSource.data()[0] && index > -1) { that._selectNext(word, index); } }).fetch(); return; } that._selectNext(word, index); that._triggerEvents(); } }, _select: function(li) { var that = this, current = that._current, data = null, value, idx; li = that._get(li); if (li && li[0] && !li.hasClass(SELECTED)) { if (that._state === STATE_FILTER) { that._state = STATE_ACCEPT; } if (current) { current.removeClass(SELECTED); } idx = ui.List.inArray(li[0], that.ul[0]); if (idx > -1) { that.selectedIndex = idx; data = that._data()[idx]; value = that._value(data); if (value === null) { value = ""; } that._textAccessor(data); that._accessor(value !== undefined ? value : that._text(data), idx); that._selectedValue = that._accessor(); that.current(li.addClass(SELECTED)); if (that._optionID) { that._current.attr("aria-selected", true); } } } return data; }, _triggerEvents: function() { if (!this.popup.visible()) { this._triggerCascade(); this._change(); } }, _mobile: function() { var that = this, popup = that.popup, root = popup.element.parents(".km-root").eq(0); if (root.length && os) { popup.options.animation.open.effects = (os.android || os.meego) ? "fadeIn" : (os.ios || os.wp) ? "slideIn:up" : popup.options.animation.open.effects; } }, _filterHeader: function() { var icon; var options = this.options; var filterEnalbed = options.filter !== "none"; if (this.filterInput) { this.filterInput .off(ns) .parent() .remove(); this.filterInput = null; } if (filterEnalbed) { icon = 'select'; this.filterInput = $('') .attr({ role: "listbox", "aria-haspopup": true, "aria-expanded": false }); this.list .prepend($('') .append(this.filterInput.add(icon))); } }, _span: function() { var that = this, wrapper = that.wrapper, SELECTOR = "span.k-input", span; span = wrapper.find(SELECTOR); if (!span[0]) { wrapper.append(' select') .append(that.element); span = wrapper.find(SELECTOR); } that.span = span; that._inputWrapper = $(wrapper[0].firstChild); that._arrow = wrapper.find(".k-icon"); }, _wrapper: function() { var that = this, element = that.element, DOMelement = element[0], wrapper; wrapper = element.parent(); if (!wrapper.is("span.k-widget")) { wrapper = element.wrap("").parent(); wrapper[0].style.cssText = DOMelement.style.cssText; } element.hide(); that._focused = that.wrapper = wrapper .addClass("k-widget k-dropdown k-header") .addClass(DOMelement.className) .css("display", "") .attr({ unselectable: "on", role: "listbox", "aria-haspopup": true, "aria-expanded": false }); }, _clearSelection: function() { var that = this; var optionLabel = that.options.optionLabel; that.options.value = ""; that._selectedValue = ""; if (that.dataSource.view()[0] && (optionLabel || that._userTriggered)) { that.select(0); return; } that.selectedIndex = -1; that.element.val(""); that._textAccessor(that.options.optionLabel); }, _inputTemplate: function() { var that = this, template = that.options.valueTemplate; if (!template) { template = $.proxy(kendo.template('#:this._text(data)#', { useWithBlock: false }), that); } else { template = kendo.template(template); } that.valueTemplate = template; }, _textAccessor: function(text) { var dataItem = this.dataItem(); var options = this.options; var span = this.span; if (text !== undefined) { if ($.isPlainObject(text) || text instanceof kendo.data.ObservableObject) { dataItem = text; } else if (!dataItem || this._text(dataItem) !== text) { if (options.dataTextField) { dataItem = {}; assign(dataItem, options.dataTextField.split("."), text); assign(dataItem, options.dataValueField.split("."), this._accessor()); } else { dataItem = text; } } var getElements = function(){ return { elements: span.get(), data: [ { dataItem: dataItem } ] }; }; this.angular("cleanup", getElements); span.html(this.valueTemplate(dataItem)); this.angular("compile", getElements); } else { return span.text(); } } }); function assign(instance, fields, value) { var idx = 0, lastIndex = fields.length - 1, field; for (; idx < lastIndex; ++idx) { field = fields[idx]; if (!(field in instance)) { instance[field] = {}; } instance = instance[field]; } instance[fields[lastIndex]] = value; } ui.plugin(DropDownList); })(window.kendo.jQuery); (function($, undefined) { var kendo = window.kendo, ui = kendo.ui, List = ui.List, Select = ui.Select, caret = kendo.caret, support = kendo.support, placeholderSupported = support.placeholder, activeElement = kendo._activeElement, keys = kendo.keys, ns = ".kendoComboBox", CLICK = "click" + ns, MOUSEDOWN = "mousedown" + ns, DISABLED = "disabled", READONLY = "readonly", CHANGE = "change", DEFAULT = "k-state-default", FOCUSED = "k-state-focused", STATEDISABLED = "k-state-disabled", ARIA_DISABLED = "aria-disabled", ARIA_READONLY = "aria-readonly", STATE_SELECTED = "k-state-selected", STATE_FILTER = "filter", STATE_ACCEPT = "accept", STATE_REBIND = "rebind", HOVEREVENTS = "mouseenter" + ns + " mouseleave" + ns, NULL = null, proxy = $.proxy; var ComboBox = Select.extend({ init: function(element, options) { var that = this, text; that.ns = ns; options = $.isArray(options) ? { dataSource: options } : options; Select.fn.init.call(that, element, options); options = that.options; element = that.element.on("focus" + ns, proxy(that._focusHandler, that)); options.placeholder = options.placeholder || element.attr("placeholder"); that._reset(); that._wrapper(); that._input(); that._tabindex(that.input); that._popup(); that._dataSource(); that._ignoreCase(); that._enable(); that._oldIndex = that.selectedIndex = -1; that._cascade(); that._aria(); if (options.autoBind) { that._filterSource(); //TODO: diff when just bind and actually filter } else { text = options.text; if (!text && that._isSelect) { text = element.children(":selected").text(); } if (text) { that.input.val(text); that._prev = text; } } if (!text) { that._placeholder(); } kendo.notify(that); }, options: { name: "ComboBox", enabled: true, index: -1, text: null, value: null, autoBind: true, delay: 200, dataTextField: "", dataValueField: "", minLength: 0, height: 200, highlightFirst: true, template: "", filter: "none", placeholder: "", suggest: false, cascadeFrom: "", cascadeFromField: "", ignoreCase: true, animation: {} }, events:[ "open", "close", CHANGE, "select", "filtering", "dataBinding", "dataBound", "cascade" ], setOptions: function(options) { Select.fn.setOptions.call(this, options); this._template(); this._accessors(); this._aria(); }, current: function(li) { var that = this, current = that._current; if (li === undefined) { return current; } if (current) { current.removeClass(STATE_SELECTED); } Select.fn.current.call(that, li); }, destroy: function() { var that = this; that.input.off(ns); that.element.off(ns); that._inputWrapper.off(ns); Select.fn.destroy.call(that); }, _focusHandler: function() { this.input.focus(); }, _arrowClick: function() { this._toggle(); }, _inputFocus: function() { this._inputWrapper.addClass(FOCUSED); this._placeholder(false); }, _inputFocusout: function() { var that = this; that._inputWrapper.removeClass(FOCUSED); clearTimeout(that._typing); that._typing = null; if (that.options.text !== that.input.val()) { that.text(that.text()); } that._placeholder(); that._blur(); that.element.blur(); }, _editable: function(options) { var that = this, disable = options.disable, readonly = options.readonly, wrapper = that._inputWrapper.off(ns), input = that.element.add(that.input.off(ns)), arrow = that._arrow.parent().off(CLICK + " " + MOUSEDOWN); if (!readonly && !disable) { wrapper .addClass(DEFAULT) .removeClass(STATEDISABLED) .on(HOVEREVENTS, that._toggleHover); input.removeAttr(DISABLED) .removeAttr(READONLY) .attr(ARIA_DISABLED, false) .attr(ARIA_READONLY, false); arrow.on(CLICK, proxy(that._arrowClick, that)) .on(MOUSEDOWN, function(e) { e.preventDefault(); }); that.input .on("keydown" + ns, proxy(that._keydown, that)) .on("focus" + ns, proxy(that._inputFocus, that)) .on("focusout" + ns, proxy(that._inputFocusout, that)); } else { wrapper .addClass(disable ? STATEDISABLED : DEFAULT) .removeClass(disable ? DEFAULT : STATEDISABLED); input.attr(DISABLED, disable) .attr(READONLY, readonly) .attr(ARIA_DISABLED, disable) .attr(ARIA_READONLY, readonly); } }, open: function() { var that = this; var state = that._state; var serverFiltering = that.dataSource.options.serverFiltering; if (that.popup.visible()) { return; } if ((!that.ul[0].firstChild && state !== STATE_FILTER) || (state === STATE_ACCEPT && !serverFiltering)) { that._open = true; that._state = STATE_REBIND; that._filterSource(); } else { that.popup.open(); that._scroll(that._current); } }, refresh: function() { var that = this, ul = that.ul[0], options = that.options, state = that._state, data = that._data(), length = data.length, keepState = true, hasChild, custom; that._angularItems("cleanup"); that.trigger("dataBinding"); ul.innerHTML = kendo.render(that.template, data); that._height(length); if (that.popup.visible()) { that.popup._position(); } if (that._isSelect) { hasChild = that.element[0].children[0]; if (state === STATE_REBIND) { that._state = ""; } custom = that._option; that._option = undefined; that._options(data); if (custom && custom[0].selected) { that._custom(custom.val(), keepState); } else if (!that._bound && !hasChild) { that._custom("", keepState); } } if (length) { if (options.highlightFirst) { that.current($(ul.firstChild)); } if (options.suggest && that.input.val() && that._request !== undefined /*first refresh ever*/) { that.suggest($(ul.firstChild)); } } if (state !== STATE_FILTER && !that._fetch) { that._selectItem(); } if (that._open) { that._open = false; if (that._typing && that.input[0] !== activeElement()) { that.popup.close(); } else { that.toggle(!!length); } that._typing = null; } if (that._touchScroller) { that._touchScroller.reset(); } that._makeUnselectable(); that._hideBusy(); that._bound = true; that._angularItems("compile"); that.trigger("dataBound"); }, suggest: function(word) { var that = this, element = that.input[0], value = that.text(), caretIdx = caret(element)[0], key = that._last, idx; if (key == keys.BACKSPACE || key == keys.DELETE) { that._last = undefined; return; } word = word || ""; if (typeof word !== "string") { idx = List.inArray(word[0], that.ul[0]); if (idx > -1) { word = that._text(that.dataSource.view()[idx]); } else { word = ""; } } if (caretIdx <= 0) { caretIdx = value.toLowerCase().indexOf(word.toLowerCase()) + 1; } if (word) { idx = word.toLowerCase().indexOf(value.toLowerCase()); if (idx > -1) { value += word.substring(idx + value.length); } } else { value = value.substring(0, caretIdx); } if (value.length !== caretIdx || !word) { element.value = value; if (element === activeElement()) { caret(element, caretIdx, value.length); } } }, text: function (text) { text = text === null ? "" : text; var that = this; var input = that.input[0]; var ignoreCase = that.options.ignoreCase; var loweredText = text; var dataItem; var value; if (text !== undefined) { dataItem = that.dataItem(); if (dataItem && that._text(dataItem) === text) { value = that._value(dataItem); if (value === null) { value = ""; } else { value += ""; } if (value === that._old) { that._triggerCascade(); return; } } if (ignoreCase) { loweredText = loweredText.toLowerCase(); } that._select(function(data) { data = that._text(data); if (ignoreCase) { data = (data + "").toLowerCase(); } return data === loweredText; }); if (that.selectedIndex < 0) { that._custom(text); input.value = text; } that._prev = input.value; that._triggerCascade(); } else { return input.value; } }, toggle: function(toggle) { this._toggle(toggle, true); }, value: function(value) { var that = this, options = that.options, idx; if (value !== undefined) { if (value !== null) { value = value.toString(); } that._selectedValue = value; if (!that._open && value && that._fetchItems(value)) { return; } idx = that._index(value); if (idx > -1) { that.select(idx); } else { that.current(NULL); that._custom(value); if (options.value !== value || options.text !== that.input.val()) { that.text(value); that._placeholder(); } } that._old = that._accessor(); that._oldIndex = that.selectedIndex; } else { return that._accessor(); } }, _accept: function(li) { var that = this; if (li) { that._focus(li); } else { that.text(that.text()); that._change(); } }, _custom: function(value, keepState) { var that = this; var element = that.element; var custom = that._option; if (that._state === STATE_FILTER && !keepState) { that._state = STATE_ACCEPT; } if (that._isSelect) { if (!custom) { custom = that._option = $("