|
That's not an error in the .NET Framework, but the application you are running. It is trying to access an object that has already been disposed - like accessing memory that's already freed.
S3TH_2019 wrote: Now I have made all possibile updates for windows and nothing changed. No update can correct a fault in the application. Ask the person who wrote it to take a look at it.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Hi Eddy,
Thank you for replying, if that is an error of application then how can my colleagues from work, that have similar pc's, with Win 10 Pro installed and this app (esims) work with it? Without having this trouble with this error?
|
|
|
|
|
Similar doens't matter; if there's an fault in the app, then it doens't matter how similar the other environments are.
They can work with it because their system is built like the programmer who wrote your app expects it to be. Doesn't mean the fault is with Windows, and the exception-message confirms that. In some circumstance, the app tries to access memory that it shouldn't, which is quite hard to do in .NET.
If you seriously think this is a bug in .NET, then it is as simple as reporting it to Microsoft. Still, you might want to Google the phrase "SQL is not broken".
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
That's not a bug in the .NET Framework.
This could also be a problem with timing or bad threading code. The apps works perfectly fine in most circumstances, but you happen to find the one circumstance where it fails.
The stack trace you posted suggests a problem where the report control is going out of scope when the rest of the code doesn't expect it. The form Universum_Client.ReportForms.frmPrev seems like it's loading the report but the form is destroyed before the control can load the report.
|
|
|
|
|
Trying to display my code in times table format but keeps coming out in a straight line
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TestLibary;
namespace ICA25
{
class Program
{
static void Main(string[] args)
{
string sTitle;
bool bExit = false;
sTitle = ("ICA 25 - Times table");
Console.WriteLine("{0,60}\n", sTitle);
do
{
{
int[,] iFinal;
int iNum = GetValue("Please enter the size (4-20) of the times table: ", 4, 20);
Console.Write("Here is the times table for that size: \n");
iFinal = GenerateTT(iNum);
DisplayTT(iFinal);
}
}
while ((YesNo("Would you like to do another? Y or N:") == "Y") && !bExit);
bExit = true;
}
static public int GetValue(string s, int iMin, int iMax)
{
int iNum;
Utilities.GetValue(out iNum, s, 4, 20);
return iNum;
}
static public int[,] GenerateTT(int iValue)
{
int[,] iNum = new int[iValue, iValue];
for (int iRow = 0; iRow < iNum.GetLength(0); iRow++)
{
for (int iCol = 0; iCol < iNum.GetLength(1); iCol++)
{
iNum[iRow, iCol] = (iCol) * (iRow);
}
}
return iNum;
}
static public void DisplayTT(int[,] iFinal)
{
for (int iRow = 0; iRow < iFinal.GetLength(0); iRow++)
{
{
for (int iCol = 0; iCol < iFinal.GetLength(1); iCol++)
{
Console.Write( iFinal[iRow, iCol]);
{
Console.WriteLine();
}
}
}
}
}
static public string YesNo(string sPrompt)
{
string stemp;
do
{
Console.Write("{0}", sPrompt);
stemp = Console.ReadLine().ToString().ToUpper();
if (stemp == "N")
{
Console.Write("Bye");
Console.ReadLine();
}
if (stemp != "Y" && stemp != "N")
{
Console.Write("\nPlease answer Y or N.");
}
}
while ((stemp != "Y") && (stemp != "N"));
return stemp;
}
}
}
|
|
|
|
|
Don't repost the same question in multiple forums.
|
|
|
|
|
To illustrate backtracking to a colleague, I wrote a small sudoku solver. To measure its performance I added a counter of how many attempts it makes to place a digit. (For the most difficult problem I have found until now, it makes more than 57 million attempts.)
What did not surprise me: Building for x86 or x64 does not affect execution time significantly; nothing in the code benefits from greater word size. The average time to place a digit and evaluate its validity takes about 11-12 ns. (If anything surprised me, it would be that it is that fast!). Building for "Any CPU" gave similar timings, which didn't surprise me either: dotNET does a JIT compilation to native code. This backtracking core makes no use of libraries or other "external" resources, nothing to slow it down by dotNET overhead.
Nor was I surprised to see that compiling for debug mode slowed down execution by a factor of approximately 2.5, to around 30 ns/attempt, for all three CPU alternatives. I don't know the details of what happens in debug mode, but assume that e.g. code optimization is more or less turned off.
Then comes the surprise:
I took the code home to my home machine. The CPU is a few years older (a 2014 vintage i7-5820K@3.3GHz), so I expected that it would be slower than my office PC (an i7-7700@3.6GHz). Not much! Less than 10%, for all three CPU alternatives in Debug mode. And for x86 and x64 in Debug mode.
But for "Any CPU", the loop time is about 31-32 ns per attempt regardless of whether I build in Release mode or Debug mode. How come? Why is the execution time cut by 60% at my office PC, but not at my home PC? Even at my home PC, it is cut by 60% when I build for x86/x64, it is only the "Any CPU" alternative that seems to insist on Release being just as slow as Debug.
Why is that?
I copied all the project files to my home computer, so all settings should be the same. I build for dotNET 4.7.1 on both machines.
There are two differences, though.
First: At home, I use the "Community" edition of VS2017, while at work I use VS2017 Professional. But if the philosophy is that "To get that optimized speed, you must pay for Visual Studio", why do I get the optimization for x86/x64 in the (free) Community version? Both VS installations are fully updated to 15.9.16.
Second: At home I still run Windows 7 (yes, I know, I know...). But how could the OS version affect a tight, CPU only, code loop that makes no external calls? And only if the code is compiled from a dotNET assembly, not for native x86/x64 code doing exactly the same thing?
Can there be anything in some initialization/configuration file (not in any project file) saying that optimizations should not be performed when compiling for Any CPU? In theory, it could even be in the JIT code generator in the dotNET runtime, but a factor of 2.5 is so large that I am more tempted to think that the optimization is done at a higher level - you don't have that much flexibility in the code generation phase (when the CPU architecture is given).
Is the culprit the OS or the Community version of VS? Or have I overlooked some essential factor?
|
|
|
|
|
Or maybe one of your computers favors background processing over foreground processing; or the swap space is too small; or the hdd versus ssd is too slow; or calculations are being offloaded to the GPU; or there are too many browser sessions open; or the L1 cache is smaller; or ...
The Master said, 'Am I indeed possessed of knowledge? I am not knowing. But if a mean person, who appears quite empty-like, ask anything of me, I set it forth from one end to the other, and exhaust it.'
― Confucian Analects
|
|
|
|
|
Hi, I'm writing a small app for my own use to watch a certain folder and back it up to another location when files are created or amended.
I wrote the script for the file system watcher first in just the Powershell console, and this worked nicely.
Once I added it into my GUI (winforms) I discovered it would not work when activated from a button, and after a bit of investigation I can to realise that I would need to run it via Runspace.
I've written a couple of GUI scripts with runspaces so was confident I could do it (i'm not a programmer by profession, it's just a personal interest)
I've got it to work by firing the runspace job from the "start" button, but the issue I now face is that the button to stop the monitoring doesn't work.
I'm assuming because the Filesystem monitor is running in a separate Powershell session.
I get :
Unregister-Event : Event subscription with identifier 'FileCreated' does not exist.
At D:\Programming\PowerShell\.Current Projects\TAB-File Watcher\out\TABFileWatcher.ps1:84 char:5
+ Unregister-Event FileCreated
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Unregister-Event], ArgumentException
+ FullyQualifiedErrorId : INVALID_SOURCE_IDENTIFIER,Microsoft.PowerShell.Commands.UnregisterEventCommand
And when I run Get-EventSubscriber from VS Code terminal after closing the GUI, It does not display any Event subscriptions, BUT the event is clearly running as if I manually add or edit a file it copies it to the destination folder.
So my question is .. how do I access \ stop the event from a button which is not within the same Runspace ?
Or is there another (better) way of doing this ?
The relevant code is :
$RSscriptblock = {
$Output_RTB = $sync.RTB
$sourceDirectory = $sync.SD
$filter = $sync.SF
$destination = $sync.DES
$fsw = New-Object IO.FileSystemWatcher $sourceDirectory, $filter -Property @{
IncludeSubdirectories = $false
NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
$Output_RTB.SelectionColor = "Green"
$Output_RTB.AppendText("The file '$name' was $changeType at $timeStamp`r`n")
Copy-item -Force -Recurse $sourceDirectory -Destination $destination }
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
$Output_RTB.SelectionColor = "Green"
$Output_RTB.AppendText("The file '$name' was $changeType at $timeStamp`r`n")
Copy-item -Force -Recurse $sourceDirectory -Destination $destination }
$Output_RTB.SelectionColor = "Green"
$Output_RTB.AppendText("Monitoring has Started`r`n")
$Output_RTB.Select($Output_RTB.Text.Length, 0)
$Output_RTB.ScrollToCaret()
}
function Start-RSJob {
$sync = [Hashtable]::Synchronized(@{RTB = $Output_RTB; SD = $Script:sourceDirectory; SF = $Script:filter; DES = $Script:destination})
$rsjob = [PowerShell]::Create().AddScript($RSscriptblock)
$runspace = [RunspaceFactory]::CreateRunspace()
$runspace.ApartmentState = "STA"
$runspace.ThreadOptions = "ReuseThread"
$runspace.Open()
$runspace.SessionStateProxy.SetVariable("sync", $sync)
$rsjob.Runspace = $runspace
$rsjob.BeginInvoke()
}
function StopMonitoring {
Unregister-Event FileCreated
Unregister-Event FileChanged
$Output_RTB.SelectionColor = "Red"
$Output_RTB.AppendText("Monitoring has Stopped`r`n")
$Output_RTB.Select($Output_RTB.Text.Length, 0)
$Output_RTB.ScrollToCaret()
}
#
#Start_Button
#
$Start_Button.BackColor = [System.Drawing.SystemColors]::Control
$Start_Button.FlatAppearance.BorderColor = [System.Drawing.Color]::Blue
$Start_Button.FlatAppearance.MouseOverBackColor = [System.Drawing.SystemColors]::GradientActiveCaption
$Start_Button.FlatStyle = [System.Windows.Forms.FlatStyle]::Flat
$Start_Button.Location = (New-Object -TypeName System.Drawing.Point -ArgumentList @([System.Int32]12, [System.Int32]54))
$Start_Button.Name = [System.String]'Start_Button'
$Start_Button.Size = (New-Object -TypeName System.Drawing.Size -ArgumentList @([System.Int32]130, [System.Int32]23))
$Start_Button.TabIndex = [System.Int32]1
$Start_Button.Text = [System.String]'Start Monitoring'
$Start_Button.UseCompatibleTextRendering = $true
$Start_Button.UseVisualStyleBackColor = $false
$Start_Button.add_Click( {Start-RSJob})
#
#Stop_Button
#
$Stop_Button.BackColor = [System.Drawing.SystemColors]::Control
$Stop_Button.FlatAppearance.BorderColor = [System.Drawing.Color]::Blue
$Stop_Button.FlatAppearance.MouseOverBackColor = [System.Drawing.SystemColors]::GradientActiveCaption
$Stop_Button.FlatStyle = [System.Windows.Forms.FlatStyle]::Flat
$Stop_Button.Location = (New-Object -TypeName System.Drawing.Point -ArgumentList @([System.Int32]12, [System.Int32]94))
$Stop_Button.Name = [System.String]'Stop_Button'
$Stop_Button.Size = (New-Object -TypeName System.Drawing.Size -ArgumentList @([System.Int32]130, [System.Int32]23))
$Stop_Button.TabIndex = [System.Int32]2
$Stop_Button.Text = [System.String]'Stop Monitoring'
$Stop_Button.UseCompatibleTextRendering = $true
$Stop_Button.UseVisualStyleBackColor = $false
$Stop_Button.add_MouseClick( { StopMonitoring })
Help greatly appreciated
Thanks
Damian
|
|
|
|
|
Send a "semaphore" file to the folder that the file watcher is watching, telling it to stop.
The Master said, 'Am I indeed possessed of knowledge? I am not knowing. But if a mean person, who appears quite empty-like, ask anything of me, I set it forth from one end to the other, and exhaust it.'
― Confucian Analects
|
|
|
|
|
Thanks for the reply Gerry, unfortunately I have no idea how to do that !
I did however do a bit more digging last night into Runspaces and found a few snippets of information that enabled me to solve the problem.
All I needed to do was to make my runspace variables Global, and then I was able to run :
$rsjob.Dispose()
$runspace.Close()
From my "Stop Monitoring" button
I would of preferred to be able to actually cleanly unregistered the events, rather than killing the Powershell instance, but hay it works
Cheers
|
|
|
|
|
|
I'm new to javascript,asp and css. The webpage was developed in .net vistual studio. The problem is this: I have a page that has a map where I make a circle in a region of it. The behavior the system should have is when I click the circle button, the system should open a form with information from the region where I made the circle. However, when I expand the map, the form is hidden behind the map. Can anyone tell me how I can bring this form forward in the expanded map form? In the attached image, the window behind the map appears in blue.
|
|
|
|
|
This is more about the ASP.Net than the .Net framework. The question you posted is not really clear. Here is what I assume you are saying:
There is a web page with a map in it. A user can draw a circle on the map and then click a button which opens a dialog. When you click somewhere else, the pop up is lost.
If this is correct, you are looking for a modal dialog. There are plenty available on the web which are jQuery and/or bootstrap based. Take a look and choose the one that suits you. This however means that you will not be able to operate the map while pop up is on.
There is still a question of how are you showing the form? Is this a redirect? pop up? something else?
"It is easy to decipher extraterrestrial signals after deciphering Javascript and VB6 themselves.", ISanti[ ^]
|
|
|
|
|
"
When you click somewhere else, the pop up is lost. "
No. Acctly, when I put the map in expanded mode, and make a circle on the map and click the circle button, the window that should appear above the map, it is hidden behind the map. When I exit from expanded mode, the window appears.
In the link below, I take a screenshot of web page screen. In the screenshot, the rectangular blue image is the hidden window behind the map.
UploadDeImagens.com.br - 27155-1.jpg[^]
|
|
|
|
|
I am also interested in this question, I will be glad to hear good advice.
|
|
|
|
|
This is my first project. .Net project is used for me how to create database and design page in mini project.
|
|
|
|
|
|
I need to parse what can potentially be a deep directory tree (Windows User Profile Directory), and populate a TreeView with the files and subdirectories. I have code that "works," but it's a little slow, and it hangs up the form more than I like.
Obviously, it takes a while to parse the profile tree, and I will eventually run that code in a separate thread, but another problem that I'm having is the TreeView displays the root node, collapsed, initially, and expanding that node holds the UI up again, and it takes 5 seconds or so to expand and become responsive again.
Just wondering if anyone could give me some pointers that may optimize the processes?
Thanks.
This is my Form1.cs code. Not much interesting outside of it.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections.Specialized;
namespace Migration_Wizard {
public partial class Form1 : Form {
bool debug_on = true;
public enum LOG_LEVEL {
debug = 0,
info = 1,
warning = 2,
error = 3,
access = 4
}
DirectoryInfo profiles_obj;
StringCollection inaccessible = new StringCollection();
StringCollection momentaries = new StringCollection();
StringCollection copy_failures = new StringCollection();
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
private const int WM_VSCROLL = 277;
private const int SB_PAGEBOTTOM = 7;
internal static void ScrollToBottom(RichTextBox richTextBox) {
SendMessage(richTextBox.Handle, WM_VSCROLL, (IntPtr)SB_PAGEBOTTOM, IntPtr.Zero);
richTextBox.SelectionStart = richTextBox.Text.Length;
}
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
profiles_obj = new DirectoryInfo(@"C:\Users");
DirectoryInfo[] profiles = profiles_obj.GetDirectories();
foreach(DirectoryInfo profile in profiles) {
if(
profile.Name != "All Users" &&
profile.Name != "Default" &&
profile.Name != "Default User" &&
profile.Name != "Public"
) {
profileNameCbx.Items.Add(profile);
}
}
}
private void ProfileNameCbx_SelectedValueChanged(object sender, EventArgs e) {
var profileDir_path = @"C:\Users\" + profileNameCbx.Text;
if (Directory.Exists(profileDir_path)) {
browserTV.Nodes.Clear();
TreeNode root = browserTV.Nodes.Add(profileDir_path, profileNameCbx.Text, 0);
ParseProfile(root);
}
}
public void ParseProfile(TreeNode parent_node) {
DirectoryInfo parent_di = new DirectoryInfo(parent_node.Name);
FileInfo[] files = null;
DirectoryInfo[] subDirs = null;
try {
files = parent_di.GetFiles("*.*").Where(file =>
(file.Attributes & FileAttributes.Hidden) == 0).ToArray();
}
catch(UnauthorizedAccessException e) {
inaccessible.Add(parent_di.FullName);
Log(e.Message, LOG_LEVEL.access);
}
catch (DirectoryNotFoundException e) {
momentaries.Add(parent_di.FullName);
Log(e.Message, LOG_LEVEL.warning);
}
catch (Exception e) {
Log(e.Message, LOG_LEVEL.debug);
}
if(files != null) {
subDirs = parent_di.GetDirectories().Where(directory =>
(directory.Attributes & FileAttributes.Hidden) == 0).ToArray(); ;
foreach(DirectoryInfo dir in subDirs) {
TreeNode this_node = parent_node.Nodes.Add(dir.FullName, dir.Name, 0);
ParseProfile(this_node);
}
foreach (FileInfo f in files) {
parent_node.Nodes.Add(f.FullName, f.Name, 1);
}
}
}
public void Log(string msg, LOG_LEVEL lvl) {
Color orig = consolRTB.SelectionColor;
switch (lvl) {
case LOG_LEVEL.debug:
if (debug_on) {
consolRTB.SelectionColor = Color.FromArgb(225, 226, 239);
}
break;
case LOG_LEVEL.info:
consolRTB.SelectionColor = Color.FromArgb(170,246,131);
break;
case LOG_LEVEL.warning:
consolRTB.SelectionColor = Color.FromArgb(255, 217, 125);
break;
case LOG_LEVEL.error:
consolRTB.SelectionColor = Color.FromArgb(238, 96, 85);
break;
case LOG_LEVEL.access:
consolRTB.SelectionColor = Color.FromArgb(145, 196, 242);
break;
}
consolRTB.AppendText(String.Concat("\n",msg,"\n"));
consolRTB.SelectionColor = orig;
}
private void ConsolRTB_TextChanged(object sender, EventArgs e) {
if (autoscrollChB.Checked) {
ScrollToBottom(consolRTB);
}
}
private void AutoscrollChB_CheckedChanged(object sender, EventArgs e) {
if (autoscrollChB.Checked) {
ScrollToBottom(consolRTB);
}
}
}
}
|
|
|
|
|
GetFiles and GetDirectories return an array containing all files/directories found. The methods can't return until that array has been populated. You should probably try using EnumerateFiles and EnumerateDirectories instead, and try to remove the ToArray calls.
DirectoryInfo.EnumerateFiles Method (System.IO) | Microsoft Docs[^]
DirectoryInfo.EnumerateDirectories Method (System.IO) | Microsoft Docs[^]
You're also going to want to skip "reparse-point" directories, which can have your code running around in circles.
Reparse Points - Windows applications | Microsoft Docs[^]
There's no need to pass *.* as the search pattern; just omit the parameter.
I'd be inclined to avoid the simple LINQ filters, since you're processing a lot of directories.
Try something like this:
public void ParseProfile(TreeNode parent_node, DirectoryInfo parent_di = null)
{
if (parent_di == null) parent_di = new DirectoryInfo(parent_node.Name);
try
{
foreach (DirectoryInfo dir in parent_di.EnumerateDirectories())
{
if ((dir.Attributes & FileAttributes.Hidden) != 0) continue;
if ((dir.Attributes & FileAttributes.ReparsePoint) != 0) continue;
TreeNode this_node = parent_node.Nodes.Add(dir.FullName, dir.Name, 0);
ParseProfile(this_node, dir);
}
foreach (FileInfo file in parent_di.EnumerateFiles())
{
if ((file.Attributes & FileAttributes.Hidden) != 0) continue;
parent_node.Nodes.Add(file.FullName, file.Name, 1);
}
}
catch (UnauthorizedAccessException e)
{
inaccessible.Add(parent_di.FullName);
Log(e.Message, LOG_LEVEL.access);
}
catch (DirectoryNotFoundException e)
{
momentaries.Add(parent_di.FullName);
Log(e.Message, LOG_LEVEL.warning);
}
catch (Exception e)
{
Log(e.Message, LOG_LEVEL.debug);
throw;
}
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
modified 14-Aug-19 4:24am.
|
|
|
|
|
This is definitely better. Thank you. As you say, EnumerateX methods perform much better, and the code is just nicer/cleaner.
Used a separate thread for ParseProfile, and I'm happy with the performance now.
I still have the issue when I expand the root node in the TreeView, but I think the only way I'm going to make that act any better is to populate the treeview as needed when nodes are expanded.
Again, thank you. This is a nice improvement.
modified 14-Aug-19 10:40am.
|
|
|
|
|
Harley Burton wrote: One small typo in the second foreach block if anyone is using this. (file, and f names)
Thanks - I've fixed the typo.
Harley Burton wrote: Used a separate thread for ParseProfile
If you're running it from a background thread, you might need to Invoke the methods that manipulate the tree.
How to: Make thread-safe calls to Windows Forms controls | Microsoft Docs[^]
Eg:
TreeNode this_node = (TreeNode)Invoke((Func<TreeNode, DirectoryInfo, TreeNode>)((p, d) => p.Nodes.Add(d.FullName, d.Name, 0)), parent_node, dir); and:
Invoke((Action<TreeNode, FileInfo>)((p, f) => p.Nodes.Add(f.FullName, f.Name, 1)), parent_node, file);
Harley Burton wrote: I still have the issue when I expand the root node in the TreeView, but I think the only way I'm going to make that act any better is to populate the treeview as needed when nodes are expanded.
I'd agree with that - populate a single level at a time when a directory node is expanded. You'll obviously need to add a "dummy" node to each directory node so that you can expand it.
TreeView.BeforeExpand Event (System.Windows.Forms) | Microsoft Docs[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thanks again. I had already handled everything to get it working as a background thread, but I WAS trying to figure out the best way to populate the treeview as needed. I was headed down the wrong path, and dummy nodes will even allow me to only display the expand element [+] on nodes with children, so that's a bonus.
|
|
|
|
|
I'm using a Visual Studio 2017 Setup project to install a Windows Service.
The Application folder's DefaultLocation is set to "[ProgramFilesFolder][Manufacturer][ProductName]"
The Manufacturer property is set to "My Company". The ProductName property is set to "My Product".
When I run this Installer, it dumps all files into the root of c:. The Manufacturer and Product folders are not created.
Anyone have any idea what's wrong?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
What is a Visual Studio 2017 Setup project?
Are you talking about InstallShield Limited Edition?
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|